和FallDream组队瞎打一通……B两个人写的都挂了233,最后只剩下FallDream写的A和我写的C,最后我yy了个E靠谱做法结果打挂了,结束之后改了改就A了,难受。

AC:AC Rank:180 Rating:2133-8->2125

A.Bear and Friendship Condition

题目大意;问一个无向图是否满足若a到b有边且b到c有边则a到c有边。(n<=150,000)

思路:判定每个连通块是不是团,不是则不满足,复杂度O(n)。

#include<cstdio>
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 150000
struct edge{int nx,t;}e[MN*+];
int h[MN+],en,r[MN+],u[MN+];
long long sum,cnt;
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;++r[x];
e[++en]=(edge){h[y],x};h[y]=en;++r[y];
}
void dfs(int x)
{
cnt+=u[x]=;sum+=r[x];
for(int i=h[x];i;i=e[i].nx)if(!u[e[i].t])dfs(e[i].t);
}
int main()
{
int n,m,x,y,i;
n=read();m=read();
while(m--)ins(read(),read());
for(i=;i<=n;++i)if(!u[i])
{
sum=cnt=;dfs(i);
if(cnt*(cnt-)!=sum)return *puts("NO");
}
puts("YES");
}

B.Bear and Different Names

题目大意:给定n,k和n-k+1个NO/YES,第i个NO/YES表示第i~i+k-1个字符串有/没有重复的字符串,要求构造一种合法方案。(k<=n<=50)

思路:倒着构造,先把后k-1个弄成各不相同,倒着每碰到一个NO就把第i个和第i+k-1个弄成相同的,否则弄成不同的。

#include<iostream>
using namespace std;
#define MN 50
int f[MN+],t[MN+];
string build(int x)
{
string s=x<?"A":"B";
return s+=x%+'a';
}
int main()
{
int n,k,i;string s;
cin>>n>>k;
for(i=;i<n;++i)f[i]=i;
for(i=;i<n-k+;++i)cin>>s,t[i]=s=="NO";
while(i--)if(t[i])f[i]=f[i+k-];
for(i=;i<n;++i)cout<<build(f[i])<<' ';
}

C.Bear and Tree Jumps

题目大意:给定一棵n个点的树,f(s,t)表示从s走到t,一次最多走k步,最少走几次,求Σf(i,j) (i<j)。(n<=200,000,k<=5)

思路:树形DP,ff[i]表示子树i内,所有节点走到根,共走了几个整的k步,f[i][j]表示子树i内,所有节点走到根,除去走的整的k步,剩下一步走了j的点有几个,每次合并子树信息并统计答案即可,复杂度O(n*k^2)。

#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.Bear and Company

题目大意:给定一个字符串,问你至少交换多少次相邻字符,才能使得字符串中不出现相邻的“VK”。(字符串长度<=75)

思路:用0表示V,用1表示K,用2表示其他字符,容易得出最后交换完,0,1,2各自的相对顺序不会改变,我们用f[i][j][k][0/1]表示最终答案的前i+j+k个由前i个0,前j个1,前k个2组成,最后一个是不是V时的最小花费,每次我们往状态里加一个字符,我们统计另外两种字符已加入状态的有多少个在原串中位置大于该字符,即为加入该字符的花费。复杂度O(飞快)。

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define MN 75
#define INF 0x3FFFFFFF
char s[MN+];
vector<int> v[];
int f[MN+][MN+][MN+][];
int main()
{
int n,i,j,k,l,cnt;
scanf("%d%s",&n,s);
for(i=;i<n;++i)
if(s[i]=='V')v[].push_back(i);
else if(s[i]=='K')v[].push_back(i);
else v[].push_back(i);
for(i=;i<=v[].size();++i)for(j=;j<=v[].size();++j)for(k=;k<=v[].size();++k)if(i||j||k)
{
f[i][j][k][]=f[i][j][k][]=INF;
if(i)
{
f[i][j][k][]=min(f[i-][j][k][],f[i-][j][k][]);
for(l=;l<j;++l)if(v[][l]>v[][i-])++f[i][j][k][];
for(l=;l<k;++l)if(v[][l]>v[][i-])++f[i][j][k][];
}
if(j)
{
cnt=f[i][j-][k][];
for(l=;l<i;++l)if(v[][l]>v[][j-])++cnt;
for(l=;l<k;++l)if(v[][l]>v[][j-])++cnt;
f[i][j][k][]=min(f[i][j][k][],cnt);
}
if(k)
{
cnt=min(f[i][j][k-][],f[i][j][k-][]);
for(l=;l<i;++l)if(v[][l]>v[][k-])++cnt;
for(l=;l<j;++l)if(v[][l]>v[][k-])++cnt;
f[i][j][k][]=min(f[i][j][k][],cnt);
}
}
printf("%d",min(f[i-][j-][k-][],f[i-][j-][k-][]));
}

E.Bear and Rectangle Strips

题目大意:给定一个2*n的数字矩阵,问最多能选出多少个互不相交的子矩阵和都为0。(n<=300,000)

思路:预处理出每个i作为右端点时第一行/第二行/两行一起向左最近的和为0的矩阵的左端点,用f[i]表示前2*i的数字矩阵的答案,每次转移有两种情况,一种直接两行一起取一个和为0的矩阵,利用预处理的信息直接转移,另一种情况是两行分别取若干个一行的子矩阵,我们用d(i,j)表示第一行i左边任意取,第二行j左边任意取的最大收益,采用记忆化搜索的方式计算,容易发现我们排除了大量的重复计算和无用状态,最终复杂度是比较科学的O(能过)。

#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 Cup 2017 - Round 1的更多相关文章

  1. 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 ...

  2. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3)(A.B.C,3道暴力题,C可二分求解)

    A. Is it rated? time limit per test:2 seconds memory limit per test:256 megabytes input:standard inp ...

  3. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A B C D 水 模拟 二分 贪心

    A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. 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 ...

  5. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) 题解【ABCDE】

    A. Vicious Keyboard 题意:给你一个字符串,里面只会包含VK,这两种字符,然后你可以改变一个字符,你要求VK这个字串出现的次数最多. 题解:数据范围很小,暴力枚举改变哪个字符,然后c ...

  6. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) A B C D 暴力 水 二分 几何

    A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) D - Dynamic Problem Scoring

    地址:http://codeforces.com/contest/807/problem/D 题目: D. Dynamic Problem Scoring time limit per test 2 ...

  8. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) E

    Description Bear Limak prepares problems for a programming competition. Of course, it would be unpro ...

  9. VK Cup 2017 - Round 1 (CDE)

    771C Bear and Tree Jumps 大意: 给定树,每步能走到距离不超过$k$的任意点,记$f(s,t)$为$s$到$t$的最少步数,求$\sum\limits_{s<t}f(s, ...

随机推荐

  1. mahony互补滤波器C编程

    //gx...分别为重力加速度在三个轴向的分力 由加速度计测得 //ax...分别为角速度在三个轴向的角速度 由陀螺仪测得 //最后得到最终滤波完毕的x.y.z方向的角度值(°) void IMUup ...

  2. 再一次, 不要使用(include/require)_once

    本文地址: http://www.laruence.com/2012/09/12/2765.html 最近关于apc.include_once_override的去留, 我们做了几次讨论, 这个APC ...

  3. Thinkphp框架部署步骤

    Thinkphp框架部署步骤 thinkphp框架部署起来简单,但是由于步骤较多也容易遗忘: 这是安装了集成环境后的一个www根目录结构: 然后需要在这个目录下面创建一个文件夹做项目:thinkphp ...

  4. 版本名称GA的含义:SNAPSHOT->alpha->beta->release->GA

    SNAPSHOT->alpha->beta->release->GA ----------------------------------------------------- ...

  5. antd 主题色

    如果是自己配置的reac项目,而非官方推荐的creat-react-app或者dva-cli等阿里自己开发的脚手架去引入antd,会有两个问题 第一,用babel-plugin-import设置sty ...

  6. Java-NIO(三):直接缓冲区与非直接缓冲区

    直接缓冲区与非直接缓冲区的概念: 1)非直接缓冲区:通过 static ByteBuffer allocate(int capacity) 创建的缓冲区,在JVM中内存中创建,在每次调用基础操作系统的 ...

  7. Java-Maven(一):Maven的简介与安装

    Maven的简介 Maven是什么? Maven是一个项目管理和整合的工具.Maven为开发者提供了一套完整的构建生命周期框架.开发者可以通过Maven更快的自动完成工程的基础构建陪孩子,因为Mave ...

  8. 南京邮电大学java程序设计作业在线编程第四次作业

    王利国的的 "Java语言程序设计第4次作业(2018)" 详细 主页 我的作业列表 作业结果详细 总分:100 选择题得分:40  1.下列方法定义中,正确的是() A.doub ...

  9. POJ-1700 Crossing River---过河问题(贪心)

    题目链接: https://vjudge.net/problem/POJ-1700 题目大意: 有N个人要渡河,但是只有一艘船,船上每次最多只能载两个人,渡河的速度由两个人中较慢的那个决定,小船来回载 ...

  10. python3安装ibm_db

    在安装好python3之后,使用pip install ibm_db总是报错. 然后按照官方文档的说明添加了环境变量IBM_DB_HOME, 同时在命令行执行easy_install ibm_db就可 ...