Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)
今天看不下去數(shù)電vp一場div2,搞A搞了很長時間,導(dǎo)致后面沒有時間寫,不過今天補(bǔ)題的時候全是獨立補(bǔ)出來的沒有看題解
vp3題,補(bǔ)3題
A - Kids Seating
最開始想的是與質(zhì)數(shù)有關(guān),亂七八糟搞了半天,結(jié)果最后回頭一想直接按照此代碼輸出即可。
首先我們至少找一個所有數(shù)都有的因子,我想到了2,然后又想某數(shù)不能全是另一個數(shù)的因子,于是發(fā)現(xiàn)對于n來說,選擇n+1→2×nn+1\to 2×nn+1→2×n這n個數(shù)一定滿足上述條件,然后就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
首先把連續(xù)的地雷搞出來,每一個連續(xù)的地雷可以隨著前面連續(xù)的地雷一起引爆,花費連接的代價,或者自己引爆,花費引爆的代價,兩者相比取最小即可。
#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
看著像差分那么就是差分!
構(gòu)造差分?jǐn)?shù)組,然后將原數(shù)組1→k1\to k1→k減一,等價于差分?jǐn)?shù)組d1?1d_1-1d1??1和dk+1+1d_{k+1}+1dk+1?+1,將后面k個數(shù)減一等價于差分?jǐn)?shù)組某位置-1,如果原數(shù)組滿足題意只需讓差分?jǐn)?shù)組全是0,然后隨意搞搞就行了太晚了懶得寫了
注意差分?jǐn)?shù)組的構(gòu)造過程
#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
觀察我們不難發(fā)現(xiàn)我們最多會只需2×105×1052×10^5×10^52×105×105次next_permutation操作,分析不難知道如果n很大,進(jìn)行操作2也只會改變后面14個數(shù),其他前面的數(shù)位置不會改變,于是可以每次暴力讓最后14個數(shù)進(jìn)行next_permutation操作,知道排名求排列數(shù)有一個著名的算法——逆康托展開,然后分塊計算即可。
前幾天逛知乎的時候無意間學(xué)了一下康托展開,這就用上了很高興。
F - Identify the Operations
猜結(jié)論,考慮當(dāng)前數(shù)的兩端的數(shù),如果某數(shù)不存在b數(shù)組中或者在b數(shù)組中的位置小于目前的數(shù)貢獻(xiàn)+1,每次乘積計算貢獻(xiàn)即可。
#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; }總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的手机电脑里安装了吗你的手机电脑里安装
- 下一篇: 原来手机NFC功能用处这么多手机功能nf