[ CodeVS冲杯之路 ] P1091
不充钱,你怎么AC?
题目:http://codevs.cn/problem/1091/
大家都写的 DFS,然而我想到了一种贪心的做法,重点是可以A
普遍的贪心是每次删掉该深度子树最大的点,但是如果有一边卡一条链就会WA
我们何不进一步考虑贪心,如果它下面是一条链我们就可以缓一缓到第 2 天再删是不是,反正它每次也就增加一个人
用 size[x] 记录所有后代加上自己的节点个数,f[x] 记录其最大子树的 size 值
我们考虑第一次不删这个节点,让它先扩展一次,然后第二次再删除它子树中 size 最大的节点
那么设 g[x]=size[x]-f[x],g 就为第一次不删,第二次删掉其最大的子树还剩余的节点数
一条链的 g[x]=1,而一个多叉节点的 g[x]>1,这就意味着先要删去 g 值更大的那个节点,才能不让它下一次扩展更多的出来
那么一层层地贪心,每次删掉 g 值最大的节点,直到不再继续传染为止
贪心跑得飞快~
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stack>
using namespace std; const int N=;
stack<int> s,q;
int first[N],v[N*],next[N*],size[N],g[N],f[N];
void dfs(int x,int fa)
{
f[x]=fa;
int i;
for (i=first[x];i;i=next[i])
{
if (v[i]==fa) continue;
dfs(v[i],x);
if (size[v[i]]>g[x]) g[x]=size[v[i]];
}
size[fa]+=size[x];
}
int main()
{
int n,m,i,x,ans=;
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
{
scanf("%d%d",&x,&v[i]);
v[i+m]=x;
next[i]=first[x];
first[x]=i;
next[i+m]=first[v[i]];
first[v[i]]=i+m;
}
for (i=;i<=n;i++) size[i]=;
dfs(,);
for (i=;i<=n;i++) g[i]=size[i]-g[i];
s.push();
g[]=size[]=;
ans=n;
while (!s.empty())
{
m=;
while (!s.empty())
{
x=s.top();
s.pop();
for (i=first[x];i;i=next[i])
{
if (v[i]==f[x]) continue;
if (g[v[i]]>g[m]||(g[v[i]]==g[m]&&size[v[i]]>size[m])) m=v[i];
q.push(v[i]);
}
}
while (!q.empty())
{
x=q.top();
q.pop();
if (x==m) ans-=size[m];
else s.push(x);
}
}
printf("%d\n",ans);
return ;
}
这里有个DFS的:http://blog.csdn.net/yuyanggo/article/details/48087431
贪心的做法证明有人会严谨的吗?会的话告诉我谢谢!
[ CodeVS冲杯之路 ] P1091的更多相关文章
- [ CodeVS冲杯之路 ] P1368
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...
- [ CodeVS冲杯之路 ] P1092
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...
- [ CodeVS冲杯之路 ] P3955
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...
- [ CodeVS冲杯之路 ] P1165
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节 ...
- [ CodeVS冲杯之路 ] P1053
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...
- [ CodeVS冲杯之路 ] P1171
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...
- [ CodeVS冲杯之路 ] P1197
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...
- [ CodeVS冲杯之路 ] P2492
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直 ...
- [ CodeVS冲杯之路 ] P2456
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木 ...
随机推荐
- gcc常用语法
1. gcc -E source_file.c-E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码. 3. g ...
- PAT (Basic Level) Practice 1006 换个格式输出整数
个人练习 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为 ...
- HDU 3364 高斯消元
Lanterns Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- Permute Digits 915C
You are given two positive integer numbers a and b. Permute (change order) of the digits of a to con ...
- python-8错误调试测试
1-错误处理 import logging try: print('try.......') r = 10/0 except ValueError as e: print('result:', e) ...
- Too many parameters: expected 1, was given 2 Query: SELECT count(id) FROM `user` WHERE username = ?; Parameters: [org.apache.commons.dbutils.handlers.ScalarHandler@453da22c, [李明]]
public Object getValue(String sql,Object... args) { Connection conn = null; Object obj= null; try { ...
- Android面试收集录13 Android虚拟机及编译过程
一.什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...
- linux压缩和解压缩命令大全--费元星站长
tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...
- spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略: <dependency> <groupId>redis.clients</grou ...
- 转载: keepalived工作原理和配置说明
转自:http://outofmemory.cn/wiki/keepalived-configuration keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件, ...