2019西安多校联训 Day2

时间:2019-06-12
本文章向大家介绍2019西安多校联训 Day2,主要包括2019西安多校联训 Day2使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

   T1

  残忍WA 0,明明就是一道非常菜的字符串QAQ

  思路:一共找四种东西,AC,CA,ACA,CAC,显然后两者

都可以作为AC或CA使用,每次查找后将查找到的串全变为

'B'避免重复搜索,三个bool变量记录即可

T1-
 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 }
AC

   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-
 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 }
tree

   end;

 

原文地址:https://www.cnblogs.com/liuhailin/p/11009616.html