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=;char c;
while((c=getchar())<''||c>'')if(c=='-')f=;
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return f?x:-x;
}
#define MN 300000
#define N 524288
struct edge{int nx,t;}e[MN*+];
int t[N*+],h[MN+],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>>=;)t[k]=max(t[k<<],t[k<<|]);}
int main()
{
int n=read(),i,j,ans=0x7FFFFFFF;
memset(t,,sizeof(t));
for(i=;i<=n;++i)t[i+N]=read()+;
for(i=N;--i;)t[i]=max(t[i<<],t[i<<|]);
for(i=;i<n;++i)ins(read(),read());
for(i=;i<=n;++i)
{
add(i,-);
for(j=h[i];j;j=e[j].nx)add(e[j].t,-);
ans=min(ans,t[]);
add(i,);
for(j=h[i];j;j=e[j].nx)add(e[j].t,);
}
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())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return x;
}
#define MN 300000
struct edge{int nx,t;}e[MN*+];
int h[MN+],en=,q[MN+],qn,u[MN+],f[MN+],cnt,ans[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;
}
int main()
{
int n,k,d,i,j;
n=read();k=read();d=read();
for(i=;i<=k;++i)u[j=read()]?:u[q[++qn]=j]=;
for(i=;i<n;++i)ins(read(),read());
for(i=;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>>]?:(++cnt,ans[j>>]=);
else u[q[++qn]=e[j].t]=,f[e[j].t]=q[i];
printf("%d\n",cnt);
for(i=;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())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return x;
}
#define MN 1000
#define MK 50
int a[MN+],b[MN+],f[][MN+][MK+][MK+];
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=;
n=read();p=read();k=read();
for(i=read();i--;)++a[read()];
for(i=read();i--;)++b[read()];
if(p*k>=*n)
{
for(i=;i<=n;++i)if(a[i]||b[i])++ans;
return *printf("%d",ans);
}
memset(f[],,sizeof(f[]));f[][][][]=;
for(i=;i<n;++i)
{
nw=i&;nx=nw^;
memset(f[nx],,sizeof(f[nx]));
for(j=;j<=p;++j)for(x=;x<k;++x)for(y=;y<k;++y)if(f[nw][j][x][y]>=)
{
if(x&&y)up(f[nx][j][x-][y-],f[nw][j][x][y]+(a[i+]||b[i+]));
if(!x&&y)
{
up(f[nx][j][][y-],f[nw][j][x][y]+b[i+]);
if(j<p)up(f[nx][j+][k-][y-],f[nw][j][x][y]+(a[i+]||b[i+]));
}
if(x&&!y)
{
up(f[nx][j][x-][],f[nw][j][x][y]+a[i+]);
if(j<p)up(f[nx][j+][x-][k-],f[nw][j][x][y]+(a[i+]||b[i+]));
}
if(!x&&!y)
{
up(f[nx][j][][],f[nw][j][][]);
if(j<p)up(f[nx][j+][k-][],f[nw][j][x][y]+a[i+]),
up(f[nx][j+][][k-],f[nw][j][x][y]+b[i+]);
if(j+<p)up(f[nx][j+][k-][k-],f[nw][j][x][y]+(a[i+]||b[i+]));
}
}
}
printf("%d",f[nx][p][][]);
}

Codeforces Round #408 (Div. 2)的更多相关文章

  1. Codeforces Round #408 (Div. 2)(A.水,B,模拟)

    A. Buying A House time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  2. Codeforces Round #408 (Div. 2)C. Bank Hacking(STL)

    题目链接:http://codeforces.com/problemset/problem/796/C 题目大意:有n家银行,第一次可以攻击任意一家银行(能量低于自身),跟被攻击银行相邻或者间接相邻( ...

  3. Codeforces Round #408 (Div. 2) C. Bank Hacking

    http://codeforces.com/contest/796/problem/C Although Inzane successfully found his beloved bone, Zan ...

  4. Codeforces Round #408 (Div. 2) A B C 模拟 模拟 set

    A. Buying A House time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. Codeforces Round #408 (Div. 2) D - Police Stations

    地址:http://codeforces.com/contest/796/problem/D 题目: D. Police Stations time limit per test 2 seconds ...

  6. Codeforces Round #408 (Div. 2) B

    Description Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, n ...

  7. Codeforces Round #408 (Div. 2) 题解【ABCDE】

    A - Buying A House 题意:给你n个房间,妹子住在第m个房间,你有k块钱,你想买一个离妹子最近的房间.其中相邻的房间之间距离为10,a[i]=0表示已经被别人买了. 题解:扫一遍更新答 ...

  8. Codeforces Round #408 (Div. 2) D. Police Stations(最小生成树+构造)

    传送门 题意 n个点有n-1条边相连,其中有k个特殊点,要求: 删去尽可能多的边使得剩余的点距特殊点的距离不超过d 输出删去的边数和index 分析 比赛的时候想不清楚,看了别人的题解 一道将1个联通 ...

  9. Codeforces Round #408 (Div. 2) C.Bank Hacking(二分)

    传送门 题意 给出n个银行,银行之间总共有n-1条边,定义i与j有边相连为neighboring,i到j,j到k有边,则定义i到k的关系为semi- neighboring, 每家银行hack的难度为 ...

随机推荐

  1. 20155306 2006-2007-2 《Java程序设计》第3周学习总结

    20155306 2006-2007-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 4.1 类与对象 定义类 1.先在程序中定义类: Clothes{ Str ...

  2. Week1绪论--抽象数据类型

    一.作业题目 1.构造有理数T,元素e1,e2分别被赋以分子.分母值 2.销毁有理数T 3.用e(引用类型参数)返回有理数T的分子或分母,当入参i为1时返回分子, i为2是返回分母. 4.将有理数T的 ...

  3. PTA題目的處理(三)

    题目7-1 高速公路超速處罰 1.實驗代碼 #include <stdio.h> //#include <stdlib.h> int main() { int csp,lsp; ...

  4. 第201621123043 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 2 ...

  5. 关于 Bootstrap的知识

    Bootstrap是简单.灵活的用于搭建WEB页面的HTML.CSS.Javascript的工具集.Bootstrap基于HTML5和CSS3,具有漂亮的设计.友好的学习曲线.卓越的兼容性,还有12列 ...

  6. python hashlib、hmac模块

    一.hashlib模块 import hashlib m = hashlib.md5() m.update(b"Hello") print(m.hexdigest()) m.upd ...

  7. PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式

    php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大 ...

  8. Jenkins中展示HTML测试报告

    背景:测试报告是用reportNG生成的,属于java自动化测试项目. 1)         安装插件 首先要安装HTML Publisher plugin,这个在插件管理里面搜索并安装即可,如下我已 ...

  9. HTML中的上下标标签的演示

    HTML中的上下标标签的演示 #table_head>td { font-weight: bold } tr { text-align: center } 作用 标签 演示代码 呈现效果 上标 ...

  10. POJ-2485 Highways---最小生成树中最大边

    题目链接: https://vjudge.net/problem/POJ-2485 题目大意: 求最小生成树中的最大边 思路: 是稠密图,用prim更好,但是规模不大,kruskal也可以过 #inc ...