Codeforces Round #669 (Div. 2)
那天晚上和同學打球打的有點晚,結果就鴿了,現在來補一下
A - Ahahahahahahahaha
直接看原數組中0的個數cnt0和1的個數cnt1,誰多留誰即可,注意留1的時候要留偶數個。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=1010; int a[N]; int n; int main() {IO;int T=1;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int cnt0=0,cnt1=0;for(int i=1;i<=n;i++){if(a[i]) cnt1++;else cnt0++;}if(cnt1<=n/2){cout<<cnt0<<'\n';for(int i=1;i<=cnt0;i++) cout<<0<<' ';cout<<'\n';}else{if(cnt1&1) cnt1--;cout<<cnt1<<'\n';for(int i=1;i<=cnt1;i++) cout<<1<<' ';cout<<'\n';}}return 0; }B - Big Vova
直接暴力,從第一位開始每次選一個目前使c[i]最大的數即可,維護d使之為d=gcd(b1,b2…bi)d=gcd(b_1,b_2\dots b_i)d=gcd(b1?,b2?…bi?)
時間復雜度O(n2logn)O(n^2logn)O(n2logn)
C - Chocolate Bunny
交互題,第一次做什么東西啊
每次選擇沒有確定的兩個位置i,j,詢問i、j和j、i。分析可知這樣一定能確定一個位置的數。總詢問次數為2n?22n-22n?2次,即可原序列。
如果ai>aja_i>a_jai?>aj?,已知ai%aj=xa_i \%a_j= xai?%aj?=x和aj%ai=ya_j \%a_i= yaj?%ai?=y,分析可知a[j]=ya[j]=ya[j]=y即確定了一個位置的數。
如果ai<aja_i<a_jai?<aj?,已知ai%aj=xa_i \%a_j= xai?%aj?=x和aj%ai=ya_j \%a_i= yaj?%ai?=y,分析可知a[i]=xa[i]=xa[i]=x也能能夠確定一個位置的數。
D - Discrete Centrifugal Jumps
f[i]=min(f[i],f[k]+1)f[i]=min(f[i],f[k]+1)f[i]=min(f[i],f[k]+1) 對于h[k+1…i?1]h[k+1\dots i-1]h[k+1…i?1]滿足題目條件即可
// O(n^2) #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=300010; int h[N],n; int f[N]; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>h[i];memset(f,0x3f,sizeof f);f[1]=0;for(int i=1;i<=n;i++){int maxh=0,minh=0x3f3f3f3f;for(int j=i-1;j;j--){if(minh>max(h[i],h[j])||maxh<min(h[i],h[j]))f[i]=min(f[i],f[j]+1);minh=min(minh,h[j]);maxh=max(maxh,h[j]);}}cout<<f[n]<<endl;}return 0; }嘗試采用單調棧維護一個單調序列不妨先考慮一種情況即max(hi+1,…,hj?1)<min(hi,hj)max(h_{i+1},…,h_{j?1})<min(h_i,h_j)max(hi+1?,…,hj?1?)<min(hi?,hj?),維護嚴格單調上升的序列,對于第iii個山峰考慮合法轉移:對于單調棧中的元素如果第一個大于hih_ihi?中的下標是pospospos那么f[pos?1]…f[tt]f[pos-1]\dots f[tt]f[pos?1]…f[tt]都可以更新f[i]f[i]f[i],在維護有序棧的同時更新不斷更新答案即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N=300010; int h[N],n; int q1[N],tt1; int q2[N],tt2; int f[N]; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>h[i];q1[++tt1]=1,q2[++tt2]=1;for(int i=2;i<=n;i++){f[i]=f[i-1]+1;while(tt1&&h[q1[tt1]]>h[i])f[i]=min(f[q1[tt1--]]+1,f[i]);if(tt1) f[i]=min(f[q1[tt1]]+1,f[i]);while(tt1&&h[q1[tt1]]==h[i]) tt1--;q1[++tt1]=i;while(tt2&&h[q2[tt2]]<h[i])f[i]=min(f[q2[tt2--]]+1,f[i]);if(tt2) f[i]=min(f[q2[tt2]]+1,f[i]);while(tt2&&h[q2[tt2]]==h[i]) tt2--;q2[++tt2]=i;}cout<<f[n]<<'\n';}return 0; }要加油哦~
總結
以上是生活随笔為你收集整理的Codeforces Round #669 (Div. 2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总是启动一半又自动重启开机启动一半又自动
- 下一篇: 牛客练习赛 69