【Codeforces Round #405 ( Div 2)】题解
签到题,直接模拟就可以了。
满足只能是每个朋友圈中每个人和其他人都是朋友,这样的边数的确定的。
然后并查集求每个朋友圈大小再判断是否合法就可以啦。
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define LL long long
#define maxn 300000
#define rep(i,l,r) for(int i=l;i<=r;i++)
using namespace std; LL size[maxn],e[maxn];
int fa[maxn],n,m; int find(int x)
{
if (fa[x]!=x) return fa[x]=find(fa[x]);
return x;
}
int main()
{
scanf("%d %d",&n,&m);
rep(i,,n) fa[i]=i,size[i]=,e[i]=;
rep(i,,m) {
int j,k;
scanf("%d %d",&j,&k);
int fa1=find(j),fa2=find(k);
if (fa1!=fa2) fa[fa2]=fa1,e[fa1]+=e[fa2],size[fa1]+=size[fa2];
++e[fa1];
}
int flag=;
rep(i,,n)
if (fa[i]==i && size[i]*(size[i]-)!=e[i]*) {
flag=;
// printf("%d %d %d\n",i,size[i],e[i]);
break;
}
printf("%s\n",flag?"YES":"NO");
return ;
}
构造题,构造方法是每次如果是NO就让第一个跟最后一个不一样就可以啦
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dow(i,l,r) for(int i=r;i>=l;i--)
using namespace std; int n,m,num[maxn];
char s[]; int main()
{
scanf("%d %d",&n,&m);
int tot=;
rep(i,,m-) num[i]=++tot;
rep(i,m,n) {
scanf("%s",s);
if (s[]=='N') num[i]=num[i-m+];
else num[i]=++tot;
}
rep(i,,n) {
printf("A");
while (num[i]) {
printf("%c",num[i]%+'a');
num[i]/=;
}
printf("%s",i<n?" ":"\n");
}
return ;
}
给一棵树,和一个k(<=5),表示每次可以跳超过k步,求整个树中任意两个点步数的和。
题解:由于k<=5,树dp
对于每个点记录到这个点步数余数l的和,每个子节点的子树到父亲节点步数对答案的共享,在把子节点的信息并到父节点里面,具体的答案计算
f[x][y]表示x的子树中走到x节点余y的步数总和
if (j+k<m) sum+=f[x][j]*s[too][k]+s[too][k]*s[x][j]+s[x][j]*f[too][k];
else sum+=f[x][j]*s[too][k]+s[too][k]*s[x][j]*2+s[x][j]*f[too][k];
(具体含义似乎是,大概是子树走到父和父走到子树,f[x][j]*s[too][k],表示too余k走到x余j一共要走s[too][k]次,s[too][k]*s[x][j]是x到too需要的步数(1步或者两步))
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define LL long long
#define maxn 300000
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define repedge(i,x) for(int i=fi[x];i;i=e[i].next)
using namespace std; typedef struct {
int toward,next;
}Edge; Edge e[maxn*];
LL f[maxn][],s[maxn][],sum;
int n,tot,m,chose[maxn],fi[maxn]; void addedge(int j,int k)
{
++tot;
e[tot].toward=k;
e[tot].next=fi[j];
fi[j]=tot;
} void dfs(int x)
{
// printf("%d\n",x);
chose[x]=;
f[x][]=,s[x][]=;
repedge(i,x) {
int too=e[i].toward;
if (!chose[too]) {
dfs(too);
rep(j,,m-) if (s[x][j])
rep(k,,m-)
if (s[too][k]) {
if (j+k<m) sum+=f[x][j]*s[too][k]+s[too][k]*s[x][j]+s[x][j]*f[too][k];
else sum+=f[x][j]*s[too][k]+s[too][k]*s[x][j]*+s[x][j]*f[too][k];
// printf("%d\n",sum);
}
// printf("%d\n",sum);
f[x][]+=f[too][m-]+s[too][m-];
s[x][]+=s[too][m-];
rep(j,,m-) f[x][j+]+=f[too][j],s[x][j+]+=s[too][j];
}
}
} int main()
{
scanf("%d %d",&n,&m);
rep(i,,n-) {
int j,k;
scanf("%d %d",&j,&k);
addedge(j,k);
addedge(k,j);
}
dfs();
// rep(i,1,n) {
// printf("\n");
// }
printf("%I64d\n",sum);
return ;
}
过的时候也非常有趣,最后10s debug然后没编译直接提交竟然过了……
给一个长度为n(<=75)的字符串,问要使字符串中不含vk需要的步数。
题解:这道题比赛不会,之后也不会,看了题解还是懵逼,最后看代码才读懂,dp果然是我的弱项。
用dp[i][j][k][l]表示已经使前面i+j+k个合法,i为V的个数,j为K的个数,k为非VK的个数,l取0/1表示最后一位是否为V
然后考虑加入一个数字,由于每次是相邻两个数的交换,所以在之前的调整过程中,除了前面调整选的i+j+k,其他还没被选的字符在字符串中的相对位置还是不变的。现在考虑把一个字符提到i+j+k+1这个位置,那移动步数就是在这个字符前面还没选的字符个数,相同的V,K或者非VK间相对位置一定不变,所以这个移动步数也可以通过扫一边得出来。
然后就是转移,具体就是结尾是V后面就不能K。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dow(i,l,r) for(int i=r;i>=l;i--)
#define maxn 80
#define inf 1<<28
#define LL long long
using namespace std; vector<int> V,K,X;
char s[];
int n,f[][][][],cost[]; int main()
{
scanf("%d",&n);
scanf("%s",s);
rep(i,,n-) {
if (s[i]=='V') V.push_back(i);
else
if (s[i]=='K') K.push_back(i);
else X.push_back(i);
}
int totv=(int)V.size(),totx=(int)X.size(),totk=(int)K.size();
rep(i,,totv)
rep(j,,totk)
rep(k,,totx)
f[i][j][k][]=f[i][j][k][]=inf;
f[][][][]=;
rep(i,,totv)
rep(j,,totk)
rep(k,,totx) {
// printf("%d %d\n",f[i][j][k][0],f[i][j][k][1]);
int now1=i,now2=j,now3=k;
cost[]=;
rep(l,,n-) {
cost[l]=cost[l-];
if (now1<totv && V[now1]<l) ++cost[l],++now1;
if (now2<totk && K[now2]<l) ++cost[l],++now2;
if (now3<totx && X[now3]<l) ++cost[l],++now3;
}
// printf("%d %d %d\n",i,j,k);
// rep(l,0,n-1) printf("%4d",cost[l]);printf("\n");
if (i<totv)
f[i+][j][k][]=min(f[i+][j][k][],
min(f[i][j][k][],f[i][j][k][])+cost[V[i]]);
if (j<totk) {
f[i][j+][k][]=min(f[i][j+][k][],
f[i][j][k][]+cost[K[j]]);
}
if (k<totx) {
f[i][j][k+][]=min(f[i][j][k+][],
min(f[i][j][k][],f[i][j][k][])+cost[X[k]]);
}
}
printf("%d\n",min(f[totv][totk][totx][],f[totv][totk][totx][]));
return ;
}
学题解用了顺推的dp方式。
总的来说还是太弱了,第三题的构造和第五题的dp在比赛的时候都没有写出来。
【Codeforces Round #405 ( Div 2)】题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- Codeforces Round #160 (Div. 1) 题解【ABCD】
Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...
- Codeforces Round #383 (Div. 2) 题解【ABCDE】
Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...
- Codeforces Round #271 (Div. 2)题解【ABCDEF】
Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...
随机推荐
- 8、Java并发编程:同步容器
Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...
- 关于DataTable.Select方法偶尔无法正确查到数据的处理方法
项目中经常用DataTable在内存中存储并操作数据,在进行报表开发的时候,报表的各种过滤功能用这个内存表可以大现身手,但最近在使用过程中却遇到一个奇怪的现象,现将该问题及处理方法记录一下.这是在做护 ...
- 在Linux CentOS7系统中搭建LNMP
LNMP就是Linux+Nginx+MySQL+PHP,既然是在Linux CentOS7那么Linux就是已经安装好了.所以接下百度一下接下来的教程,整理测试如下: 教程是centos6.2的有点老 ...
- Allure--自动化测试报告生成
之前尝试使用过testNG自带的测试报告.优化过reportNG的测试报告,对这两个报告都不能满意.后经查找资料,发现有个神器: Allure(已经有allure2了,笔者使用的就是allure2), ...
- Java 集合学习--HashMap
一.HashMap 定义 HashMap 是一个基于散列表(哈希表)实现的键值对集合,每个元素都是key-value对,jdk1.8后,底层数据结构涉及到了数组.链表以及红黑树.目的进一步的优化Has ...
- 深度学习图像分割——U-net网络
写在前面: 一直没有整理的习惯,导致很多东西会有所遗忘,遗漏.借着这个机会,养成一个习惯. 对现有东西做一个整理.记录,对新事物去探索.分享. 因此博客主要内容为我做过的,所学的整理记录以及新的算法. ...
- Ubuntu14.04下部署FastDFS 5.08+Nginx 1.9.14
最新的版本可以在这里获取,目前下载的最新版本是5.08,更新于2016-02-03.在这里可以找到更多的说明. 下载好后,server端分为两个部分,一个是tracker,一个是storage.顾 ...
- Python3 深浅拷贝
一 定义 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已. 浅拷贝: 浅拷贝值只拷贝一层,具有自 ...
- C语言中动态内存的分配(malloc,realloc)
动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...
- 软工冲刺-Alpha 冲刺 (3/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...