Codeforces Round #475 Div. 1
B:当n是偶数时无解,因为此时树中有奇数条边,而我们每次都只能删除偶数条。当n是奇数时一定有解,因为此时不可能所有点度数都为奇数,只要找到一个度数为偶数的点,满足将它删掉后,各连通块大小都为奇数就可以了。考虑如何证明这样的点一定存在。钦定一个根后,考虑找到一个度数为偶数的点,满足子树内点度数均为奇数。这样该点的所有儿子的子树都有奇数个点, 因为删掉该点后每个子树内只有一个点度数为偶数。又因为删掉这个点后该树剩下偶数个点和偶数个连通块,所以该点父亲所在连通块也有奇数个点。
于是只需要先自底向上删掉度数为偶数的点,再将剩余每棵树自顶向下删除即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,p[N],fa[N],degree[N],t,root;
struct data{int to,nxt;
}edge[N<<1];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k)
{
for (int i=p[k];i;i=edge[i].nxt)
{
dfs(edge[i].to);
degree[k]+=(degree[edge[i].to]%2==0);
}
if ((degree[k]&1)==(k!=root)) printf("%d\n",k);
}
void dfs2(int k)
{
if ((degree[k]&1)!=(k!=root)) printf("%d\n",k);
for (int i=p[k];i;i=edge[i].nxt) dfs2(edge[i].to);
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
n=read();
for (int i=1;i<=n;i++)
{
fa[i]=read();
if (fa[i]) addedge(fa[i],i);
else root=i;
}
if (n%2==0) {cout<<"NO";return 0;}
cout<<"YES"<<endl;
dfs(root);
dfs2(root);
return 0;
//NOTICE LONG LONG!!!!!
}
C:对于每种矩形宽,找出其各种矩形长的出现次数。如果对某两种宽,其矩形长出现次数的比例不同,显然无解。然后对所有出现次数取gcd即可,gcd的因子数即为答案,即考虑每一行各种矩形长究竟出现了多少次。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
ll read()
{
ll x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,tot;
ll ans;
struct data
{
ll x,y,z;
bool operator <(const data&a) const
{
return x<a.x||x==a.x&&y<a.y;
}
}a[N];
void error(){cout<<0;exit(0);}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
n=read();
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);
sort(a+1,a+n+1);
int len=0;
for (int i=1;i<=n;i++) if (a[i].x==a[1].x) len++;else break;
if (n%len) error();
for (int i=1;i<=n;i+=len)
{
ll x=0;if (a[i].x==a[i-1].x) error();
for (int j=i;j<i+len;j++)
{
x=gcd(x,a[j].z);
if (i>len&&(a[j].x!=a[i].x||a[j].y!=a[j-len].y)) error();
}
for (int j=i;j<i+len;j++)
{
a[j].z/=x;
if (i>len&&a[j].z!=a[j-len].z) error();
}
}
for (ll i=1;i*i<=ans;i++)
if (ans%i==0)
{
tot++;
if (i*i!=ans) tot++;
}
cout<<tot;
return 0;
//NOTICE LONG LONG!!!!!
}
D:注意到询问串长度不同的询问只有O(√n)种,也就是说只有O(n√n)个子串是有用的。显然可以把这些子串找到暴力哈希,但不优美。
考虑SA,离线,将所有询问串和原串拼起来,从大到小按height数组合并,回答询问时找到其在名次数组上所在集合(仅考虑原串中的位置),即要求集合中挑出k个元素的极差最小值。同时注意到题面里还说保证询问串不同,那么每次暴力sort一下所在集合复杂度就是对的。这样带了个log,不sort随便改一下就可以去掉了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define N 300010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
ll gcd(ll n,ll m){return m==0?n:gcd(m,n%m);}
ll read()
{
ll x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
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;
vector<int> pos[N],S[N];
struct data
{
int i,k,begin,end;
bool operator <(const data&a) const
{
return end-begin>a.end-a.begin;
}
}q[N];
char s[N];
void make(int n)
{
int m=27;
for (int i=1;i<=n;i++) cnt[rk[i]=a[i]]++;
for (int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
for (int i=n;i>=1;i--) sa[cnt[rk[i]]--]=i;
for (int k=1;k<=n;k<<=1)
{
int p=0;
for (int i=n-k+1;i<=n;i++) sa2[++p]=i;
for (int i=1;i<=n;i++) if (sa[i]>k) sa2[++p]=sa[i]-k;
memset(cnt,0,m+1<<2);
for (int i=1;i<=n;i++) cnt[rk[i]]++;
for (int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
for (int i=n;i>=1;i--) sa[cnt[rk[sa2[i]]]--]=sa2[i];
memcpy(tmp,rk,sizeof(tmp));
p=1;rk[sa[1]]=1;
for (int i=2;i<=n;i++)
{
if (tmp[sa[i]]!=tmp[sa[i-1]]||tmp[sa[i]+k]!=tmp[sa[i-1]+k]) p++;
rk[sa[i]]=p;
}
if (p==n) break;
m=p;
}
for (int i=1;i<=n;i++)
{
v[i]=max(v[i-1]-1,0);
while (a[i+v[i]]==a[sa[rk[i]-1]+v[i]]) v[i]++;
}
for (int i=1;i<=n;i++) h[i]=v[sa[i]],pos[h[i]].push_back(i);
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
#endif
scanf("%s",s+1);t=n=strlen(s+1);
for (int i=1;i<=n;i++) a[i]=s[i]-'a'+1;a[++t]=27;
m=read();
for (int i=1;i<=m;i++)
{
q[i].k=read(),q[i].i=i;
q[i].begin=++t;
scanf("%s",s+1);
int u=strlen(s+1);
for (int j=1;j<=u;j++) a[t++]=s[j]-'a'+1;
q[i].end=--t;
}
sort(q+1,q+m+1);
make(t);
for (int i=1;i<=t;i++) fa[i]=i;
int cur=0;
for (int i=t;i>=1;i--)
{
for (int j=0;j<pos[i].size();j++) fa[find(pos[i][j])]=find(pos[i][j]-1);
if (q[cur+1].end-q[cur+1].begin+1==i)
{
for (int j=1;j<=t;j++) S[j].clear();
for (int j=1;j<=n;j++) S[find(rk[j])].push_back(j);
while (cur<m&&q[cur+1].end-q[cur+1].begin+1==i)
{
cur++;int x=find(rk[q[cur].begin]);
if (S[x].size()<q[cur].k) {ans[q[cur].i]=-1;continue;}
ans[q[cur].i]=n;
for (int j=0;j<S[x].size()+1-q[cur].k;j++)
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);
}
}
}
for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
//NOTICE LONG LONG!!!!!
}
Codeforces Round #475 Div. 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 解 对于题目要求,显然一开始的树,要求度数为偶数的节点个数为奇数个,通过奇 ...
- 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 ...
- Codeforces Round #475 (Div. 2) C - Alternating Sum
等比数列求和一定要分类讨论!!!!!!!!!!!! #include<bits/stdc++.h> #define LL long long #define fi first #defin ...
- Codeforces Round #475 (Div. 2) D. Destruction of a Tree
题意:给你一棵树, 只能删度数为偶数的点, 问你能不能将整个图删完, 如果能输入删除的顺序. 思路:对于一棵树来说, 如果里面的点的个数是偶数个则肯定不可能, 偶数个点有奇数条边,而你每次删只能删偶数 ...
- Codeforces Round #475 (Div. 2)
B. Messages 题意:有n个消息分别在ti的时候收到.设所有消息收到时初始值为A,每过一秒,其值减去B.当在某一秒选择读某个消息时,获值为当前消息的值:如果在某一秒结束的时候,手上有k则消息未 ...
- Codeforces Round #475 Div. 2 A B C D
A - Splits 题意 将一个正整数拆分成若干个正整数的和,从大到小排下来,与第一个数字相同的数字的个数为这个拆分的权重. 问\(n\)的所有拆分的不同权重可能个数. 思路 全拆成1,然后每次将2 ...
- 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 ...
- Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)
A. Alternating Sum 就是个等比数列,特判公比为 $1$ 的情况即可. #include <bits/stdc++.h> using namespace std; ; ; ...
- 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 ...
随机推荐
- 渗透测试_利用Burp爆破用户名与密码
burp 全称 Burp Suite, 是用于攻击web 应用程序的集成平台.它包含了许多工具,可以抓包可以爆破也可以扫描漏洞. 主要组件如下: Proxy——是一个拦截HTTP/S的代理服务器,作为 ...
- 快速导入导出Oracle数据demo(sqlldr、UTL_FILE)
本文演示快速sqlldr导入.UTL_FILE导出Oracle表数据实例 表结构如下,演示数据约112万,可自行准备. create table MemberPointDemo ( MEMBERID ...
- flask异常处理
对于异常,通常可以分为两类:一类是可以预知的异常,我们通常会用try...except....捕捉,第二类是未知的error,我们是无法预知的. try: code block except A: e ...
- 第十二次oo作业
作业十二 规格化设计简介 规格化设计的发展历史 1950年代,第一次分离,主程序与子程序的分离结构是树状模型,子程序可先于主程序编写.通过使用库函数来简化编程,实现最初的代码重用.产生基本的软件开发过 ...
- 我的2017&2018
最近项目进入验收阶段,所以上班没那么忙碌了,但是怎么说呢,我可能天生是闲不住的主,觉得浑身不自在(我这样的人是不是特别不会享福),此处应该有个笑脸哈. 翻看了博客园好几个大牛写的技术文章,感慨大牛不愧 ...
- 百度软件开发实习生c++方向面经(一面)
百度2017实习生软件开发(cpp方向) 首先说一下岗位.分为软件开发,开发测试,前端,机器学习数据挖掘,移动开发,据我观察,报的人数来看,软件开发最多,移动开发和开发测试较少.百度前台还准备了吃的喝 ...
- 割顶树 BZOJ1123 BLO
无向图中,求去掉点x[1,n]后每个联通块的大小. 考虑tarjan求bcc的dfs树,对于每个点u及其儿子v,若low[v]<prv[u],则v对u的父亲联通块有贡献,否则对u的子树有贡献.每 ...
- InvalidDataAccessResourceUsageException:mysql保留字引发的血案
org.springframework.dao.InvalidDataAccessResourceUsageException: could NOT EXECUTE statement; SQL [n ...
- Redis服务端的搭建(初级)
前方低能,仅适合入门级菜鸟阅读,大神大牛通通闪开! 前言:redis经常被用来做缓存(原因自行科普),基于学习的需要自己搭建了一个redis服务器,考虑到项目的分布式部署,所以前期开始的时候,redi ...
- WCF上传下载文件
思路:上传时将要上传的文件流提交给服务器端 下载时只需要将服务器上的流返回给客户端即可 1.契约,当需要传递的数量多于一个时就需要通过messagecontract来封装起来 这里分别实现了上传和下载 ...