codeforces590a//Median Smoothing//Codeforces Round #327 (Div. 1)
题意:一个数组,一次操作为:除首尾不变,其它的=它与前后数字的中位数,这样对数组重复几次后数组会稳定不变。问要操作几次,及最后的稳定数组。
挺难的题,参考了别人的代码和思路。总的来说就是找01010,010101这样的,分别变为00000,000111。不知道谁发现的将它和异或联系起来。比如对010101异或前一个元素为011111(记为数组b),数组b中连续的1全置0,如果是奇数那么连续的1的中间置1.结果是000100(数组c)。再对数组c(除第一个元素)异或前一个元素,得到000111就是结果。
乱码:
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> #include <ctime> using namespace std; const int SZ=1000010,INF=0x7FFFFFFF; int b[SZ]; int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); //for(;scanf("%d",&n)!=EOF;) { int n; cin>>n; vector<int> vct; for(int i=0;i<n;++i) { int tmp; cin>>tmp; vct.push_back(tmp); } for(int i=1;i<n;++i) { b[i]=vct[i]^vct[i-1]; } int res=0; for(int i=1;i<n;) { int cur=0; int j=i; for(;j<n;++j) { if(b[j]==1)++cur; else break; } res=max(res,(cur)/2); //cout<<"i: "<<i<<" "<<j<<endl; for(int k=i;k<j;++k) { b[k]=0; } if((j-i)&1) { b[i+(j-i)/2]=1; } i=j+1; } cout<<res<<endl; int cur=vct[0]; cout<<vct[0]; for(int i=1;i<n;++i) { //cout<<b[i]<<endl; cout<<" "; cout<<(cur^b[i]); cur^=b[i]; } cout<<endl; } return 0; }
浙公网安备 33010602011771号