NOIp #2009

http://files.cnblogs.com/files/radiumlrb/NOIP2009%E6%8F%90%E9%AB%98%E7%BB%84%E5%A4%8D%E8%B5%9B%E8%AF%95%E9%A2%98.pdf

T1 潜伏着 Label:字符串大水

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<map>
 7 using namespace std;
 8 
 9 map<char,char> m;
10 int used[99];
11 string dst,key,con;
12 
13 void Error_lrb(){puts("Failed");exit(0);}
14 
15 int main(){
16 //    freopen("spy.in","r",stdin);freopen("spy.out","w",stdout);
17     
18     cin>>con>>key>>dst;
19     for(int i=0;i<key.size();i++){
20         if(!m.count(con[i])){
21             if(used[key[i]]) Error_lrb();
22             m[con[i]]=key[i],used[key[i]]=1;
23         }
24         else if(m[con[i]]!=key[i]) Error_lrb();
25     }
26     
27     for(char i='A';i<='Z';i++) if(!m.count(i))Error_lrb();
28     
29     for(int i=0;i<dst.size();i++){
30         if(m.count(dst[i])) cout<<m[dst[i]];
31         else Error_lrb();
32     }
33     
34     puts("");
35     fclose(stdin);fclose(stdout);return 0;
36 }

T2 Hankson 的趣味题

T3 最优贸易

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cstdlib>
  7 #include<vector>
  8 #define INF 0x3f3f3f3f
  9 #define ll long long
 10 #define maxn 200005
 11 using namespace std;
 12 
 13 int cmp[maxn];//强联通映射表
 14 int c_lrb[maxn];//正常点
 15 int cu[maxn];//强联通最高价 
 16 int cl[maxn];//强联通最低价 
 17 int white_list[maxn];
 18 int N,M;
 19 
 20 vector<int> G_lrb[maxn],rG_lrb[maxn];//正常点邻接表
 21 vector<int> G[maxn];//强联通邻接表 
 22 
 23 void init_(){
 24     scanf("%d%d",&N,&M);
 25     for(int i=1;i<=N;i++) scanf("%d",&c_lrb[i]);
 26     for(int i=1;i<=M;i++){
 27         int x,y,op;
 28         scanf("%d%d%d",&x,&y,&op);
 29         if(op==1){
 30             G_lrb[x].push_back(y);rG_lrb[y].push_back(x);
 31         }
 32         else{
 33             G_lrb[x].push_back(y);rG_lrb[x].push_back(y);
 34             G_lrb[y].push_back(x);rG_lrb[y].push_back(x);
 35         }
 36     }
 37     memset(cl,0x3f,sizeof(cl));
 38 }
 39 
 40 //scc
 41 ////////////////////////////////////////////////////////////
 42 
 43 int vis[maxn];
 44 vector<int> vec;
 45 void dfs(int x){
 46     if(!white_list[x]) return;
 47     vis[x]=1;
 48     for(int i=0;i<G_lrb[x].size();i++){
 49         if(!vis[G_lrb[x][i]]) dfs(G_lrb[x][i]);
 50     }
 51     vec.push_back(x);
 52 }
 53 
 54 void rdfs(int x,int k){
 55     cmp[x]=k;
 56     vis[x]=1;
 57     cl[k]=min(cl[k],c_lrb[x]);
 58     cu[k]=max(cu[k],c_lrb[x]);
 59     
 60     for(int i=0;i<rG_lrb[x].size();i++){
 61         if(!vis[rG_lrb[x][i]]) rdfs(rG_lrb[x][i],k);
 62     }
 63 //    puts("x");
 64 }
 65 
 66 void build(int x){
 67     vis[x]=1;
 68     int k=cmp[x];
 69     for(int i=0;i<G_lrb[x].size();i++){
 70         if(cmp[G_lrb[x][i]]!=k){
 71             if(!vis[G_lrb[x][i]]) build(G_lrb[x][i]);
 72             if(white_list[G_lrb[x][i]])G[k].push_back(cmp[G_lrb[x][i]]);
 73         }
 74     }
 75 }
 76 
 77 void make_list(){
 78     queue<int> q;
 79     q.push(N);
 80     while(!q.empty()){
 81         int x=q.front();q.pop();
 82         if(vis[x]) continue;white_list[x]=vis[x]=1;
 83         for(int i=0;i<rG_lrb[x].size();i++){
 84             q.push(rG_lrb[x][i]);
 85         }
 86     }
 87 }
 88 
 89 int k=0;
 90 void scc(){
 91     memset(vis,0,sizeof(vis));
 92     make_list();
 93     memset(vis,0,sizeof(vis));
 94     for(int i=1;i<=N;i++) if(!vis[i]) dfs(i);
 95     memset(vis,0,sizeof(vis));
 96     for(int i=vec.size()-1;i>=0;i--){
 97         int x=vec[i];
 98         if(!vis[x]) rdfs(x,++k);
 99     }
100     
101     memset(vis,0,sizeof(vis));
102     build(1);
103 }
104 
105 ////////////////////////////////////////////////////////////
106 int s,t,ans;//此时节点数为p 
107 
108 void work_dfs(int x,int pre_low){
109     pre_low=min(cl[x],pre_low);
110     ans=max(ans,cu[x]-pre_low);
111     
112     for(int i=0;i<G[x].size();i++){
113         if(!vis[G[x][i]]) work_dfs(G[x][i],pre_low);
114     }
115 }
116 
117 void work(){
118     s=cmp[1],t=cmp[N];
119     memset(vis,0,sizeof(vis));
120     work_dfs(s,cl[s]);
121 //    for(int i=1;i<=N;i++) printf("%d
",white_list[i]);
122 //    puts("");
123     printf("%d",ans);
124 }
125 
126 int main(){
127 //    freopen("trade.in","r",stdin);//freopen("trade.out","w",stdout);
128     //注意超时 
129     init_();
130     scc();
131     work();
132     
133     fclose(stdin);fclose(stdout);return 0;
134 }

写了一个强联通分量,果然T了

T4 靶形数独

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
原文地址:https://www.cnblogs.com/radiumlrb/p/6055536.html