日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[POI2015]CZA

發(fā)布時(shí)間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。