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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

發布時間:2023/12/3 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天看不下去數電vp一場div2,搞A搞了很長時間,導致后面沒有時間寫,不過今天補題的時候全是獨立補出來的沒有看題解
vp3題,補3題

A - Kids Seating

最開始想的是與質數有關,亂七八糟搞了半天,結果最后回頭一想直接按照此代碼輸出即可。

首先我們至少找一個所有數都有的因子,我想到了2,然后又想某數不能全是另一個數的因子,于是發現對于n來說,選擇n+1→2×nn+1\to 2×nn+12×n這n個數一定滿足上述條件,然后就A了

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int main() {IO;int T=1;cin>>T;while(T--){int n;cin>>n;for(int i=2*n;i>n;i--)cout<<2*i<<' ';cout<<'\n';}return 0; }

B - Saving the City

首先把連續的地雷搞出來,每一個連續的地雷可以隨著前面連續的地雷一起引爆,花費連接的代價,或者自己引爆,花費引爆的代價,兩者相比取最小即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int f[N]; int main() {IO;int T=1;cin>>T;while(T--){int a,b;cin>>a>>b;string s;cin>>s;int n=s.size();vector<pair<int,int>> seg;s="0"+s;seg.push_back({0,n+1});for(int i=1;i<=n;i++){if(s[i]=='0') continue;int j=i;while(j<=n&&s[j]=='1') j++;seg.push_back({i,j-1});i=j;}f[1]=a;for(int i=2;i<seg.size();i++){int cnt=seg[i].first-seg[i-1].second-1;f[i]=f[i-1]+min(b*cnt,a);}cout<<f[seg.size()-1]<<'\n';}return 0; }

C - The Delivery Dilemma

二分答案即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int n; int a[N],b[N]; bool check(int x) {ll now=0;for(int i=1;i<=n;i++)if(a[i]>x) now+=b[i];return now<=x; } int main() {IO;int T=1;cin>>T;while(T--){ cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];int l=0,r=1e9+1;while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}cout<<l<<'\n';}return 0; }

D - Extreme Subtraction

看著像差分那么就是差分!

構造差分數組,然后將原數組1→k1\to k1k減一,等價于差分數組d1?1d_1-1d1??1dk+1+1d_{k+1}+1dk+1?+1,將后面k個數減一等價于差分數組某位置-1,如果原數組滿足題意只需讓差分數組全是0,然后隨意搞搞就行了太晚了懶得寫了

注意差分數組的構造過程

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=300010; const ll mod=1e9+7; int a[N],d[N]; int main() {IO;int T=1;cin>>T;while(T--){int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) d[i]=a[i]-a[i-1];ll cnt=0;for(int i=2;i<=n;i++)if(d[i]<0) cnt-=d[i];if(cnt>d[1]) cout<<"NO\n";else cout<<"YES\n";}return 0; }

E - Long Permutation

這題能夠想到非常高興

13!=622702080013!=622702080013!=6227020800
14!=8717829120014!=8717829120014!=87178291200
觀察我們不難發現我們最多會只需2×105×1052×10^5×10^52×105×105次next_permutation操作,分析不難知道如果n很大,進行操作2也只會改變后面14個數,其他前面的數位置不會改變,于是可以每次暴力讓最后14個數進行next_permutation操作,知道排名求排列數有一個著名的算法——逆康托展開,然后分塊計算即可。
前幾天逛知乎的時候無意間學了一下康托展開,這就用上了很高興。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; const ll mod=998244353; ll fact[20]; int P[20],A[20]; ll a[N],s[N]; void calc(int n,ll x) {vector<int> rest(n,0);iota(rest.begin(), rest.end(), 1);memset(P,0,sizeof P);memset(A,0,sizeof A);for (int i = 1; i <= n; ++i){A[i]=x/fact[n-i];x%=fact[n-i];}for (int i = 1; i <= n; ++i){P[i]=rest[A[i]];rest.erase(lower_bound(rest.begin(), rest.end(), P[i]));} } int main() {IO;int T=1;//cin>>T;while(T--){int n,q;cin>>n>>q;fact[0]=1;for(int i=1;i<=14;i++) fact[i]=i*fact[i-1];for(int i=1;i<=n;i++) a[i]=i,s[i]=s[i-1]+a[i];ll now=0;if(n<=14){while(q--){int op;cin>>op;if(op==1){int l,r;cin>>l>>r;ll res=0;calc(n,now);for(int i=l;i<=r;i++) res+=P[i];cout<<res<<'\n';}else{int x;cin>>x;now+=x;}}}else{while(q--){int op;cin>>op;if(op==1){int l,r;cin>>l>>r;ll res=0;calc(14,now);int bd=n-14;if(r<=bd) res+=s[r]-s[l-1];else if(l>bd){for(int i=l;i<=r;i++) res+=P[i-bd]+bd;}else{res+=s[bd]-s[l-1];for(int i=bd+1;i<=r;i++) res+=P[i-bd]+bd;}cout<<res<<'\n';}else{int x;cin>>x;now+=x;}}}}return 0; }

F - Identify the Operations

猜結論,考慮當前數的兩端的數,如果某數不存在b數組中或者在b數組中的位置小于目前的數貢獻+1,每次乘積計算貢獻即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; const ll mod=998244353; int n,k; int a[N],b[N]; int pos[N]; int st[N]; int main() {IO;int T=1;cin>>T;while(T--){cin>>n>>k;for(int i=1;i<=n;i++) pos[i]=st[i]=0;for(int i=1;i<=n;i++) {cin>>a[i];pos[a[i]]=i;}for(int i=1;i<=k;i++) {cin>>b[i];st[b[i]]=i;}ll res=1;for(int i=1;i<=k;i++){int p=pos[b[i]];int now=0;if(p>1&&st[a[p-1]]<i) now++;if(p<n&&st[a[p+1]]<i) now++;res=res*now%mod;}cout<<res<<'\n';}return 0; }

總結

以上是生活随笔為你收集整理的Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。