VK CUP2017 ROUND 1
来自FallDream的博客。未经允许,请勿转载,谢谢。
----------------------------------------------------
和ditoly组队打vkcup,原来以为是正常div2难度,结果发现.....不说了 AB都被叉了一遍,又掉分 .......
-------------------------
A.给定n个人和m组朋友关系,判断这个图是否满足性质:如果x和y是朋友,y和z是朋友,那么x和z是朋友 n,m<=150000
题解:很容易发现满足关系的图是团,所以我们对每个联通块判一下就可以了。
n的范围很奇怪,我没注意,结果被hack了,发现150000*149999会爆int....
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int cnt=,n,m;
struct edge{
int to,next;
}e[];
int head[];
ll num,sum;
bool mark[]; inline void ins(int u,int v)
{
e[++cnt].next=head[u];head[u]=cnt;
e[cnt].to=v;
} void dfs(int x)
{
mark[x]=;num++;
for(int i=head[x];i;i=e[i].next,sum++)if(!mark[e[i].to])
dfs(e[i].to);
} int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{int a=read();int b=read();ins(a,b);ins(b,a);}
for(int i=;i<=n;i++)if(!mark[i])
{num=sum=;dfs(i);
if(num>&&sum!=(num-)*num)return *puts("NO");
// if(num==2&&sum!=2)return 0*puts("NO");
}
puts("YES");
return ;
}
B.给定n,k,表示有n个名字,然后给定n-k+1个条件,每个条件是YES/NO,表示从它开始的连续k个名字有没有相同的(YES表示没有),你要构造出满足题意的名字,保证有解。n<=50
题解:我们先把全部都赋成不同的名字,然后从后往前,如果第i个是NO,那么把它变成和i+k-1一样。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int k,cnt=,n;
string name[],s;
char st[];
int res[]; string getnewname()
{
cnt++;s="A";
for(int i=cnt;i>;i-=)s=s+(char)((i-)%+'a');
return s;
} int pd(){scanf("%s",st+);return st[]=='Y'?:;} int main()
{
n=read();k=read();
for(int i=;i+k-<=n;i++) res[i]=pd();
for(int i=;i<=n;i++)name[i]=getnewname();
for(int i=n-k+;i;i--)if(res[i]) name[i]=getnewname();
else name[i]=name[i+k-];
for(int i=;i<=n;i++)cout<<name[i]<<" ";
return ;
}
C.有一棵树,每条边的权值是1,然后给定k,表示你一步可以走的距离为k。令Fst表示从s到t要走多少步,求Fij,1<=i<j<=n n<=200000 k<=5
题解:乱dp,一个表示走多少步,另一个表示没走满一步的个数。
#include<cstdio>
#include<iostream>
using namespace std;
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 200000
struct edge{int nx,t;}e[MN*+];
int k,h[MN+],en,f[MN+][];
long long ans,ff[MN+];
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
void dfs(int x,int fa)
{
int i,j,l;
f[x][]=;
for(i=h[x];i;i=e[i].nx)if(e[i].t!=fa)
{
dfs(e[i].t,x);
for(j=;j<k;++j)
{
ans+=1LL*f[e[i].t][j]*ff[x]+1LL*f[x][j]*ff[e[i].t];
for(l=;l<k;++l)ans+=1LL*f[e[i].t][j]*f[x][l]*((j+l)/k+);
}
for(j=;j<k;++j)f[x][j]+=f[e[i].t][j-];
f[x][]+=f[e[i].t][k-];ff[x]+=ff[e[i].t]+f[e[i].t][k-];
}
}
int main()
{
fread(B,,<<,stdin);
int n=read(),i;k=read();
for(i=;i<n;++i)ins(read(),read());
dfs(,);
cout<<ans;
}
D.给定一个长度为n的字符串,每次你可以交换一对连续的字符,求最少的交换次数,使得字符串中没有连续的两个是"VK" n<=75
题解:我们把不是VK的字符看作一种,然后用f[i][j][k][0/1]表示前i个V,j个K,k个不是VK的字符,最后一位是/不是V的最小交换数。
我们枚举最后一位放什么,那么它需要额外的交换次数是前i个V,j个K,k个其他字符中在它之后的个数(因为那些要从后面移到前面),然后就可以转移啦。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} vector<int> v,k,o;
int n;
char st[];
ll f[][][][]; int main()
{
n=read();memset(f,,sizeof(f));
scanf("%s",st+);
for(int i=;i<=n;i++)
if(st[i]=='V') v.push_back(i);
else if(st[i]=='K')k.push_back(i);
else o.push_back(i);
f[][][][]=;
for(int i=;i<=v.size();i++)
for(int j=;j<=k.size();j++)
for(int l=;l<=o.size();l++)
for(int c=;c<=;c++)
{
if((!i)&&(!c))continue;
if((!j)&&c==)continue;
if((!l)&&c==)continue;
int pos,num=;
if(!c) pos=v[i-];
else if(c==) pos=k[j-];
else pos=o[l-];//cout<<pos<<endl;
for(int m=i;m<v.size()&&v[m]<pos;m++)num++;//cout<<num<<endl;
for(int m=j;m<k.size()&&k[m]<pos;m++)num++;//cout<<num<<endl;
for(int m=l;m<o.size()&&o[m]<pos;m++)num++;
// cout<<num<<endl;
if(c==)for(int m=;m<=;m++) f[i][j][l][]=min(f[i][j][l][],f[i-][j][l][m]+num);
if(c==)for(int m=;m<=;m++) f[i][j][l][]=min(f[i][j][l][],f[i][j-][l][m]+num);
if(c==)for(int m=;m<=;m++) f[i][j][l][]=min(f[i][j][l][],f[i][j][l-][m]+num);
// cout<<i<<" "<<j<<" "<<l<<" "<<f[i][j][l][0]<<" "<<f[i][j][l][1]<<endl;
}
int a=v.size(),b=k.size(),c=o.size();
cout<<min(f[a][b][c][],f[a][b][c][]);
return ;
}
E.给定一个2*n的矩阵,你要选出最多的和为0且不相交的矩阵,求出最多的数量。n<=300000
题解:记忆化搜索,每次选择比较靠后的往前跳,貌似是卡不掉的。
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
char B[<<],*S=B,C;ll X,F;
inline ll read()
{
for(F=;(C=*S++)<''||C>'';)if(C=='-')F=-;
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X*F;
}
#define MN 300000
#define d(x,y) make_pair(x,y)
ll s[MN+][];
int t[MN+][],f[MN+];
map<ll,int> mp;
map<pair<int,int>,int> u,ff;
int cal(int x,int y)
{
if(u[d(x,y)])return ff[d(x,y)];
return u[d(x,y)]=,ff[d(x,y)]=max(f[min(x,y)],t[x][]>t[y][]?cal(t[x][],y)+:cal(x,t[y][])+);
}
int main()
{
fread(B,,<<,stdin);
int n=read()+,i,j,k,l;
for(i=;i<=n;++i)s[i][]=s[i-][]+read();
for(i=;i<=n;++i)s[i][]=s[i-][]+read(),s[i][]=s[i][]+s[i][];
for(l=;l<;++l)for(mp.clear(),i=;i<=n;++i)t[i][l]=max(t[i-][l],mp[s[i][l]]),mp[s[i][l]]=i;
f[]=t[][]=t[][]=-;u[d(,)]=;ff[d(,)]=-;
for(i=;i<=n;++i)f[i]=max(f[t[i][]]+,cal(i,i)),ff[d(i,i)]=f[i];
printf("%d",f[n]);
}
VK CUP2017 ROUND 1的更多相关文章
- codeforce vk cup2017
D. k-Interesting Pairs Of Integers time limit per test 2 seconds memory limit per test 256 megabytes ...
- ATC/TC/CF
10.25 去打 CF,然后被 CF 打了. CF EDU 75 A. Broken Keyboard 精神恍惚,WA 了一发. B. Binary Palindromes 比赛中的憨憨做法,考虑一个 ...
- DP VK Cup 2012 Qualification Round D. Palindrome pairs
题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 /* 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 ...
- VK Cup 2012 Round 3 (Unofficial Div. 2 Edition)
VK Cup 2012 Round 3 (Unofficial Div. 2 Edition) 代码 VK Cup 2012 Round 3 (Unofficial Div. 2 Edition) A ...
- Codeforces Round VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM 暴力出奇迹!
VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM Time Lim ...
- Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals)
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A.String Reconstruction B. High Load C ...
- Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...
- Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 菜鸡只会ABC!
Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 全场题解 菜鸡只会A+B+C,呈上题解: A. Bear and ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)
A. Vicious Keyboard time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...
随机推荐
- nyoj水池数目
水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...
- 1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
解决问题:windows下:修改my.ini 在[mysqld]内加入secure_file_priv = linux下:修改my.cnf 在[mysqld]内加入secure_file_priv = ...
- Mego(03) - ORM框架的新选择
前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...
- Zookeeper分布式服务协调组件
1.简介 Zookeeper是一个分布式服务协调组件,是Hadoop.Hbase.Kafka的重要组件,它是一个为分布式应用提供一致性服务的组件. Zookeeper的目标就是封装好复杂易出错的服 ...
- word2vec初探(用python简单实现)
为什么要用这个? 因为看论文和博客的时候很常见,不论是干嘛的,既然这么火,不妨试试. 如何安装 从网上爬数据下来 对数据进行过滤.分词 用word2vec进行近义词查找等操作 完整的工程传到了我的gi ...
- Android 自定义控件高度设置onMeasure方法
最近使用hellocharts需要表格横向显示,而activity需要竖屏显示,在旋转以后,默认宽度为不超过屏幕宽度,则一直无法显示全控件. 此时需要修改onMeasure方法,这个方法是用来控制控件 ...
- 在GridControl表格控件中实现多层级主从表数据的展示
在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...
- python运算符重载(二)
一.基础知识 定义:当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们 特性: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有Python ...
- 深度学习中Xavier初始化
"Xavier"初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文<Understanding the difficulty of training ...
- OS模块文件操作一
1 文件操作 1.1 OS模块 l import os #引入os模块 l import os.path #引入os下的path子模块 l os ...