9.27
合肥OL。((运气好会有名额?
9.28
补了一个线段树。
9.29-9.30
什么都没干?
10.1
弱联D1。心累不补。
10.2
弱联D2。
AIZU 2447 A Two Floors Dungeon
暴搜。地图要预处理好。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 int d[][2]={{0,1},{0,-1},{1,0},{-1,0}}; 7 bool vis[2][51][51][1<<10]; 8 char G[1<<10][2][51][51]; 9 char GS[10][51][51]; 10 bool on[10]; 11 int W,H,S; 12 13 struct node 14 { 15 int f,x,y,pos,step; 16 node(int F,int X,int Y,int POS,int STEP){f=F;x=X;y=Y;pos=POS;step=STEP;} 17 }; 18 queue q; 19 20 bool in(int i,int j) 21 { 22 return i&&i<=H&&j&&j<=W; 23 } 24 25 void update(int pos) 26 { 27 for(int i=S-1;i>=0;i--) 28 { 29 on[i]=pos/(1<<i); 30 pos%=(1<<i); 31 } 32 return; 33 } 34 35 void Switch(int x,int s) 36 { 37 for(int i=1;i<=H;i++) 38 for(int j=1;j<=W;j++) 39 if(GS[s][i][j]=='*') 40 swap(G[x][0][i][j],G[x][1][i][j]); 41 return; 42 } 43 44 int main(void) 45 { 46 while(~scanf("%d%d",&W,&H)) 47 { 48 int xs,ys,xt,yt; 49 for(int i=1;i<=H;i++) 50 { 51 char s[100]; 52 scanf("%s",s+1); 53 for(int j=1;j<=W;j++) 54 { 55 if(s[j]=='#'||s[j]=='|') G[0][0][i][j]=G[0][1][i][j]=s[j]; 56 else if(s[j]=='_') G[0][0][i][j]='0',G[0][1][i][j]='#'; 57 else if(s[j]=='^') G[0][0][i][j]='#',G[0][1][i][j]='0'; 58 else if(s[j]=='%') 59 { 60 G[0][0][i][j]='0',G[0][1][i][j]='#'; 61 xs=i; ys=j; 62 } 63 else if(s[j]=='&') 64 { 65 G[0][0][i][j]='0',G[0][1][i][j]='#'; 66 xt=i; yt=j; 67 } 68 else if(s[j]>='a'&&s[j]<='z') G[0][0][i][j]=s[j],G[0][1][i][j]='#'; 69 else if(s[j]>='A'&&s[j]<='Z') G[0][0][i][j]='#',G[0][1][i][j]=s[j]+32; 70 } 71 } 72 scanf("%d",&S); 73 for(int i=0;i ) 74 for(int j=1;j<=H;j++) 75 scanf("%s",GS[i][j]+1); 76 for(int i=1;i<(1<) 77 { 78 memcpy(G[i],G[0],sizeof(G[i])); 79 for(int j=0;j) 80 if((1<i) Switch(i,j); 81 } 82 while(!q.empty()) q.pop(); 83 memset(vis,0,sizeof(vis)); 84 q.push(node(0,xs,ys,0,0)); 85 vis[0][xs][ys][0]=1; 86 int ans=-1; 87 while(!q.empty()) 88 { 89 node tmp=q.front(); q.pop(); 90 int f=tmp.f,x=tmp.x,y=tmp.y,pos=tmp.pos,step=tmp.step; 91 if(x==xt&&y==yt) {ans=step; break;} 92 update(pos); 93 for(int i=0;i<4;i++) 94 { 95 int xx=x+d[i][0],yy=y+d[i][1]; 96 if(!in(xx,yy)||vis[f][xx][yy][pos]||G[pos][f][xx][yy]=='#') continue; 97 vis[f][xx][yy][pos]=1; 98 q.push(node(f,xx,yy,pos,step+1)); 99 } 100 if(G[pos][f][x][y]=='|'&&!vis[1-f][x][y][pos]) 101 { 102 vis[1-f][x][y][pos]=1; 103 q.push(node(1-f,x,y,pos,step+1)); 104 } 105 if(G[pos][f][x][y]>='a'&&G[pos][f][x][y]<='z') 106 { 107 int p=G[pos][f][x][y]-'a',t=1<<p; 108 if(on[p]) 109 { 110 if(!(GS[p][x][y]=='*'&&vis[1-f][x][y][pos-t])&&!(GS[p][x][y]!='*'&&vis[f][x][y][pos-t])) 111 { 112 if(GS[p][x][y]=='*') f=1-f; 113 vis[f][x][y][pos-t]=1; 114 q.push(node(f,x,y,pos-t,step+1)); 115 } 116 } 117 else 118 { 119 if(!(GS[p][x][y]=='*'&&vis[1-f][x][y][pos+t])&&!(GS[p][x][y]!='*'&&vis[f][x][y][pos+t])) 120 { 121 if(GS[p][x][y]=='*') f=1-f; 122 vis[f][x][y][pos+t]=1; 123 q.push(node(f,x,y,pos+t,step+1)); 124 } 125 } 126 } 127 } 128 printf("%d\n",ans); 129 } 130 return 0; 131 }
10.3
打个BC。
再接再厉阿。
HDU 5496 Beauty of Sequence
每个a[i]有贡献的区间数是所有区间数【2^(n-1)】减去前面已经出现过a[i]的区间数。
还是dp死。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 typedef long long LL; 7 const int maxn=1e5+10; 8 const LL mod=1e9+7; 9 LL a[maxn],b[maxn],f[maxn]; 10 LL cnt[maxn],Hash[maxn]; 11 12 int main(void) 13 { 14 f[0]=1LL; 15 for(int i=1;i 1]*2LL)%mod; 16 int T; cin>>T; 17 while(T--) 18 { 19 int n; 20 scanf("%d",&n); 21 for(int i=0;i ) 22 { 23 scanf("%I64d",a+i); 24 Hash[i]=a[i]; 25 } 26 sort(Hash,Hash+n); 27 int num=unique(Hash,Hash+n)-Hash; 28 for(int i=0;i Hash; 29 memset(cnt,0,sizeof(cnt)); 30 LL ans=0LL; 31 for(int i=0;i ) 32 { 33 ans=(ans+a[i]*f[n-1]%mod)%mod; 34 ans=(ans-a[i]*(LL)cnt[b[i]]%mod*f[n-i-1]%mod+mod)%mod; 35 cnt[b[i]]=(cnt[b[i]]+f[i])%mod; 36 } 37 printf("%I64d\n",ans); 38 } 39 return 0; 40 }