Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造
傳送門
題意: 給你一個(gè)n×mn×mn×m的矩陣,其中包含字符′.′'.'′.′和′X′'X'′X′,你可以將任何′.′'.'′.′改成′X′'X'′X′,現(xiàn)在問你能否通過修改一些′.′'.'′.′來(lái)使′X′'X'′X′聯(lián)通且不存在環(huán)。保證原本的′X′'X'′X′沒有任何兩個(gè)相鄰。
思路: 既然我把最后一句話加粗了,那就肯定有用啦。 由于初始狀態(tài)不會(huì)有任何兩個(gè)相鄰的,那么我們考慮一個(gè)mmm列的矩陣,先不需要考慮行,如果我從第一列開始,將這一列全部改成′X′'X'′X′,讓后相鄰兩列間隔是兩列,如下圖:
因?yàn)轭}目保證了沒有兩個(gè)相鄰,所以保證了第一列和第四列是不連通的,讓后我們從中間兩列找一行存在′X′'X'′X′的一行(都沒有′X′'X'′X′就任取一行),把這行的兩個(gè)格子全部都改成′X′'X'′X′即可,這樣兩邊就聯(lián)通了。當(dāng)然這樣只適合mmod3=1m\bmod 3=1mmod3=1和mmod3=2m\bmod 3=2mmod3=2的情況,對(duì)于mmod3=0m\bmod 3=0mmod3=0的情況,我們發(fā)現(xiàn)后面會(huì)多出來(lái)兩列,所以我們只需要將原來(lái)1,4,7,..1,4,7,..1,4,7,..的位置改成2,5,8,...2,5,8,...2,5,8,...即可。
對(duì)于mmod3=2m\bmod3=2mmod3=2的情況,兩種取法都可。
復(fù)雜度O(nm)O(nm)O(nm)
//#pragma GCC optimize(2) #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> #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;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=510,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int n,m; char s[N][N];int main() { // ios::sync_with_stdio(false); // cin.tie(0);int _; scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",s[i]+1);if(m%3==0||m%3==2){for(int i=2;i<=m;i+=3){for(int j=1;j<=n;j++) s[j][i]='X';if(i>2){int id=1;for(int j=1;j<=n;j++) if(s[j][i-1]=='X'||s[j][i-2]=='X') id=j;s[id][i-1]=s[id][i-2]='X';}}}else{for(int i=1;i<=m;i+=3){for(int j=1;j<=n;j++) s[j][i]='X';if(i>1){int id=1;for(int j=1;j<=n;j++) if(s[j][i-1]=='X'||s[j][i-2]=='X') id=j;s[id][i-1]=s[id][i-2]='X';}}}for(int i=1;i<=n;i++) printf("%s\n",s[i]+1);}return 0; } /**/總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU - 6071 Lazy Run
- 下一篇: 焦米粥的功效与作用、禁忌和食用方法