2019西安多校联训 Day2
试题链接:http://www.accoders.com/contest.php?cid=1894 考试密码请私信;
T1
残忍WA 0,明明就是一道非常菜的字符串QAQ
思路:一共找四种东西,AC,CA,ACA,CAC,显然后两者
都可以作为AC或CA使用,每次查找后将查找到的串全变为
'B'避免重复搜索,三个bool变量记录即可
T1-
AC
1 #include <bits/stdc++.h> 2 using namespace std; 3 char s[100010]; 4 int len; 5 bool ac,ca,ak; 6 int main(){ 7 while(scanf("%s",&s)==1){ 8 len=strlen(s); 9 for(register int i=0;i<len-1;i++){ 10 if((s[i]=='A'&&s[i+1]=='C'&&s[i+2]=='A'&&ak==0)||(s[i]=='C'&&s[i+1]=='A'&&s[i+2]=='C'&&ak==0)){ak=1;s[i]=s[i+1]=s[i+2]='B';} 11 if(s[i]=='A'&&s[i+1]=='C'&&ac==0){ 12 ac=1; 13 s[i]='B';s[i+1]='B'; 14 } 15 if(s[i]=='C'&&s[i+1]=='A'&&ca==0){ 16 ca=1; 17 s[i]='B';s[i+1]='B'; 18 } 19 } 20 if(ak==1&&(ac==1||ca==1)) printf("YES\n"); 21 else if(ac==1&&ca==1) printf("YES\n"); 22 else printf("NO\n"); 23 ac=0,ca=0,ak=0; 24 memset(s,' ',sizeof(s)); 25 } 26 return 0; 27 }
T2
一道看上去像大水题的难题,需要神奇的搜索方式来搞
掉,难度中上
思路:首先找到大兵所在位置,然后填补他所在2*2的格子,
然后是4*4,8*8以对角线的方式来搜索填补对面的格子,以确保
一定填满的同时,填法不会出锅,填的同时记录填补格子的坐标
和放置方式,最后按照字典序输出即可
T2-
拯救瑞恩
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,k,a[1201][1201]; 4 int f[11]={0,2,4,8,16,32,64,128,256,512,1024}; 5 struct node{ 6 int x,y,w; 7 }ans[1400010]; 8 int ansnum; 9 bool cmp(node p,node q){ 10 if(p.x==q.x) return p.y<q.y; 11 else return p.x<q.x; 12 } 13 void dfs(int x1,int y1,int x2,int y2,int X,int Y){ 14 if(x2-x1==1&&y2-y1==1){ 15 if(X==x1&&Y==y1){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=3;} 16 if(X==x1&&Y==y2){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=1;} 17 if(X==x2&&Y==y1){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=2;} 18 if(X==x2&&Y==y2){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=4;} 19 return; 20 } 21 int x=(x2-x1+1)/2+x1-1; 22 int y=(y2-y1+1)/2+y1-1; 23 if(X<=x&&Y<=y){ 24 dfs(x1,y1,x,y,X,Y); 25 ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=3; 26 dfs(x+1,y1,x2,y,x+1,y); 27 dfs(x+1,y+1,x2,y2,x+1,y+1); 28 dfs(x1,y+1,x,y2,x,y+1); 29 } 30 if(X<=x&&Y>y){ 31 dfs(x1,y+1,x,y2,X,Y); 32 ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=1; 33 dfs(x1,y1,x,y,x,y); 34 dfs(x+1,y1,x2,y,x+1,y); 35 dfs(x+1,y+1,x2,y2,x+1,y+1); 36 } 37 if(X>x&&Y<=y){ 38 dfs(x+1,y1,x2,y,X,Y); 39 ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=2; 40 dfs(x+1,y+1,x2,y2,x+1,y+1); 41 dfs(x1,y1,x,y,x,y); 42 dfs(x1,y+1,x,y2,x,y+1); 43 } 44 if(X>x&&Y>y){ 45 dfs(x+1,y+1,x2,y2,X,Y); 46 ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=4; 47 dfs(x1,y1,x,y,x,y); 48 dfs(x1,y+1,x,y2,x,y+1); 49 dfs(x+1,y1,x2,y,x+1,y); 50 } 51 } 52 int main(){ 53 int x,y; 54 scanf("%d%d%d",&k,&x,&y); 55 n=f[k]; 56 dfs(1,1,n,n,x,y); 57 sort(ans+1,ans+ansnum+1,cmp); 58 for(register int i=1;i<=ansnum;i++) printf("%d %d %d\n",ans[i].x,ans[i].y,ans[i].w); 59 return 0; 60 }
T3
个人认为一道极其毒瘤的题(尤其针对我这种链表+dfs打不好的人)
思路:用链式前向星存储图,然后dfs搜索答案,在dfs中用二分查找
来维护区间的值....(这谁顶得住)
T3-
tree
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct node{ 4 long long nxt,to,dis; 5 }edge[2000010]; 6 long long head[2000010]; 7 long long cnt,ans,n,k,m,u,v,w; 8 long long a[2000010],zkcrp[2000010]; 9 void addedge(int from,int to,int w) 10 { 11 cnt++; 12 edge[cnt].to=to; 13 edge[cnt].dis=w; 14 edge[cnt].nxt=head[from]; 15 head[from]=cnt; 16 } 17 bool ef(int l,int r,long long zkc) 18 { 19 if(zkcrp[l]==zkc||zkcrp[r]==zkc) return true; 20 if(r-l<=1) return false; 21 int mid=(l+r)>>1; 22 if(zkcrp[mid]<zkc)return ef(mid+1,r,zkc); 23 else return ef(l,mid,zkc); 24 } 25 void dfs(long long now,long long deep) 26 { 27 if(ef(0,deep,a[now]-k)) ans++; 28 for(register int i=head[now];i;i=edge[i].nxt) 29 { 30 if(a[edge[i].to]||edge[i].to==m)continue; 31 a[edge[i].to]=a[now]+edge[i].dis; 32 zkcrp[deep+1]=a[edge[i].to]; 33 dfs(edge[i].to,deep+1); 34 } 35 } 36 int main(){ 37 scanf("%lld%lld%lld",&n,&m,&k); 38 for(register int i=1;i<n;i++){ 39 scanf("%lld%lld%lld",&u,&v,&w); 40 addedge(u,v,w); 41 addedge(v,u,w); 42 } 43 dfs(m,0); 44 printf("%lld\n",ans); 45 return 0; 46 }
end;