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 }
HDU5199 Gunner
问题描述
很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上的鸟儿就会落下来。 Jack会射击多次,他想知道每次射击会有多少鸟儿落下来。
输入描述
多组测试数据(大概5组),每一组的第一行给出n,m,n表示有n棵树和n只鸟,m表示Jack会射击m次。 在第二行,有n个整数, h[1],h[2],h[3],…,h[n]表示这些树的高度。 在第三行,有m个整数, q[1],q[2],q[3],…,q[m]表示Jack射击的高度。 [参数约定] 1≤n,m≤1000000(106) 1≤h[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 }
HDU5200 Trees
问题描述
今天CodeFamer去坎树。有N棵树排成一排。他们被从1到N标号。第i号树的高度为hi。两棵未被坎掉的树编号分别为x,y当且仅当他们满足如下条件中一条时,他们是属于同一个块的: 1) x+1=y 或 y+1=x; 2) 存在一个棵未被坎掉的树,编号为z,x和z在同一个块并且y和z也在同一个块。 现在CodeFamer想要坎掉一些高度不大于某个值的树,坎掉之后会形成多少个块呢?
输入描述
多组测试数据(大概15组)
对于每一组数据,第一行包含两个整数N和Q,以一个空格分开,N表示有N棵树,Q表示有Q个查询。 在接下来的N行中,会出现h[1],h[2],h[3],…,h[N],表示N棵树的高度。 在接下来的Q行中,会出现q[1],q[2],q[3],…,q[Q]表示CodeFamerr查询。 请处理到文件末尾。 [参数约定] 1≤N,Q≤50000 0≤h[i]≤1000000000(109) 0≤q[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 }