第五周 9.27-10.3

9.27

合肥OL。((运气好会有名额?

9.28

补了一个线段树。

9.29-9.30

什么都没干?

10.1

弱联D1。心累不补。

10.2

弱联D2。

AIZU 2447 A Two Floors Dungeon

暴搜。地图要预处理好。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <queue>
  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<node> 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<S;i++)
 74             for(int j=1;j<=H;j++)
 75                 scanf("%s",GS[i][j]+1);
 76         for(int i=1;i<(1<<S);i++)
 77         {
 78             memcpy(G[i],G[0],sizeof(G[i]));
 79             for(int j=0;j<S;j++)
 80                 if((1<<j)&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 }
Aguin

10.3

打个BC。

再接再厉阿。

 

HDU 5496 Beauty of Sequence

每个a[i]有贡献的区间数是所有区间数【2^(n-1)】减去前面已经出现过a[i]的区间数。

还是dp死。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 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<maxn;i++) f[i]=(f[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<n;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<n;i++) b[i]=lower_bound(Hash,Hash+num,a[i])-Hash;
29         memset(cnt,0,sizeof(cnt));
30         LL ans=0LL;
31         for(int i=0;i<n;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 }
Aguin

 

posted @ 2015-09-27 09:11  Aguin  阅读(265)  评论(0编辑  收藏  举报