日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #760 (Div. 3)

發(fā)布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #760 (Div. 3) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

E. Singers’ Tour
F. Reverse
G. Trader Problem


?推推式子就行了。

int a[N]; int main() {int t;scanf("%d", &t);while(t --){int n;LL sum = 0;scanf("%d", &n);for(int i = 1;i <= n;i ++) scanf("%d", a+i), sum += a[i];a[0] = a[n];if(sum%(n*(n+1)/2)){puts("NO");continue;}sum /= n*(n+1)/2;for(int i = n;i >=1;i --){if((sum-a[i]+a[i-1])%n || sum-a[i]+a[i-1]<=0){puts("NO");a[1] = 0;break;}a[i] = (sum-a[i]+a[i-1])/n;} if(a[1]){puts("YES");for(int i = 1;i <= n;i ++)cout<<a[i]<<' ';cout<<endl;}}return 0; }

?爆搜, 寫的很煩。

LL x, y; string a, b; map<string, bool>ma; bool flag = 0; string fan(string c) // 取反 {string a = c;while(a.back() == '0') a.pop_back();reverse(a.begin(), a.end());return a; }void inverse(LL x, string &a) // 轉(zhuǎn)換成二進(jìn)制字符串 {while(x)a += (char)('0'+(x&1)), x>>=1;reverse(a.begin(), a.end());return ; }void dfs(string a) {if((a.size() > b.size() && a.back() == '1') || ma[a]) return ; if(a.size() == b.size()) flag |= a == b|fan(a) == b;ma[a] = 1; if(a.back() == '0')dfs(fan(a+'1')), dfs(fan(a));else {ma[fan(a)] = 1;dfs('1'+a); dfs(a+'1');}return ; }int main() { scanf("%lld%lld", &x, &y);inverse(x, a); inverse(y, b);dfs(a);puts(flag ? "YES" : "NO");return 0; }

?首先肯定要離線,然后還得把n+m個數(shù)排個序,那么就可以看作是一系列的連通塊,連通塊可以合并的條件是左邊的最大值+k >= 右邊的最小值,那么這就說明假設(shè)兩個連通塊內(nèi)原本有a個數(shù)是n個數(shù)中的(a < n), 那么就可以從這兩個連通塊的范圍內(nèi)取最大的a個數(shù)。
?寫起來也有點繞,原本想直接set,但是太難寫了,然后就改成了優(yōu)先隊列,但發(fā)現(xiàn)優(yōu)先隊列不能刪除,如果要標(biāo)記的話就要每個連通塊的范圍,但這樣又想到了可以直接模擬,就直接模擬了,代碼有注釋


#include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <cmath> #include <map> #include <queue> #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 = 2e6+10, mod = 998244353; void mull(int &a, LL b){a = a*b%mod;return ;} void add(int &a, LL b){a = (a+b)%mod;return ;}pair<int,bool> a[N]; // a 存的是n+m個數(shù) ,second代表的是 是否屬于n個數(shù)中。 PII Q[N], b[N]; // q 是離線化的詢問,答案存在an[]中,b是每個連通塊和右邊相鄰的連通塊的差值。 LL x[N], an[N]; // x[]和y[]是方便計算區(qū)間答案的前綴和,x[]是a[].first的前綴和,y[]是a[].second的前綴和。 int y[N], l[N], r[N], idx = 1; // l[],r[] 是連通塊的做右端點. LL quary(int l, int r){return x[r]-x[r-y[r]+y[l-1]];} // 計算l,r 的答案 y[r] - y[l-1] 是可以選擇的數(shù)量int main() { int n, m, q;LL ans = 0;scanf("%d%d%d", &n, &m, &q);m += n;for(int i = 1;i <= m;i ++){scanf("%d", &a[i].first);a[i].second = i <= n;}for(int i = 1;i <= q;i ++){scanf("%d", &Q[i].first);Q[i].second = i;}sort(a+1, a+m+1); a[m+1] = {2e9+1, 0}; // 加個數(shù)方便最后不用判斷是否變成了一個整體. sort(Q+1, Q+q+1);for(int i = 1;i <= m;i ++){x[i] = a[i].first + x[i-1]; // 前綴和 y[i] = a[i].second + y[i-1]; // 前綴和 b[i] = {a[i+1].first-a[i].first, i}; // 連通塊的差值, l[i] = r[i] = i; // 初始每個數(shù)都是一個連通塊 ans += a[i].second ? a[i].first : 0 ;// 初始ans }sort(b+1, b+m+1); // 按照差值排序 for(int i = 1;i <= q;i ++){int k = Q[i].first, id = Q[i].second; while(b[idx].first <= k){int R = b[idx].second, L = l[R], t = r[R+1]; // L,R是可合并的左邊的連通塊的左右端點,R+1,t 是可合并的右邊連通塊的左右端點。 ans -= quary(L, R) + quary(R+1, t) - quary(L, t); l[t] = L; // 把這兩個區(qū)間和并. r[L] = t;++ idx;}an[id] = ans;} // 不至于吧,差了500多ms。for(int i = 1;i <= q;i ++) cout<<an[i]<<endl; for(int i = 1;i <= q;i ++) printf("%lld\n", an[i]);return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Codeforces Round #760 (Div. 3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。