// //

2019西安多校联训 Day5

   T1

  光哥为了不让某初二奆佬恶心到我们而留下的火种

(貌似没这题平均分就100-了)

  思路:就一横一竖让后就gztopa嘛

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int bigg,n;
 4 int l,r;
 5 int a[100010];
 6 int puke[20];
 7 int main(){
 8     scanf("%d",&n);
 9     for(register int i=2;i<=11;i++) puke[i]=4;
10     puke[10]+=12;
11     for(register int i=1;i<=n;i++){
12         scanf("%d",&a[i]);
13         bigg+=a[i];
14         puke[a[i]]--;
15     }
16     //for(register int i=1;i<=11;i++) printf("%d\n",puke[i]);
17     int X=21-bigg;
18     //printf("%d\n",X);
19     for(register int i=2;i<=11;i++){if(i<=X) l+=puke[i];else if(i>X) r+=puke[i];}
20     if(r>=l) printf("DOSTA");
21     else if(l>r) printf("VUCI");
22     return 0;
23 }
T1-21点

   T2

  有点考验思维的一道题,虽然题目叫LCA,但是跟LCA没有

半毛钱关系;

  思路:先建图,我们不难发现我们把一条路左右的点数统计一下

取min,min值*2就是这条路径最多能被遍历的次数所以我们就得到了

此题的解法,正确性十分显然...

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct node{
 4     int to,nxt,w;
 5 }edge[1000010];
 6 int cnt,dd,n,x,y,z;
 7 int head[1000010];
 8 bool vis[1000010];
 9 bool chudu[1000010];
10 int l[1000010];
11 int aa[1000010];
12 void addedge(int from,int to,int w){
13     cnt++;
14     edge[cnt].to=to;
15     edge[cnt].w=w;
16     edge[cnt].nxt=head[from];
17     head[from]=cnt;
18 }
19 long long ans;
20 void eat(int p){
21     if(!chudu[p]){return;}
22     for(register int i=head[p];i;i=edge[i].nxt){
23         eat(edge[i].to);
24         l[p]+=l[edge[i].to];
25     }
26 }
27 void dfs(int m,int deep){
28     for(register int i=head[m];i;i=edge[i].nxt){
29         dfs(edge[i].to,deep+1);
30         l[dd]=max(deep,l[dd]);
31     }
32 }
33 int main(){
34     scanf("%d",&n);
35     for(register int i=1;i<n;i++){
36         scanf("%d%d%d",&x,&y,&z);
37         addedge(x,y,z);
38         aa[y]=z;
39         vis[y]=1;
40         chudu[x]=1;
41     }
42     for(register int i=1;i<=n;i++){if(!vis[i]) dd=i;l[i]=1;}
43     eat(dd);
44     l[dd]=0;
45     dfs(dd,1);
46     for(register int i=2;i<=n;i++){
47         int xx=min(l[i],n-l[i]);
48         ans+=aa[i]*2*xx;
49     }
50     printf("%lld",ans);
51     return 0;
52 }
T2-LCA

   T3

  显然这是一道字符串问题,难度中等偏高

  思路:先跑一遍manachar,求出所有最长回文串,

其次跑一遍贪心即可

T3-
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 char a[100010];
 4 bool f[5010][5010];
 5 bool vis[100010];
 6 int len,n,now;
 7 bool check(int l,int r){
 8     if(f[l][r]) return true;
 9     else if(a[l]==a[r]) return check(l+1,r-1);
10     return false;
11 }
12 void inti(){
13     for(register int i=1;i<=len;i++){
14         f[i][i]=1;
15         if(a[i]==a[i+1]) f[i][i+1]=1;
16     }
17     return;
18 }
19 int main(){
20     while(cin>>a+1){
21         now=0;
22         memset(f,0,sizeof(f));
23         memset(vis,0,sizeof(vis));
24         len=strlen(a+1);
25         inti();
26         //for(register int j=1;j<=len;j++) printf("%d ",f[i][j]);printf("\n");}
27         //printf("\n");
28         for(register int i=len;i>=1;i--){
29             for(register int j=1;j<=len-i+1;j++){
30                 if(vis[j]) continue;
31                 if(check(j,j+i-1)){
32                     //cout<<j<<" "<<j+i-1<<endl;
33                     now++;
34                     for(register int k=j;k<=j+i-1;k++) vis[k]=1;
35                 }//eabcbcbabaedcde
36             }
37         }
38         printf("%d\n",now-1);
39     } 
40     return 0;
41 }
萨鲁曼的半兽人

 

  end;

 

posted @ 2019-06-19 23:32  Zafkiel  阅读(167)  评论(3编辑  收藏  举报
Live2D //博客园自带,可加可不加