Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
感覺E思路明確只用了stl+樹狀數(shù)組,F線段樹復(fù)合修改,為什么都是2400。
A. Life of a Flower
B. Array Eversion
C. Minimize Distance
E. Frequency Queries
F. Non-equal Neighbours
?F : 首先 dp[i][j]=sum[dp[i?1]]?dp[i?1][j]dp[i][j] = sum[dp[i-1]] - dp[i-1][j]dp[i][j]=sum[dp[i?1]]?dp[i?1][j],但這樣是∑i=1na[i]\sum_{i=1}^na[i]∑i=1n?a[i],? 然后線段樹優(yōu)化。
?具體和Transformation HDU - 4578一樣
#include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <map> #include <stack> #include <vector> #include <set> #define mid (l+r>>1) #define lowbit(x) (x&-x) using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 2e5 + 10, mod = 998244353;int val[N<<5], ls[N<<5] ,rs[N<<5], idx = 0, lazy1[N<<5]; bool lazy2[N<<5]; int root;void add_tage(int &u, int l, int r, LL x, bool f) // Transformation HDU - 4578 的簡化版; {if(!u) u = ++idx; if(f) val[u] = 0, lazy1[u] = 0, lazy2[u] = f;if(x) val[u] = (val[u] + x*(r-l+1))%mod, lazy1[u] = (lazy1[u] + x)%mod; } void push_down(int u, int l, int r) {if(!lazy1[u]&&!lazy2[u]) return ;add_tage(ls[u], l, mid, lazy1[u], lazy2[u]);add_tage(rs[u], mid+1, r, lazy1[u], lazy2[u]);lazy1[u] = lazy2[u] = 0; } void push_up(int u){val[u] = (val[ls[u]]+val[rs[u]])%mod;}void modify(int &u, int l, int r, int L, int R, int x, bool f) {if(!u)u = ++idx;if(L <= l&& R >= r)add_tage(u, l, r, x, f);else{push_down(u, l, r);if(L <= mid) modify(ls[u], l, mid, L, R, x, f);if(R > mid) modify(rs[u], mid+1, r, L, R, x, f);push_up(u);} }int main() {int n;scanf("%d", &n);for(int i = 1;i <= 1;i ++) // 額,為了看著好看; {int x;scanf("%d", &x);modify(root, 1, 1e9+1, 1, x, -1, 0); // r = 1e9+1 的原因是 下面的x+1,好像x=1e9有問題吧。 }for(int i = 2;i <= n;i ++){int x;scanf("%d", &x);LL sum = -val[root];modify(root, 1, 1e9+1, 1, x, sum, 0);modify(root, 1, 1e9+1, x+1, 1e9+1, 0, 1);}val[root] = (val[root]+mod)%mod; if(n&1) val[root] = (mod-val[root])%mod; // 這里面正負(fù)不會搞,照著test7和test3 d的; // 具體是n是奇數(shù)的話總和等于-ans,偶數(shù)等于ans,但是另一種正負(fù)要這么寫取模; cout<<val[root]<<endl;return 0; }?E : 簡單stl應(yīng)用 + 離線
#include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <map> #include <stack> #include <vector> #include <set> #define mid (l+r>>1) #define lowbit(x) (x&-x) using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 1e6 + 10, mod = 998244353;int tr[N], a[N], n, q, ans[N], time[N]; set<int> se[N]; vector<pair<int,PII> > Q[N]; vector<int> G[N];void add(int u, int f){while(u <= n)tr[u]+=f,u+=lowbit(u);} int quary(int u){int ans = 0;while(u)ans+=tr[u],u-=lowbit(u);return ans;} void dfs(int u) {if(time[a[u]])se[time[a[u]]].erase(a[u]), add(time[a[u]], -1);time[a[u]] ++;se[time[a[u]]].insert(a[u]); add(time[a[u]], 1);for(auto x:Q[u]){int id = x.first, m = x.second.first, t = x.second.second;int sum = quary(m-1)+t, l = 1, r = n;if(quary(n) < sum){ans[id] = -1; continue;}while(l < r)if(quary(mid)>=sum)r = mid;else l = mid+1;ans[id] = *se[l].begin();}for(auto x:G[u])dfs(x);se[time[a[u]]].erase(a[u]); add(time[a[u]], -1);time[a[u]] --;if(time[a[u]])se[time[a[u]]].insert(a[u]), add(time[a[u]], 1); }int main() {int t;scanf("%d", &t);while(t --){scanf("%d%d", &n, &q);for(int i = 1;i <= n;i ++)scanf("%d", a+i), G[i].clear(), tr[i] = time[i] = 0, se[i].clear(), Q[i].clear();for(int i = 2;i <= n;i ++){int p;scanf("%d", &p);G[p].push_back(i);}for(int i = 1;i <= q;i ++){int v, l, k;scanf("%d%d%d", &v, &l, &k);Q[v].push_back({i, {l, k}});}dfs(1);for(int i = 1;i <= q;i ++)printf("%d ", ans[i]);puts("");}return 0; }?B : 我傻逼了,哎最近比它大的數(shù)的位置直接遍歷就行,我還排個序。。
??SB代碼SB代碼SB代碼
??超簡單代碼超簡單代碼超簡單代碼
#include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <map> #include <stack> #include <vector> #define mid (l + r >> 1) #define lowbit(x) (x & -x) using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 3e5 + 10, mod = 998244353;int a[N];int main() {int t;scanf("%d", &t);while(t --){int n;scanf("%d", &n);for(int i = 1;i <= n;i ++)scanf("%d", a+i);int ans = 0, ma = a[n];for(int i = n-1;i >= 1;i --)if(a[i] > ma){ma = a[i];ans ++;}cout<<ans<<endl;}return 0; }?C : 直接算 + 邊界
#include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <map> #include <stack> #include <vector> #define mid (l + r >> 1) #define lowbit(x) (x & -x) using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 3e5 + 10, mod = 998244353;int a[N];int main() {int t;scanf("%d", &t);while(t --){int n, k;LL ans = 0;scanf("%d%d", &n, &k);for(int i = 1;i <= n;i ++)scanf("%d", a+i);sort(a+1, a+n+1);for(int i = 1;i <= n;ans -= a[i], i += k)if(a[i] > 0)break;for(int i = n;i >= 1;ans += a[i], i -= k)if(a[i] < 0)break;ans = ans*2 - max(-a[1], a[n]);cout<<ans<<endl;}return 0; }?A : 模擬
#include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <map> #include <stack> #include <vector> #define mid (l + r >> 1) #define lowbit(x) (x & -x) using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 3e5 + 10, mod = 998244353;int main() {int t;scanf("%d", &t);while(t --){int n, ans = 1, now = 0;scanf("%d", &n);for(int i = 1;i <= n;i ++){int x;scanf("%d", &x);if(ans == -1)continue;if(x) ans += now == i-1&&now?5:1, now = i;else if(now == i-2)ans = -1;}cout<<ans<<endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫威电影《蜘蛛侠:纵横宇宙》12 月 6
- 下一篇: 网传小米汽车今日将现身工信部申报 外观参