說在前面:強烈譴責AK神Mr_zkt沒有絲毫素質RP--ide
然而我也想沒素質一次,可是我沒機會AK一套除了B組題之外的題。。。優化
太菜了,沒權力。人家AK了人家就是牛逼你沒話說spa
達哥的題必須好好寫反思。code
達哥的題令我恐懼。blog
以前考的全部達哥的題都不是很難,甚至有AK的,只有我每逢達哥就爆炸。炸得特別慘。get
因此今天看到考試標題lrd day1時我就絕望了。hash
可是此次的題的確仍是比較簡單,前兩題56分鐘足以解決。it
而後T3被我僞證了,我覺得最多每一個點周圍只有兩個聯通塊。io
而後打出來了,128分鐘的時候,我以爲我AK了。event
可是吸收我此次沒有太飄,打對拍。
可是說是在的,效率很低。
而後10分鐘拍上T1。
而後T2的暴力死活調不出來,調了45分鐘左右才弄出來。
然而其實大樣例不水(是最大的一檔數據)其實不那麼須要對拍。
而後T3的對拍打了一半,發現還有5分鐘,就算拍出來了也來不及改了,就掛機了。
然而T3的下發數據很水致使個人僞證沒有被hack,而對拍一會就出來了。
考試結束。
總算沒有又一次在達哥手下死無全屍。
當有大樣例時優先拍大樣例比較水的題。
在三道題都打完以後仍然要保持較高的效率打對拍。
話說今天這麼簡單的話明天的題是否是要跪啊。。。
T1:位運算
大規模手動分類討論。
1 #include<cstdio> 2 int pre[2][2][2]; 3 int main(){//freopen("ex_bit.in","r",stdin); 4 pre[0][0][0]=1; 5 pre[0][1][1]=2; 6 pre[1][1][0]=1; 7 int t,XOR,OR,AND;long long ans=1;scanf("%d",&t); 8 while(t--){ 9 scanf("%d%d%d",&AND,&OR,&XOR);ans=1; 10 if(AND!=-1&&OR==-1&&XOR==-1){puts("inf");} 11 if(AND==-1&&OR!=-1&&XOR==-1){for(int i=0;i<30;++i)if(OR&1<<i)ans*=3;printf("%lld\n",ans);} 12 if(AND==-1&&OR==-1&&XOR!=-1){puts("inf");} 13 if(AND!=-1&&OR!=-1&&XOR==-1){ 14 for(int i=0;i<30;++i)if((OR&1<<i)==0&&(AND&1<<i)!=0)ans*=0; 15 else if((OR&1<<i)!=0&&(AND&1<<i)==0)ans*=2; 16 printf("%lld\n",ans); 17 } 18 if(AND!=-1&&OR==-1&&XOR!=-1){ 19 for(int i=0;i<30;++i)if((XOR&1<<i)!=0&&(AND&1<<i)!=0)ans*=0; 20 else if((XOR&1<<i)!=0&&(AND&1<<i)==0)ans*=2; 21 printf("%lld\n",ans); 22 } 23 if(AND==-1&&OR!=-1&&XOR!=-1){ 24 for(int i=0;i<30;++i)if((XOR&1<<i)!=0&&(OR&1<<i)==0)ans*=0; 25 else if((XOR&1<<i)!=0&&(OR&1<<i)!=0)ans*=2; 26 printf("%lld\n",ans); 27 } 28 if(AND!=-1&&OR!=-1&&XOR!=-1){ 29 for(int i=0;i<30;++i)ans*=pre[(AND&1<<i)>0][(OR&1<<i)>0][(XOR&1<<i)>0]; 30 printf("%lld\n",ans); 31 } 32 } 33 }
T2:集合論
套路題。對於加減法開一個全局的標記,而後套一個哈希表就行。
開一個時間戳,求交集的時候更新一下時間戳,這樣,時間戳沒有被更新的就至關於被刪除了。
1 #include<cstdio> 2 struct hash_map{ 3 #define S 20000005 4 int fir[S],l[S],to[S],w[S],c; 5 int &operator[](int x){int r=(x+S)%S; 6 for(int i=fir[r];i;i=l[i])if(to[i]==x)return w[i]; 7 l[++c]=fir[r];fir[r]=c;to[c]=x;return w[c]; 8 } 9 }M; 10 char xch,xB[1<<15],*xS=xB,*xTT=xB; 11 #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++) 12 inline int read() 13 { 14 int x=0,f=1;char ch=getc(); 15 while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();} 16 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();} 17 return x*f; 18 } 19 int main(){//freopen("ex_jihe5.in","r",stdin);freopen("t2.out","w",stdout); 20 int m=read(),lz=0,sz=0,cnt=1;long long tot=0; 21 while(m--){ 22 int opt=read(); 23 if(opt==1){ 24 int x=read(),p; 25 while(x--){ 26 p=read(); 27 if(M[p-lz]!=cnt)M[p-lz]=cnt,sz++,tot+=p; 28 } 29 }else if(opt==2){ 30 int x=read(),p;sz=tot=0;cnt++; 31 while(x--){ 32 p=read(); 33 if(M[p-lz]==cnt-1)M[p-lz]=cnt,sz++,tot+=p; 34 } 35 }else if(opt==3)tot+=sz,lz++; 36 else tot-=sz,lz--; 37 printf("%lld\n",tot); 38 } 39 }
T3:連連看
寫的稍工業。
map跑的比哈希表塊。
要統計點對,那麼就是維護以前掃過的全部塊裏面和當前塊的相鄰空塊徹底同樣的,且顏色也同樣的個數。
兩個點可能會出現有4個相鄰空塊都相同的狀況。
盜達哥的圖2333
因此考慮容斥。奇加偶減。
把每個點的相鄰空塊都拆開,寫成全部子集的形式。
掃一邊,對於每個位置查一下加一下。
最後統計一下直接相鄰的同顏色的貢獻。
注意它貢獻答案的前提是二者再也不任何一個相同的空塊裏。
碼很長,寫傻逼了。(子集枚舉能夠寫成狀壓的,我是手動討論16種狀況。。。)
1 #include<cstdio> 2 #include<map> 3 using namespace std; 4 struct P{ 5 int bl1,bl2,bl3,bl4,col; 6 friend bool operator<(P a,P b){ 7 if(a.col!=b.col)return a.col<b.col; 8 if(a.bl1!=b.bl1)return a.bl1<b.bl1; 9 if(a.bl2!=b.bl2)return a.bl2<b.bl2; 10 if(a.bl3!=b.bl3)return a.bl3<b.bl3; 11 return a.bl4<b.bl4; 12 } 13 }; 14 map<P,int>M; 15 char xch,xB[1<<15],*xS=xB,*xTT=xB; 16 #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++) 17 inline int read() 18 { 19 int x=0,f=1;char ch=getc(); 20 while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();} 21 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();} 22 return x*f; 23 } 24 int co[1005][1005],n,k,m,al[1005][1005],tim,bl[5][1005][1005]; 25 const int ax[4]={0,0,1,-1},ay[4]={1,-1,0,0}; 26 #define tx x+ax[i] 27 #define ty y+ay[i] 28 void bfs(int x,int y){ 29 al[x][y]=tim; 30 if(co[x][y]){ 31 if(!bl[1][x][y])bl[1][x][y]=tim; 32 else if(!bl[2][x][y])bl[2][x][y]=tim; 33 else if(!bl[3][x][y])bl[3][x][y]=tim; 34 else bl[4][x][y]=tim; 35 return; 36 } 37 for(int i=0;i<=3;++i)if(tx>0&&ty>0&&tx<=n&&ty<=m&&al[tx][ty]!=tim)bfs(tx,ty); 38 } 39 int main(){//freopen("ex_link5.in","r",stdin); 40 n=read();m=read();k=read();long long ans=0; 41 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)co[i][j]=read(); 42 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]==0&&al[i][j]==0)tim++,bfs(i,j); 43 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]){ 44 if(bl[1][i][j]) 45 ans+=M[(P){bl[1][i][j],0,0,0,co[i][j]}],M[(P){bl[1][i][j],0,0,0,co[i][j]}]++; 46 if(bl[2][i][j]) 47 ans+=M[(P){bl[2][i][j],0,0,0,co[i][j]}],M[(P){bl[2][i][j],0,0,0,co[i][j]}]++, 48 ans-=M[(P){bl[1][i][j],bl[2][i][j],0,0,co[i][j]}],M[(P){bl[1][i][j],bl[2][i][j],0,0,co[i][j]}]++; 49 if(bl[3][i][j]) 50 ans+=M[(P){bl[3][i][j],0,0,0,co[i][j]}],M[(P){bl[3][i][j],0,0,0,co[i][j]}]++, 51 ans-=M[(P){bl[1][i][j],bl[3][i][j],0,0,co[i][j]}],M[(P){bl[1][i][j],bl[3][i][j],0,0,co[i][j]}]++, 52 ans-=M[(P){bl[2][i][j],bl[3][i][j],0,0,co[i][j]}],M[(P){bl[2][i][j],bl[3][i][j],0,0,co[i][j]}]++, 53 ans+=M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],0,co[i][j]}],M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],0,co[i][j]}]++; 54 if(bl[4][i][j]) 55 ans+=M[(P){bl[4][i][j],0,0,0,co[i][j]}],M[(P){bl[4][i][j],0,0,0,co[i][j]}]++, 56 ans-=M[(P){bl[1][i][j],bl[4][i][j],0,0,co[i][j]}],M[(P){bl[1][i][j],bl[4][i][j],0,0,co[i][j]}]++, 57 ans-=M[(P){bl[2][i][j],bl[4][i][j],0,0,co[i][j]}],M[(P){bl[2][i][j],bl[4][i][j],0,0,co[i][j]}]++, 58 ans-=M[(P){bl[3][i][j],bl[4][i][j],0,0,co[i][j]}],M[(P){bl[3][i][j],bl[4][i][j],0,0,co[i][j]}]++, 59 ans+=M[(P){bl[1][i][j],bl[2][i][j],bl[4][i][j],0,co[i][j]}],M[(P){bl[1][i][j],bl[2][i][j],bl[4][i][j],0,co[i][j]}]++, 60 ans+=M[(P){bl[2][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}],M[(P){bl[2][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}]++, 61 ans+=M[(P){bl[1][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}],M[(P){bl[1][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}]++, 62 ans-=M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],bl[4][i][j],co[i][j]}],M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],bl[4][i][j],co[i][j]}]++; 63 } 64 for(int i=1;i<=n;++i)for(int j=2;j<=m;++j)if(co[i][j]&&co[i][j]==co[i][j-1]){ 65 int A=1; 66 for(int k=1;k<=4;++k)for(int l=1;l<=4;++l)if(bl[k][i][j-1]==bl[l][i][j]&&bl[l][i][j]){A=0;break;} 67 ans+=A; 68 } 69 for(int i=2;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]&&co[i][j]==co[i-1][j]){ 70 int A=1; 71 for(int k=1;k<=4;++k)for(int l=1;l<=4;++l)if(bl[k][i-1][j]==bl[l][i][j]&&bl[l][i][j]){A=0;break;} 72 ans+=A; 73 } 74 printf("%lld\n",ans); 75 }
upd:我太傻逼了哈希寫崩了!!!手寫的哈希表仍是要比map快的(2500ms/1570ms)
1 #include<cstdio> 2 struct P{int bl1,bl2,bl3,bl4,col;}; 3 struct hash_map{ 4 int fir[100000005],l[18000005],to_bl1[18000005],to_bl2[18000005]; 5 int to_bl3[18000005],to_bl4[18000005],to_col[18000005],w[18000005],c; 6 #define mod 100000003 7 #define g 31313 8 int &operator[](P x){ 9 int hsh=((((1ll*x.bl1*g+x.bl2)%mod*g+x.bl3)%mod*g+x.bl4)%mod*g+x.col)%mod; 10 for(int i=fir[hsh];i;i=l[i])if(to_bl1[i]==x.bl1&&to_bl2[i]==x.bl2&&to_bl3[i]==x.bl3&&to_bl4[i]==x.bl4&&to_col[i]==x.col){w[i]++;return w[i];} 11 l[++c]=fir[hsh];fir[hsh]=c;to_bl1[c]=x.bl1;to_bl2[c]=x.bl2;to_bl3[c]=x.bl3;to_bl4[c]=x.bl4;to_col[c]=x.col;return w[c]=1; 12 } 13 }M; 14 char xch,xB[1<<15],*xS=xB,*xTT=xB; 15 #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++) 16 inline int read() 17 { 18 int x=0,f=1;char ch=getc(); 19 while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();} 20 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();} 21 return x*f; 22 } 23 int co[1005][1005],n,k,m,al[1005][1005],tim,bl[5][1005][1005]; 24 const int ax[4]={0,0,1,-1},ay[4]={1,-1,0,0}; 25 #define tx x+ax[i] 26 #define ty y+ay[i] 27 void bfs(int x,int y){ 28 al[x][y]=tim; 29 if(co[x][y]){ 30 if(!bl[1][x][y])bl[1][x][y]=tim; 31 else if(!bl[2][x][y])bl[2][x][y]=tim; 32 else if(!bl[3][x][y])bl[3][x][y]=tim; 33 else bl[4][x][y]=tim; 34 return; 35 } 36 for(int i=0;i<=3;++i)if(tx>0&&ty>0&&tx<=n&&ty<=m&&al[tx][ty]!=tim)bfs(tx,ty); 37 } 38 int main(){//freopen("ex_link5.in","r",stdin); 39 n=read();m=read();k=read();long long ans=0; 40 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)co[i][j]=read(); 41 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]==0&&al[i][j]==0)tim++,bfs(i,j); 42 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]){ 43 if(bl[1][i][j]) 44 ans+=M[(P){bl[1][i][j],0,0,0,co[i][j]}]-1; 45 if(bl[2][i][j]) 46 ans+=M[(P){bl[2][i][j],0,0,0,co[i][j]}]-1, 47 ans-=M[(P){bl[1][i][j],bl[2][i][j],0,0,co[i][j]}]-1; 48 if(bl[3][i][j]) 49 ans+=M[(P){bl[3][i][j],0,0,0,co[i][j]}]-1, 50 ans-=M[(P){bl[1][i][j],bl[3][i][j],0,0,co[i][j]}]-1, 51 ans-=M[(P){bl[2][i][j],bl[3][i][j],0,0,co[i][j]}]-1, 52 ans+=M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],0,co[i][j]}]-1; 53 if(bl[4][i][j]) 54 ans+=M[(P){bl[4][i][j],0,0,0,co[i][j]}]-1, 55 ans-=M[(P){bl[1][i][j],bl[4][i][j],0,0,co[i][j]}]-1, 56 ans-=M[(P){bl[2][i][j],bl[4][i][j],0,0,co[i][j]}]-1, 57 ans-=M[(P){bl[3][i][j],bl[4][i][j],0,0,co[i][j]}]-1, 58 ans+=M[(P){bl[1][i][j],bl[2][i][j],bl[4][i][j],0,co[i][j]}]-1, 59 ans+=M[(P){bl[2][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}]-1, 60 ans+=M[(P){bl[1][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}]-1, 61 ans-=M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],bl[4][i][j],co[i][j]}]-1; 62 } 63 for(int i=1;i<=n;++i)for(int j=2;j<=m;++j)if(co[i][j]&&co[i][j]==co[i][j-1]){ 64 int A=1; 65 for(int k=1;k<=4;++k)for(int l=1;l<=4;++l)if(bl[k][i][j-1]==bl[l][i][j]&&bl[l][i][j]){A=0;break;} 66 ans+=A; 67 } 68 for(int i=2;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]&&co[i][j]==co[i-1][j]){ 69 int A=1; 70 for(int k=1;k<=4;++k)for(int l=1;l<=4;++l)if(bl[k][i-1][j]==bl[l][i][j]&&bl[l][i][j]){A=0;break;} 71 ans+=A; 72 } 73 printf("%lld\n",ans); 74 }
upd2:稍優化了一下。1450ms。碼長總算降到了2.8k。(手動討論佔了一半。。。)
1 #include<cstdio> 2 struct P{int bl1,bl2,bl3,bl4,col;}; 3 struct hash_map{ 4 int fir[100000005],l[18000005],to_col[18000005],w[18000005],c; 5 #define mod 100000003 6 #define g 31313 7 int &operator[](P x){ 8 int hsh=((((1ll*x.bl1*g+x.bl2)*g+x.bl3)%mod*g+x.bl4)*g+x.col)%mod; 9 for(int i=fir[hsh];i;i=l[i])if(to_col[i]==x.col){w[i]++;return w[i];} 10 l[++c]=fir[hsh];fir[hsh]=c;to_col[c]=x.col;return w[c]=1; 11 } 12 }M; 13 char xch,xB[1<<15],*xS=xB,*xTT=xB; 14 #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++) 15 inline int read() 16 { 17 int x=0,f=1;char ch=getc(); 18 while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();} 19 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();} 20 return x*f; 21 } 22 int co[1005][1005],n,k,m,al[1005][1005],tim,bl[5][1005][1005]; 23 const int ax[4]={0,0,1,-1},ay[4]={1,-1,0,0}; 24 #define tx x+ax[i] 25 #define ty y+ay[i] 26 void bfs(int x,int y){ 27 al[x][y]=tim; 28 if(co[x][y]){ 29 if(!bl[1][x][y])bl[1][x][y]=tim; 30 else if(!bl[2][x][y])bl[2][x][y]=tim; 31 else if(!bl[3][x][y])bl[3][x][y]=tim; 32 else bl[4][x][y]=tim; 33 return; 34 } 35 for(int i=0;i<=3;++i)if(tx>0&&ty>0&&tx<=n&&ty<=m&&al[tx][ty]!=tim)bfs(tx,ty); 36 } 37 int main(){//freopen("ex_link5.in","r",stdin); 38 n=read();m=read();k=read();long long ans=0; 39 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)co[i][j]=read(); 40 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]==0&&al[i][j]==0)tim++,bfs(i,j); 41 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]){ 42 if(bl[1][i][j]) 43 ans+=M[(P){bl[1][i][j],0,0,0,co[i][j]}]-1; 44 if(bl[2][i][j]) 45 ans+=M[(P){bl[2][i][j],0,0,0,co[i][j]}]-1, 46 ans-=M[(P){bl[1][i][j],bl[2][i][j],0,0,co[i][j]}]-1; 47 if(bl[3][i][j]) 48 ans+=M[(P){bl[3][i][j],0,0,0,co[i][j]}]-1, 49 ans-=M[(P){bl[1][i][j],bl[3][i][j],0,0,co[i][j]}]-1, 50 ans-=M[(P){bl[2][i][j],bl[3][i][j],0,0,co[i][j]}]-1, 51 ans+=M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],0,co[i][j]}]-1; 52 if(bl[4][i][j]) 53 ans+=M[(P){bl[4][i][j],0,0,0,co[i][j]}]-1, 54 ans-=M[(P){bl[1][i][j],bl[4][i][j],0,0,co[i][j]}]-1, 55 ans-=M[(P){bl[2][i][j],bl[4][i][j],0,0,co[i][j]}]-1, 56 ans-=M[(P){bl[3][i][j],bl[4][i][j],0,0,co[i][j]}]-1, 57 ans+=M[(P){bl[1][i][j],bl[2][i][j],bl[4][i][j],0,co[i][j]}]-1, 58 ans+=M[(P){bl[2][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}]-1, 59 ans+=M[(P){bl[1][i][j],bl[3][i][j],bl[4][i][j],0,co[i][j]}]-1, 60 ans-=M[(P){bl[1][i][j],bl[2][i][j],bl[3][i][j],bl[4][i][j],co[i][j]}]-1; 61 } 62 for(int i=1;i<=n;++i)for(int j=2;j<=m;++j)if(co[i][j]&&co[i][j]==co[i][j-1]){ 63 int A=1; 64 for(int k=1;k<=4;++k)for(int l=1;l<=4;++l)if(bl[k][i][j-1]==bl[l][i][j]&&bl[l][i][j]){A=0;break;} 65 ans+=A; 66 } 67 for(int i=2;i<=n;++i)for(int j=1;j<=m;++j)if(co[i][j]&&co[i][j]==co[i-1][j]){ 68 int A=1; 69 for(int k=1;k<=4;++k)for(int l=1;l<=4;++l)if(bl[k][i-1][j]==bl[l][i][j]&&bl[l][i][j]){A=0;break;} 70 ans+=A; 71 } 72 printf("%lld\n",ans); 73 }