C. Bank Hacking

题目大意:给出一棵n个节点的树,每个节点有一个权值,删掉一个点的代价为当前这个点的权值,并且会使其相邻点和距离为2且中间隔着未被删除的点的点权值加1,现在选一个点开始删,之后每次能删掉被删过的点的相邻点,问删掉整棵树,删各节点花费的最大值最小是多少。(n<=300,000)

思路:确定第一个删的点之后,与这个点相邻的点的删除花费是原权值加1,其他点是原权值加2,把所有点权加2后枚举一个点减2再把相邻的减1,线段树统计答案后改回去,总复杂度O(nlogn),O(n)也能做,不是很难,这里就不说了(zkw线段树好写又不用考虑各种情况,这题没有不用的道理)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{int x,f=1;char c;while((c=getchar())<'0'||c>'9')if(c=='-')f=0;for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=(x<<3)+(x<<1)+c-'0';return f?x:-x;
}
#define MN 300000
#define N 524288
struct edge{int nx,t;}e[MN*2+5];
int t[N*2+5],h[MN+5],en;
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 add(int k,int x){for(t[k+=N]+=x;k>>=1;)t[k]=max(t[k<<1],t[k<<1|1]);}
int main()
{int n=read(),i,j,ans=0x7FFFFFFF;memset(t,128,sizeof(t));for(i=1;i<=n;++i)t[i+N]=read()+2;for(i=N;--i;)t[i]=max(t[i<<1],t[i<<1|1]);for(i=1;i<n;++i)ins(read(),read());for(i=1;i<=n;++i){add(i,-2);for(j=h[i];j;j=e[j].nx)add(e[j].t,-1);ans=min(ans,t[1]);add(i,2);for(j=h[i];j;j=e[j].nx)add(e[j].t,1);}printf("%d",ans);
}

D.Police Stations

题目大意:给出一棵n个点的树,有k个警站分布在一些点上,现在可以删掉若干条边,使得各个点到警站的最短距离不超过d,保证一开始各个点都满足,要求输出最多删几条边并输出方案。(n<=300,000)

思路:每个点只要能走到最近的一个警站就可以了,其他边能删就删,我们从各个警站开始bfs,每个警站扩张自己的“地盘”,如果碰到别人的地盘,就把这条边删掉,复杂度O(n)。注意警站可能重点,很坑爹。

#include<cstdio>
inline int read()
{int x;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=x*10+c-'0';return x;
}
#define MN 300000
struct edge{int nx,t;}e[MN*2+5];
int h[MN+5],en=1,q[MN+5],qn,u[MN+5],f[MN+5],cnt,ans[MN+5];
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;
}
int main()
{int n,k,d,i,j;n=read();k=read();d=read();for(i=1;i<=k;++i)u[j=read()]?0:u[q[++qn]=j]=1;for(i=1;i<n;++i)ins(read(),read());for(i=1;i<=qn;++i)for(j=h[q[i]];j;j=e[j].nx)if(e[j].t!=f[q[i]])if(u[e[j].t])ans[j>>1]?0:(++cnt,ans[j>>1]=1);else u[q[++qn]=e[j].t]=1,f[e[j].t]=q[i];printf("%d\n",cnt);for(i=1;i<n;++i)if(ans[i])printf("%d ",i);
}

E.Exam Cheating

题目大意:一个人要作弊,她旁边坐着两个学霸,考卷总共n题,已知两个学霸已经答了哪些题,这个人最多可以看p次,每次可以选一个人看最多连续的k道题(无论那人是否答了),求最多可以抄到几道题。(n,p<=1000,k<=50)

思路:用f[i][j][x][y]表示从左到右看到第i题,已经启用了j次看题机会,第一个人之后还能看连续的x题,第二个人之后还能看连续的y题,转移时如果x或y还大于0就直接看这题,使x或y减1,否则如果有一个是0,我们选择不看这个人的这题或者新开一次看题机会并令x或y变成k-1,这样复杂度是O(npk^2),发现当p*k>=2n时我们可以直接看两个人的所有题目,所以只要在p<2n/k时dp,那么复杂度就只有O(n*n/k*k^2)=O(n^2*k)。

#include<cstdio>
#include<cstring>
inline int read()
{int x;char c;while((c=getchar())<'0'||c>'9');for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=x*10+c-'0';return x;
}
#define MN 1000
#define MK 50
int a[MN+5],b[MN+5],f[2][MN+5][MK+5][MK+5];
inline void up(int&a,int b){if(b>a)a=b;}
int main()
{int n,p,k,i,j,x,y,nw,nx,ans=0;n=read();p=read();k=read();for(i=read();i--;)++a[read()];for(i=read();i--;)++b[read()];if(p*k>=2*n){for(i=1;i<=n;++i)if(a[i]||b[i])++ans;return 0*printf("%d",ans);}memset(f[0],128,sizeof(f[0]));f[0][0][0][0]=0;for(i=0;i<n;++i){nw=i&1;nx=nw^1;memset(f[nx],128,sizeof(f[nx]));for(j=0;j<=p;++j)for(x=0;x<k;++x)for(y=0;y<k;++y)if(f[nw][j][x][y]>=0){if(x&&y)up(f[nx][j][x-1][y-1],f[nw][j][x][y]+(a[i+1]||b[i+1]));if(!x&&y){up(f[nx][j][0][y-1],f[nw][j][x][y]+b[i+1]);if(j<p)up(f[nx][j+1][k-1][y-1],f[nw][j][x][y]+(a[i+1]||b[i+1]));}if(x&&!y){up(f[nx][j][x-1][0],f[nw][j][x][y]+a[i+1]);if(j<p)up(f[nx][j+1][x-1][k-1],f[nw][j][x][y]+(a[i+1]||b[i+1]));}if(!x&&!y){up(f[nx][j][0][0],f[nw][j][0][0]);if(j<p)up(f[nx][j+1][k-1][0],f[nw][j][x][y]+a[i+1]),up(f[nx][j+1][0][k-1],f[nw][j][x][y]+b[i+1]);if(j+1<p)up(f[nx][j+2][k-1][k-1],f[nw][j][x][y]+(a[i+1]||b[i+1]));}}}printf("%d",f[nx][p][0][0]);
}

转载于:https://www.cnblogs.com/ditoly/p/CF408.html

Codeforces Round #408 (Div. 2)相关推荐

  1. Codeforces Round #408 (Div. 2)-C. Bank Hacking-(三种方法)分类讨论,二分,集合

    补题速度太慢了,这样可不行啊. 代码里都有解释. 看别人代码有三种写法 set,分类,和二分. 这是个是用分类思想写的, #include <bits/stdc++.h> using na ...

  2. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  3. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  4. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  5. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  6. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  7. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  8. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  9. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

最新文章

  1. Litmus代码质量平台实践总结
  2. NetBeans常用快捷键
  3. php 复选框 数组,php数组的复选框
  4. DVWA--Brute Force(暴力破解)--四个等级
  5. shownews.php,newsshow.php
  6. pymysql安装_第八章 nova组件安装2
  7. c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码
  8. 操作系统hpf算法事例_操作系统中常见算法汇总
  9. DR5白金版 for mac(PS一键磨皮插件Delicious Retouch)支持ps 2022
  10. 自定义一个ImageSwitcher
  11. 多重共线性的解决方法之——岭回归与LASSO
  12. Matplotlib Toolkits:python高级绘图库seaborn
  13. .NET配置文件的10大安全漏洞
  14. Linux编译安装Apache
  15. 截止失真放大电路_新手必看!基本放大电路应该如何分析?
  16. python爬虫爬取图片代码_python爬虫爬取图片的简单代码
  17. 台式计算机输入设备,简述常用的输入设备和输出设备有哪些 – 手机爱问
  18. Excel怎么转换成PDF?这两种转换方法看到就是赚到
  19. C# winform 工具箱、控件类型简介表
  20. 什么是字节对齐,为什么需要字节对齐

热门文章

  1. Django模型自定义查询管理器
  2. (一)编译器实现资料
  3. jQuery基本语法和选择器
  4. 无边框处理_PPT别再直接插图片,简单处理一下,瞬间提升你的PPT颜值
  5. 框架复习笔记-Java-案例:牛客网讨论社区
  6. R语言入门2---R语言基础绘图
  7. (二)k-means算法原理以及python实现
  8. Centos下通过wget方式下载jdk8
  9. 2020上海学区房楼市,到底发生了什么?
  10. jvm系列(五):Java GC 分析