傳送門
文章目錄
題意:
思路:
惡心的構(gòu)造題,思路很簡單但是代碼細節(jié)很多,搞了半天。
根據(jù)題目的性質(zhì)不難發(fā)現(xiàn),如果有兩個相同顏色的球相鄰,那么他們的顏色永遠不會改變。
根據(jù)這個性質(zhì),我們將相同顏色的球作為分割點,將其分成若干段,每段都是WBWBWBWBWBWBWBWBWB或者BWBWBWBWBWBWBWBWBW這樣交替來的序列,不難發(fā)現(xiàn)每次操作只會將其兩端的顏色改變,所以直接模擬就好了。注意首端和末端是相連的,還需要特判一下。
還需要注意,如果kkk的次數(shù)不能遍歷完整個序列,由于序列沒有遍歷到的部分也是變化的,所以特判一下kkk的奇偶性,讓后提前改變一下即可。
UPD:
貌似可以直接記錄一下每個位置最少在第幾次操作內(nèi)改變,讓后判斷一下跟kkk的關(guān)系即可。
最后貼了個代碼,比我思路好寫1W1W1W倍。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,k
;
char s
[N
];
char ans
[N
];
bool st
[N
];bool check() {for(int i
=0;i
<n
;i
++) if(st
[i
]) return true;return false;
}int main()
{
cin
>>n
>>k
>>(s
);for(int i
=0;i
<n
;i
++) {if(s
[i
]==s
[(i
-1+n
)%n
]||s
[i
]==s
[(i
+1)%n
]) st
[i
]=true;}if(!check()) {k
%=2;if(k
) {for(int i
=0;i
<n
;i
++) if(s
[i
]=='B') s
[i
]='W'; else s
[i
]='B';}printf("%s\n",s
);} else {int end
=n
-1,begin
=0;while(!st
[begin
]) begin
++; begin
--;while(!st
[end
]) end
--; end
++;if(k
%2==1) {for(int i
=0;i
<=begin
;i
++) if(s
[i
]=='B') s
[i
]='W'; else s
[i
]='B';for(int i
=end
;i
<n
;i
++) if(s
[i
]=='B') s
[i
]='W'; else s
[i
]='B';}int cnt
=begin
+1+n
-end
;begin
+=n
; begin
%=n
; end
%=n
;for(int l
=end
,r
=begin
,t
=k
;cnt
>0&&t
;t
--,cnt
-=2) {char ls
=s
[(l
-1+n
)%n
],rs
=s
[(r
+1)%n
];s
[l
]=ls
; s
[r
]=rs
;l
++; r
--;r
+=n
; r
%=n
; l
%=n
;}end
--; begin
++; end
+=n
; end
%=n
; begin
%=n
;for(int i
=begin
;i
<=end
;i
++) {if(st
[i
]) continue;int l
=i
;int cnt
=0;while(i
<=end
&&!st
[i
]) cnt
++,i
++; i
--;int r
=l
+cnt
-1;if(k
%2==1) {for(int i
=l
;i
<=r
;i
++) if(s
[i
]=='B') s
[i
]='W'; else s
[i
]='B';}for(int t
=k
;t
&&l
<=r
;t
--) {char ls
=s
[(l
-1+n
)%n
],rs
=s
[(r
+1)%n
];s
[l
]=ls
; s
[r
]=rs
;l
++; r
--;}}printf("%s\n",s
);}return 0;
}
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,k
;
char s
[N
];
char ans
[N
];
bool st
[N
];
int op
[N
];
char change
[N
];bool check() {for(int i
=0;i
<n
;i
++) if(st
[i
]) return true;return false;
}int main()
{
cin
>>n
>>k
>>(s
);for(int i
=0;i
<n
;i
++) {if(s
[i
]==s
[(i
-1+n
)%n
]||s
[i
]==s
[(i
+1)%n
]) st
[i
]=true;}if(!check()) {k
%=2;if(k
) {for(int i
=0;i
<n
;i
++) if(s
[i
]=='B') s
[i
]='W'; else s
[i
]='B';}printf("%s\n",s
);} else {memset(op
,0x3f,sizeof(op
));for(int i
=0;i
<n
;i
++) {int cnt
,now
; if(st
[i
]&&!st
[(i
+1)%n
]) {now
=(i
+1)%n
; cnt
=0;while(!st
[now
]) {cnt
++;if(op
[now
]>cnt
) {op
[now
]=cnt
;change
[now
]=s
[i
];}now
++; now
%=n
;}} if(st
[i
]&&!st
[(i
-1+n
)%n
]) {now
=(i
-1+n
)%n
; cnt
=0;while(!st
[now
]) {cnt
++;if(op
[now
]>cnt
) {op
[now
]=cnt
;change
[now
]=s
[i
];}now
--; now
+=n
; now
%=n
;}}}for(int i
=0;i
<n
;i
++) {if(op
[i
]<=k
) {s
[i
]=change
[i
];} else {if(op
[i
]!=INF
&&k
%2==1) {if(s
[i
]=='W') s
[i
]='B';else s
[i
]='W';}}}printf("%s\n",s
);}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #592 (Div. 2) F. Chips 构造 + 细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。