首页 > 技术文章 > The 2014 ACM-ICPC Asia Mudanjiang Regional First Round

gaolzzxin 2014-09-07 20:16 原文

The Himalayas http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5341

签到

 1 #include<cstdio>
 2 int main(){
 3     int t,n,a[64];
 4     while(~scanf("%d",&t)){
 5         while(t--){
 6             scanf("%d",&n);
 7             for(int i=1;i<=n;i++){
 8                 scanf("%d",&a[i]);
 9             }
10             int ans=0;
11             for(int i=2;i<n;i++){
12                 if(a[i]>a[i-1]&&a[i]>a[i+1]){
13                     ans++;
14                 }
15             }
16             printf("%d\n",ans);
17         }
18     }
19     return 0;
20 }
View Code

 

 Pretty Poem http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5350

string

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<iostream>
 4 using namespace std;
 5 char sin[64],sout[64];
 6 string a1,a2,a3,b1,b2,b3,c;
 7 int main(){
 8     int t;
 9     scanf("%d",&t);
10     while(t--){
11         scanf("%s",sin);
12         int ls=0;
13         for(int i=0;sin[i];i++){
14             if(isalpha(sin[i])){
15                 sout[ls++]=sin[i];
16             }
17         }
18         bool flag=false;
19         for(int la=1;la<=ls;la++){
20             for(int lb=1;lb<=ls;lb++){
21                 if(la*3+lb*2==ls){///"ABABA"
22                     a1=a2=a3=b1=b2="";
23                     int s=0;
24                     for(int i=0;i<la;i++){
25                         a1+=sout[s+i];
26                     }
27                     s+=la;
28                     for(int i=0;i<lb;i++){
29                         b1+=sout[s+i];
30                     }
31                     s+=lb;
32                     for(int i=0;i<la;i++){
33                         a2+=sout[s+i];
34                     }
35                     s+=la;
36                     for(int i=0;i<lb;i++){
37                         b2+=sout[s+i];
38                     }
39                     s+=lb;
40                     for(int i=0;i<la;i++){
41                         a3+=sout[s+i];
42                     }
43                     s+=lb;
44                     if(a1==a2&&a1==a3&&b1==b2&&a1!=b1){
45                         flag=true;
46                         break;
47                     }
48                 }
49                 if(la*3+lb*3<ls){///"ABABCAB"
50                     a1=a2=a3=b1=b2=b3=c="";
51                     int s=0;
52                     for(int i=0;i<la;i++){
53                         a1+=sout[s+i];
54                     }
55                     s+=la;
56                     for(int i=0;i<lb;i++){
57                         b1+=sout[s+i];
58                     }
59                     s+=lb;
60                     for(int i=0;i<la;i++){
61                         a2+=sout[s+i];
62                     }
63                     s+=la;
64                     for(int i=0;i<lb;i++){
65                         b2+=sout[s+i];
66                     }
67                     s+=lb;
68                     int lc=ls-3*la-3*lb;
69                     for(int i=0;i<lc;i++){
70                         c+=sout[s+i];
71                     }
72                     s+=lc;
73                     for(int i=0;i<la;i++){
74                         a3+=sout[s+i];
75                     }
76                     s+=la;
77                     for(int i=0;i<lb;i++){
78                         b3+=sout[s+i];
79                     }
80                     s+=lb;
81                     if(a1==a2&&a1==a3&&b1==b2&&b1==b3&&a1!=b1&&a1!=c&&b1!=c){
82                         flag=true;
83                         break;
84                     }
85                 }
86             }
87             if(flag) break;
88         }
89         if(flag) puts("Yes");
90         else puts("No");
91     }
92     return 0;
93 }
View Code

 

 Untrusted Patrol http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343

并查集

  1 #include<cstdio>
  2 #include<cstring>
  3 #define mt(a,b) memset(a,b,sizeof(a))
  4 const int M=100010;
  5 struct G {
  6     struct E {
  7         int v,next;
  8     } e[M<<2];
  9     int le,head[M];
 10     void init() {
 11         le=0;
 12         mt(head,-1);
 13     }
 14     void add(int u,int v) {
 15         e[le].v=v;
 16         e[le].next=head[u];
 17         head[u]=le++;
 18     }
 19 } g;
 20 class UnionFindSet { ///并查集
 21     int par[M];
 22 public:
 23     void init() {
 24         mt(par,-1);
 25     }
 26     int getroot(int x) {
 27         int i=x,j=x,temp;
 28         while(par[i]>=0) i=par[i];
 29         while(j!=i) {
 30             temp=par[j];
 31             par[j]=i;
 32             j=temp;
 33         }
 34         return i;
 35     }
 36     bool unite(int x,int y) {
 37         int p=getroot(x);
 38         int q=getroot(y);
 39         if(p==q)return false;
 40         if(par[p]>par[q]) {
 41             par[q]+=par[p];
 42             par[p]=q;
 43         } else {
 44             par[p]+=par[q];
 45             par[q]=p;
 46         }
 47         return true;
 48     }
 49 } F;
 50 bool vis[M];
 51 int need[M];
 52 int main() {
 53     int t,n,m,K,u,v,L;
 54     scanf("%d",&t);
 55     while(t--) {
 56         scanf("%d%d%d",&n,&m,&K);
 57         mt(vis,0);
 58         for(int i=0; i<K; i++) {
 59             scanf("%d",&u);
 60             vis[u]=true;
 61         }
 62         g.init();
 63         while(m--) {
 64             scanf("%d%d",&u,&v);
 65             g.add(u,v);
 66             g.add(v,u);
 67         }
 68         scanf("%d",&L);
 69         for(int i=0; i<L; i++) {
 70             scanf("%d",&need[i]);
 71         }
 72         bool ans=true;
 73         if(L<K) {
 74             ans=false;
 75         }
 76         if(ans) {
 77             F.init();
 78             vis[need[0]]=false;
 79             for(int u=1; u<=n; u++) {
 80                 if(!vis[u]) {
 81                     for(int i=g.head[u]; ~i; i=g.e[i].next) {
 82                         int v=g.e[i].v;
 83                         if(!vis[v]) {
 84                             F.unite(u,v);
 85                         }
 86                     }
 87                 }
 88             }
 89             for(int x=1; x<L; x++) {
 90                 int u=need[x];
 91                 vis[u]=false;
 92                 for(int i=g.head[u]; ~i; i=g.e[i].next) {
 93                     int v=g.e[i].v;
 94                     if(!vis[v]) {
 95                         F.unite(u,v);
 96                     }
 97                 }
 98                 if(F.getroot(need[x-1])!=F.getroot(u)) {
 99                     ans=false;
100                     break;
101                 }
102             }
103         }
104         if(ans) {
105             int num=0;
106             for(int i=1; i<=n; i++) {
107                 if(F.getroot(i)==i) num++;
108                 if(num>1) {
109                     ans=false;
110                     break;
111                 }
112             }
113         }
114         if(ans) puts("Yes");
115         else puts("No");
116     }
117     return 0;
118 }
View Code

 

 

end

推荐阅读