B:当n是偶数时无解,因为此时树中有奇数条边,而我们每次都只能删除偶数条。当n是奇数时一定有解,因为此时不可能所有点度数都为奇数,只要找到一个度数为偶数的点,满足将它删掉后,各连通块大小都为奇数就可以了。考虑如何证明这样的点一定存在。钦定一个根后,考虑找到一个度数为偶数的点,满足子树内点度数均为奇数。这样该点的所有儿子的子树都有奇数个点, 因为删掉该点后每个子树内只有一个点度数为偶数。又因为删掉这个点后该树剩下偶数个点和偶数个连通块,所以该点父亲所在连通块也有奇数个点。

  于是只需要先自底向上删掉度数为偶数的点,再将剩余每棵树自顶向下删除即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. #define ll long long
  9. #define N 200010
  10. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  11. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  12. int read()
  13. {
  14. int x=0,f=1;char c=getchar();
  15. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  16. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  17. return x*f;
  18. }
  19. int n,p[N],fa[N],degree[N],t,root;
  20. struct data{int to,nxt;
  21. }edge[N<<1];
  22. void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
  23. void dfs(int k)
  24. {
  25. for (int i=p[k];i;i=edge[i].nxt)
  26. {
  27. dfs(edge[i].to);
  28. degree[k]+=(degree[edge[i].to]%2==0);
  29. }
  30. if ((degree[k]&1)==(k!=root)) printf("%d\n",k);
  31. }
  32. void dfs2(int k)
  33. {
  34. if ((degree[k]&1)!=(k!=root)) printf("%d\n",k);
  35. for (int i=p[k];i;i=edge[i].nxt) dfs2(edge[i].to);
  36. }
  37. signed main()
  38. {
  39. #ifndef ONLINE_JUDGE
  40. freopen("b.in","r",stdin);
  41. freopen("b.out","w",stdout);
  42. #endif
  43. n=read();
  44. for (int i=1;i<=n;i++)
  45. {
  46. fa[i]=read();
  47. if (fa[i]) addedge(fa[i],i);
  48. else root=i;
  49. }
  50. if (n%2==0) {cout<<"NO";return 0;}
  51. cout<<"YES"<<endl;
  52. dfs(root);
  53. dfs2(root);
  54. return 0;
  55. //NOTICE LONG LONG!!!!!
  56. }

  C:对于每种矩形宽,找出其各种矩形长的出现次数。如果对某两种宽,其矩形长出现次数的比例不同,显然无解。然后对所有出现次数取gcd即可,gcd的因子数即为答案,即考虑每一行各种矩形长究竟出现了多少次。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. #define ll long long
  9. #define N 200010
  10. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  11. ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
  12. ll read()
  13. {
  14. ll x=0,f=1;char c=getchar();
  15. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  16. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  17. return x*f;
  18. }
  19. int n,tot;
  20. ll ans;
  21. struct data
  22. {
  23. ll x,y,z;
  24. bool operator <(const data&a) const
  25. {
  26. return x<a.x||x==a.x&&y<a.y;
  27. }
  28. }a[N];
  29. void error(){cout<<0;exit(0);}
  30. signed main()
  31. {
  32. #ifndef ONLINE_JUDGE
  33. freopen("c.in","r",stdin);
  34. freopen("c.out","w",stdout);
  35. #endif
  36. n=read();
  37. for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),a[i].z=read(),ans=gcd(ans,a[i].z);
  38. sort(a+1,a+n+1);
  39. int len=0;
  40. for (int i=1;i<=n;i++) if (a[i].x==a[1].x) len++;else break;
  41. if (n%len) error();
  42. for (int i=1;i<=n;i+=len)
  43. {
  44. ll x=0;if (a[i].x==a[i-1].x) error();
  45. for (int j=i;j<i+len;j++)
  46. {
  47. x=gcd(x,a[j].z);
  48. if (i>len&&(a[j].x!=a[i].x||a[j].y!=a[j-len].y)) error();
  49. }
  50. for (int j=i;j<i+len;j++)
  51. {
  52. a[j].z/=x;
  53. if (i>len&&a[j].z!=a[j-len].z) error();
  54. }
  55. }
  56. for (ll i=1;i*i<=ans;i++)
  57. if (ans%i==0)
  58. {
  59. tot++;
  60. if (i*i!=ans) tot++;
  61. }
  62. cout<<tot;
  63. return 0;
  64. //NOTICE LONG LONG!!!!!
  65. }

  D:注意到询问串长度不同的询问只有O(√n)种,也就是说只有O(n√n)个子串是有用的。显然可以把这些子串找到暴力哈希,但不优美。

  考虑SA,离线,将所有询问串和原串拼起来,从大到小按height数组合并,回答询问时找到其在名次数组上所在集合(仅考虑原串中的位置),即要求集合中挑出k个元素的极差最小值。同时注意到题面里还说保证询问串不同,那么每次暴力sort一下所在集合复杂度就是对的。这样带了个log,不sort随便改一下就可以去掉了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<vector>
  8. using namespace std;
  9. #define ll long long
  10. #define N 300010
  11. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  12. ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
  13. ll read()
  14. {
  15. ll x=0,f=1;char c=getchar();
  16. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  17. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  18. return x*f;
  19. }
  20. int n,m,a[N],sa[N],sa2[N],rk[N<<1],cnt[N],tmp[N<<1],v[N],h[N],ans[N],fa[N],t;
  21. vector<int> pos[N],S[N];
  22. struct data
  23. {
  24. int i,k,begin,end;
  25. bool operator <(const data&a) const
  26. {
  27. return end-begin>a.end-a.begin;
  28. }
  29. }q[N];
  30. char s[N];
  31. void make(int n)
  32. {
  33. int m=27;
  34. for (int i=1;i<=n;i++) cnt[rk[i]=a[i]]++;
  35. for (int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
  36. for (int i=n;i>=1;i--) sa[cnt[rk[i]]--]=i;
  37. for (int k=1;k<=n;k<<=1)
  38. {
  39. int p=0;
  40. for (int i=n-k+1;i<=n;i++) sa2[++p]=i;
  41. for (int i=1;i<=n;i++) if (sa[i]>k) sa2[++p]=sa[i]-k;
  42. memset(cnt,0,m+1<<2);
  43. for (int i=1;i<=n;i++) cnt[rk[i]]++;
  44. for (int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
  45. for (int i=n;i>=1;i--) sa[cnt[rk[sa2[i]]]--]=sa2[i];
  46. memcpy(tmp,rk,sizeof(tmp));
  47. p=1;rk[sa[1]]=1;
  48. for (int i=2;i<=n;i++)
  49. {
  50. if (tmp[sa[i]]!=tmp[sa[i-1]]||tmp[sa[i]+k]!=tmp[sa[i-1]+k]) p++;
  51. rk[sa[i]]=p;
  52. }
  53. if (p==n) break;
  54. m=p;
  55. }
  56. for (int i=1;i<=n;i++)
  57. {
  58. v[i]=max(v[i-1]-1,0);
  59. while (a[i+v[i]]==a[sa[rk[i]-1]+v[i]]) v[i]++;
  60. }
  61. for (int i=1;i<=n;i++) h[i]=v[sa[i]],pos[h[i]].push_back(i);
  62. }
  63. int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
  64. signed main()
  65. {
  66. #ifndef ONLINE_JUDGE
  67. freopen("d.in","r",stdin);
  68. freopen("d.out","w",stdout);
  69. #endif
  70. scanf("%s",s+1);t=n=strlen(s+1);
  71. for (int i=1;i<=n;i++) a[i]=s[i]-'a'+1;a[++t]=27;
  72. m=read();
  73. for (int i=1;i<=m;i++)
  74. {
  75. q[i].k=read(),q[i].i=i;
  76. q[i].begin=++t;
  77. scanf("%s",s+1);
  78. int u=strlen(s+1);
  79. for (int j=1;j<=u;j++) a[t++]=s[j]-'a'+1;
  80. q[i].end=--t;
  81. }
  82. sort(q+1,q+m+1);
  83. make(t);
  84. for (int i=1;i<=t;i++) fa[i]=i;
  85. int cur=0;
  86. for (int i=t;i>=1;i--)
  87. {
  88. for (int j=0;j<pos[i].size();j++) fa[find(pos[i][j])]=find(pos[i][j]-1);
  89. if (q[cur+1].end-q[cur+1].begin+1==i)
  90. {
  91. for (int j=1;j<=t;j++) S[j].clear();
  92. for (int j=1;j<=n;j++) S[find(rk[j])].push_back(j);
  93. while (cur<m&&q[cur+1].end-q[cur+1].begin+1==i)
  94. {
  95. cur++;int x=find(rk[q[cur].begin]);
  96. if (S[x].size()<q[cur].k) {ans[q[cur].i]=-1;continue;}
  97. ans[q[cur].i]=n;
  98. for (int j=0;j<S[x].size()+1-q[cur].k;j++)
  99. ans[q[cur].i]=min(ans[q[cur].i],S[x][j+q[cur].k-1]-S[x][j]+q[cur].end-q[cur].begin+1);
  100. }
  101. }
  102. }
  103. for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
  104. return 0;
  105. //NOTICE LONG LONG!!!!!
  106. }

  

Codeforces Round #475 Div. 1的更多相关文章

  1. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1) 963B 964D B Destruction of a Tree

    题 OvO http://codeforces.com/contest/963/problem/B CF 963B 964D 解 对于题目要求,显然一开始的树,要求度数为偶数的节点个数为奇数个,通过奇 ...

  2. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)D. Frequency of String

    题意:有一个串s,n个串模式串t,问s的子串中长度最小的包含t k次的长度是多少 题解:把所有t建ac自动机,把s在ac自动机上匹配.保存每个模式串在s中出现的位置.这里由于t两两不同最多只有xsqr ...

  3. Codeforces Round #475 (Div. 2) C - Alternating Sum

    等比数列求和一定要分类讨论!!!!!!!!!!!! #include<bits/stdc++.h> #define LL long long #define fi first #defin ...

  4. Codeforces Round #475 (Div. 2) D. Destruction of a Tree

    题意:给你一棵树, 只能删度数为偶数的点, 问你能不能将整个图删完, 如果能输入删除的顺序. 思路:对于一棵树来说, 如果里面的点的个数是偶数个则肯定不可能, 偶数个点有奇数条边,而你每次删只能删偶数 ...

  5. Codeforces Round #475 (Div. 2)

    B. Messages 题意:有n个消息分别在ti的时候收到.设所有消息收到时初始值为A,每过一秒,其值减去B.当在某一秒选择读某个消息时,获值为当前消息的值:如果在某一秒结束的时候,手上有k则消息未 ...

  6. Codeforces Round #475 Div. 2 A B C D

    A - Splits 题意 将一个正整数拆分成若干个正整数的和,从大到小排下来,与第一个数字相同的数字的个数为这个拆分的权重. 问\(n\)的所有拆分的不同权重可能个数. 思路 全拆成1,然后每次将2 ...

  7. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)

    A. Splits time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  8. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)

    A. Alternating Sum 就是个等比数列,特判公比为 $1$ 的情况即可. #include <bits/stdc++.h> using namespace std; ; ; ...

  9. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

随机推荐

  1. Django ORM模型:想说爱你不容易

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  2. Spring MVC+ Spring + Mybatis从零开始搭建一个精美且实用的管理后台

    点击进入<SSM搭建精美实用的管理系统>达人课页面 SSM 框架即 SpringMVC+Spring+Mybatis,相信各位朋友在投递简历时已直观感受到它的重要性,JavaWeb 相关工 ...

  3. JSON Web Token 入门教程

    原文地址:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html JSON Web Token(缩写 JWT)是目前最流 ...

  4. OSS网页上传和断点续传(终结篇)

    有了之前OSS网页上传和断点续传(OSS配置篇)和(STSToken篇),其万事俱备只欠东风啦,此终结篇即将展示OSS上传文件及断点续传的无限魅力... 网络卡顿.延迟能续传吗?能! 关了浏览器,还能 ...

  5. iOS Keychain,SSKeychain,使用 理解 原理

    https://www.cnblogs.com/m4abcd/p/5242254.html Keychain 使用? ---为了实用最大化我觉得我应该直接先说使用! 当然是使用第三方库啦:sskeyc ...

  6. CMMI摘要

    CMMI_百度百科https://baike.baidu.com/item/CMMI CMMI分为哪几个等级?CMMI等级介绍_百度经验https://jingyan.baidu.com/articl ...

  7. Redis教程(Windows)

    安装 1)下载redis压缩包并  , 推荐地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平 ...

  8. springboot 整合spark-sql报错

    Exception in thread "main" org.spark_project.guava.util.concurrent.ExecutionError: java.la ...

  9. 994.Contiguous Array 邻近数组

    描述 Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and ...

  10. HDU 4913 Least common multiple

    题目:Least common multiple 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4913 题意:有一个集合s,包含x1,x2,...,xn, ...