AmazingCounters.com

BestCoder Round #36

HDU5198 Strange Class

问题描述
在Vivid的学校里,有一个奇怪的班级(SC).在SC里,这些学生的名字非常奇怪。他们的名字形式是这样的anbncn(a,b,c两两不相同。).例如,叫”abc”,”ddppqq”的学生是在SC里的,然而叫”aaa”,”ab”,”ddppqqq”的同学并不是在SC里的。
Vivid交了许多的朋友,他想知道他们之中哪些人是在SC里的。
输入描述
多组测试数据(大概10组),每一个数据在一行中给出一个字符串S,代表Vivid一个朋友的名字。
请处理到文件末尾。

[参数约定]
1|S|10.
|S| 是指S的长度.
S 只包含小写字母.
输出描述
对于每一个数据,如果Vivid的朋友是SC里的,那么输出YES,否则输出NO。
输入样例
abc
bc
输出样例
YES
NO

思路:模拟就行,这场比赛题目都很水

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define maxn 1000
 6 using namespace std;
 7 char ch[maxn],cha[10];
 8 int a[10];
 9 int main()
10 {
11     int n;
12     while(scanf("%s",ch+1)!=EOF)
13     {
14         memset(a,0,sizeof(a));
15         int len=strlen(ch+1);
16         cha[1]=ch[1];
17         for(int i=1;i<=len;i++)
18         {
19             if(ch[i]==cha[1])a[1]++;else break;
20         }
21         cha[2]=ch[a[1]+1];
22         for(int i=a[1]+1;i<=len;i++)
23         {
24             if(ch[i]==cha[2])a[2]++;else break;
25         }
26         cha[3]=ch[a[2]+a[1]+1];
27         for(int i=a[1]+a[2]+1;i<=len;i++)
28         {
29             if(cha[3]==ch[i])a[3]++;else break;
30         }
31         if(a[1]+a[2]+a[3]!=len){puts("NO");continue;}
32         if(a[1]!=a[2] || a[2]!=a[3] || a[1]!=a[3]){puts("NO");continue;}
33         if(cha[1]==cha[2] || cha[1]==cha[3] || cha[2]==cha[3]){puts("NO");continue;}
34         puts("YES");
35     }
36     return 0;
37 }
View Code

 

HDU5199 Gunner

 

问题描述
很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上的鸟儿就会落下来。
Jack会射击多次,他想知道每次射击会有多少鸟儿落下来。
输入描述
多组测试数据(大概5组),每一组的第一行给出n,mn表示有n棵树和n只鸟,m表示Jack会射击m次。
在第二行,有n个整数, h[1],h[2],h[3],,h[n]表示这些树的高度。
在第三行,有m个整数, q[1],q[2],q[3],,q[m]表示Jack射击的高度。

[参数约定]
1n,m1000000(106)
1h[i],q[i]1000000000(109)
输出描述
对于每一个q[i],在一行中输出Jack射落了几只鸟。
输入样例
4 3
1 2 3 4
1 1 4
输出样例
1
0
1

思路:大水体啊啊啊啊啊啊,map就可以过,我求穩作死敲了个hash,慢了别人好多TUT

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define maxn 1000009
 5 #define MOD 10000009
 6 using namespace std;
 7 int head[MOD+10],nex[maxn],a[maxn],value[maxn];
 8 long long point[maxn],now=0;
 9 long long n,k;
10 int add(int x,int y)
11 {
12     nex[++now]=head[x];
13     head[x]=now;
14     point[now]=y;
15     value[now]=1;
16 }
17 void insert(long long x)
18 {
19     long long u=x%MOD;if(u<0)u*=-1;
20     for(int i=head[u];i;i=nex[i])
21     {
22         if(point[i]==x){value[i]++;return;}
23     }
24     add(u,x);
25 }
26 int find(int x)
27 {
28         int u=x%MOD;if(u<0)u*=-1;
29     for(int i=head[u];i;i=nex[i])
30     {
31         if(point[i]==x){int u=value[i];value[i]=0;return u;}
32     }
33     return 0;
34 }
35 int read()
36 {
37     int x=0,f=1;char ch=getchar();
38     while(ch<'0'||ch>'9'){ch=getchar();}
39     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
40     return x*f;
41 }
42 int main()
43 {
44         int n,m,h,q;
45         while(scanf("%d%d",&n,&m)!=EOF)
46         {
47                 now=0;
48                 memset(head,0,sizeof(head));
49                 memset(value,0,sizeof(value));
50                 for(int i=1;i<=n;i++)
51                 {
52                         h=read();
53                         insert(h);
54                 }
55                 for(int i=1;i<=m;i++)
56                 {
57                         q=read();
58                         int u=find(q);
59                         printf("%d\n",u);
60                 }
61         }
62         return 0;
63 }
View Code

 

 

 

HDU5200 Trees

问题描述
今天CodeFamer去坎树。有N棵树排成一排。他们被从1N标号。第i号树的高度为hi。两棵未被坎掉的树编号分别为x,y当且仅当他们满足如下条件中一条时,他们是属于同一个块的:
1) x+1=y 或 y+1=x;
2) 存在一个棵未被坎掉的树,编号为zxz在同一个块并且yz也在同一个块。
现在CodeFamer想要坎掉一些高度不大于某个值的树,坎掉之后会形成多少个块呢?
输入描述
多组测试数据(大概15组)
对于每一组数据,第一行包含两个整数NQ,以一个空格分开,N表示有N棵树,Q表示有Q个查询。
在接下来的N行中,会出现h[1],h[2],h[3],,h[N],表示N棵树的高度。
在接下来的Q行中,会出现q[1],q[2],q[3],,q[Q]表示CodeFamerr查询。

请处理到文件末尾。

[参数约定]
1N,Q50000
0h[i]1000000000(109)
0q[i]1000000000(109)
输出描述
对于每一个q[i],输出CodeFamer坎掉高度不大于q[i]的树之后有多少个块。
思路:离线输入,对于每个在范围内的树砍掉,维护块数就可以了,一开始想用并查集维护的,后来发现根本不用

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define maxn 60000
 6 using namespace std;
 7 int ansc=0,ans[maxn],father[maxn],visit[maxn];
 8 struct T
 9 {
10     int x;int y;
11 }q[maxn],a[maxn];
12 int cmp(T x,T y)
13 {
14     return x.x>y.x;
15 }
16 int cmp2(T x,T y)
17 {
18     return x.x<y.x;
19 }
20 
21 int main()
22 {
23     int n,qi;
24     while(scanf("%d%d",&n,&qi)!=EOF)
25     {
26                 memset(visit,0,sizeof(visit));
27         ansc=0;
28         for(int i=1;i<=n;i++)father[i]=i;
29         for(int i=1;i<=n;i++)
30         {
31             scanf("%d",&a[i].x);
32             a[i].y=i;
33         }
34         sort(a+1,a+1+n,cmp);
35         for(int i=1;i<=qi;i++)
36         {
37             scanf("%d",&q[i].x);
38             q[i].y=i;
39         }
40         sort(q+1,q+1+qi,cmp);
41         int u=1;
42         for(int i=1;i<=qi;i++)
43         {
44             while(a[u].x>q[i].x && u<=n)
45             {
46                 visit[a[u].y]=1;
47                 ansc++;
48                 if(visit[a[u].y-1])ansc--;
49                 if(visit[a[u].y+1])ansc--;
50                 u++;
51             }
52             ans[q[i].y]=ansc;
53         }
54         for(int i=1;i<=qi;i++)printf("%d\n",ans[i]);
55     }
56     return 0;
57 }
View Code

 

posted @ 2015-04-04 22:31  philippica  阅读(400)  评论(3编辑  收藏  举报