[POI2015]CZA
生活随笔
收集整理的這篇文章主要介紹了
[POI2015]CZA
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
[POI2015]CZA?
p很小,討論
p=0。。。
p=1。。。
p=2:n-1放左或者放右兩種情況,剩下怎么放是固定的,模擬然后判斷即可
p=3:
正著做要狀壓,類似放書和排座位那些題,考慮以某個(gè)順序加入元素,不斷擴(kuò)充出整個(gè)環(huán)
不妨從n開始往下加,其實(shí)只用考慮i,i-1,i-2和要放的i-3的關(guān)系。i-3只能放在這三個(gè)的兩個(gè)的中間,
所以這中間不能再有之前的i+1,i+2這種了。
而且區(qū)分左右還要記錄順逆
f[i][0/1][2^3]前i個(gè),順逆,相鄰能不能放(是否緊相鄰)
然后枚舉放哪里轉(zhuǎn)移,之后i會(huì)固定,看會(huì)不會(huì)和i-1,i-2,i-3沖突
?
轉(zhuǎn)移時(shí)候大力分類討論
// luogu-judger-enable-o2 #include<bits/stdc++.h> #define reg register int #define il inline #define numb (ch^'0') using namespace std; typedef long long ll; il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x); } namespace Miracle{ const int N=1000000+5; const int mod=1e9+7; int n,k,p; int no[N][7];//0:-3; 1:-2 ; 2:-1 ; 3:0 ; 4:1 ; 5:2 ; 6:3 int add(int x,int y){return x+y>=mod?x+y-mod:x+y; } void sol0(){if(n==1) puts("1");else puts("0"); } void sol1(){if(n==1||(n==2&&k==0)) puts("1");else puts("0"); } int a[N]; void sol2(){if(n<=2){if(n==1||(n==2&&k==0)) puts("1");else puts("0");return;}int ans=0;a[1]=n;for(reg x=n-1,i=2;x>0;++i,x-=3) a[i]=x;for(reg x=n-2,i=n;x>0;--i,x-=2) a[i]=x;bool fl=true;for(reg i=1;i<n;++i){if(no[a[i]][a[i+1]-a[i]+3]) fl=false;}if(no[a[n]][a[1]-a[n]+3]) fl=false;if(fl) ++ans;a[1]=n;for(reg x=n-2,i=2;x>0;++i,x-=2) a[i]=x;for(reg x=n-1,i=n;x>0;--i,x-=2) a[i]=x;fl=true;for(reg i=1;i<n;++i){if(no[a[i]][a[i+1]-a[i]+3]) fl=false;}if(no[a[n]][a[1]-a[n]+3]) fl=false;if(fl) ++ans;printf("%d",ans); } int f[N][2][8]; int dis(int x,int y){return y-x+3; } int mk(int s1,int s2,int s3){return s3*4+s2*2+s1; } void calc(int i,int j,int s){//add i-1int now=f[i][j][s];int s1=s&1,s2=(s>>1)&1,s3=(s>>2)&1;if(i!=2){if(j==0){//shunif(s1){if(s3){if(no[i][dis(i,i+2)]==0&&no[i+2][dis(i+2,i-1)]==0) f[i-1][j][mk(s2,0,1)]=add(f[i-1][j][mk(s2,0,1)],now);}else{if(no[i+2][dis(i+2,i-1)]==0) f[i-1][j][mk(s2,0,1)]=add(f[i-1][j][mk(s2,0,1)],now);}}if(s2){if((s1==0||no[i+2][dis(i+2,i+1)]==0)&&(s3==0||no[i][dis(i,i+2)]==0)) f[i-1][j^1][mk(0,1,1)]=add(f[i-1][j^1][mk(0,1,1)],now);}if(s3){if((s1==0||no[i+2][dis(i+2,i+1)]==0)&&(no[i-1][dis(i-1,i+2)]==0)) f[i-1][j][mk(s2,1,0)]=add(f[i-1][j][mk(s2,1,0)],now);}}else{//j==1if(s1){if(s3){if(no[i+2][dis(i+2,i)]==0&&no[i-1][dis(i-1,i+2)]==0) f[i-1][j][mk(s2,0,1)]=add(f[i-1][j][mk(s2,0,1)],now);}else{if(no[i-1][dis(i-1,i+2)]==0) f[i-1][j][mk(s2,0,1)]=add(f[i-1][j][mk(s2,0,1)],now);}}if(s2){if((s1==0||no[i+1][dis(i+1,i+2)]==0)&&(s3==0||no[i+2][dis(i+2,i)]==0)) f[i-1][j^1][mk(0,1,1)]=add(f[i-1][j^1][mk(0,1,1)],now);}if(s3){if((s1==0||no[i+1][dis(i+1,i+2)]==0)&&(no[i+2][dis(i+2,i-1)]==0)) f[i-1][j][mk(s2,1,0)]=add(f[i-1][j][mk(s2,1,0)],now);}}}else{//las if(j==0){if(s1){if((s3==0||no[i][dis(i,i+2)]==0)&&(no[i+2][dis(i+2,i-1)]==0)&&(no[i-1][dis(i-1,i+1)]==0)&&(s2==0||no[i+1][dis(i+1,i)]==0)){f[i-1][j][mk(0,0,0)]=add(f[i-1][j][mk(0,0,0)],now);}}if(s2){if((s3==0||no[i][dis(i,i+2)]==0)&&(s1==0||no[i+2][dis(i+2,i+1)]==0)&&(no[i+1][dis(i+1,i-1)]==0&&no[i-1][dis(i-1,i)]==0)){f[i-1][j^1][mk(0,0,0)]=add(f[i-1][j^1][mk(0,0,0)],now);}}if(s3){if((s1==0||no[i+2][dis(i+2,i+1)]==0)&&(s2==0||no[i+1][dis(i+1,i)]==0)&&(no[i][dis(i,i-1)]==0&&no[i-1][dis(i-1,i+2)]==0)){f[i-1][j][mk(0,0,0)]=add(f[i-1][j][mk(0,0,0)],now);}}}else{if(s1){if((s3==0||no[i+2][dis(i+2,i)]==0)&&(no[i-1][dis(i-1,i+2)]==0)&&(no[i+1][dis(i+1,i-1)]==0)&&(s2==0||no[i][dis(i,i+1)]==0)){f[i-1][j][mk(0,0,0)]=add(f[i-1][j][mk(0,0,0)],now);}}if(s2){if((s3==0||no[i+2][dis(i+2,i)]==0)&&(s1==0||no[i+1][dis(i+1,i+2)]==0)&&(no[i-1][dis(i-1,i+1)]==0&&no[i][dis(i,i-1)]==0)){f[i-1][j^1][mk(0,0,0)]=add(f[i-1][j^1][mk(0,0,0)],now);}}if(s3){if((s1==0||no[i+1][dis(i+1,i+2)]==0)&&(s2==0||no[i][dis(i,i+1)]==0)&&(no[i-1][dis(i-1,i)]==0&&no[i+2][dis(i+2,i-1)]==0)){f[i-1][j][mk(0,0,0)]=add(f[i-1][j][mk(0,0,0)],now);}}}} } void sol3(){if(n<=2){if(n==1||(n==2&&k==0)) puts("1");else puts("0");return;}if(n==3){int ans=0;if(no[n][dis(n,n-1)]==0&&no[n-1][dis(n-1,n-2)]==0&&no[n-2][dis(n-2,n)]==0) ++ans;if(no[n][dis(n,n-2)]==0&&no[n-2][dis(n-2,n-1)]==0&&no[n-1][dis(n-1,n)]==0) ++ans;printf("%d",ans);return ;}f[n-2][1][7]=1;f[n-2][0][7]=1;for(reg i=n-2;i>=2;--i){for(reg s=0;s<8;++s){if(f[i][0][s]) calc(i,0,s);if(f[i][1][s]) calc(i,1,s);}}int ans=0;for(reg s=0;s<8;++s){ans=add(ans,add(f[1][0][s],f[1][1][s]));}printf("%d",ans); } int main(){rd(n);rd(k);rd(p);int x,y;for(reg i=1;i<=k;++i){rd(x);rd(y);if(abs(x-y)<=p){no[x][y-x+3]=1;}}if(p==0) sol0();else if(p==1) sol1();else if(p==2) sol2();else sol3();return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle*Date: 2019/3/3 10:02:45 */?
轉(zhuǎn)載于:https://www.cnblogs.com/Miracevin/p/10483445.html
總結(jié)
以上是生活随笔為你收集整理的[POI2015]CZA的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通信导论-网络基础
- 下一篇: 应用的生命周期各个程序运行状态时代理的回