博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 5290 [十二省联考2019]春节十二响——堆
阅读量:5312 次
发布时间:2019-06-14

本文共 2137 字,大约阅读时间需要 7 分钟。

题目:

考场上想到了一个子树里如果有多个 “段” 准备和其他位置的 “段” 拼在一起,那么这个子树里的这些 “段” 一定两两间互相有父子关系。

准备设计一个 DP ,但觉得很难弄。比如很难存下状态,因为还要存 “有几个待合并的“段”” 、“那些“段”的最大值是什么” 之类的。所以就只写了 60 分。

#include
#include
#include
#define ll long longusing namespace std;int rdn(){ int ret=0;bool fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){
if(ch=='-')fx=0;ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar(); return fx?ret:-ret;}ll Mx(ll a,ll b){
return a>b?a:b;}ll Mn(ll a,ll b){
return a
=dfn[y]&&dfn[x]<=ot[y])||(dfn[y]>=dfn[x]&&dfn[y]<=ot[x]);} void solve() { ini_dfs(1); bin[0]=1; for(int i=1;i<=n;i++)bin[i]=bin[i-1]<<1; for(int s=0;s
v;} void dfsa(int cr,int fa) { a[++ta]=c[cr]; for(int i=hd[cr],v;i;i=nxt[i]) if((v=to[i])!=fa) dfsa(v,cr); } void dfsb(int cr,int fa) { b[++tb]=c[cr]; for(int i=hd[cr],v;i;i=nxt[i]) if((v=to[i])!=fa) dfsb(v,cr); } void solve() { if(cd[1]==1) { for(int i=1;i<=n;i++)ans+=c[i]; printf("%lld\n",ans); return; } dfsa(to[hd[1]],1); dfsb(to[nxt[hd[1]]],1); sort(a+1,a+ta+1,cmp); sort(b+1,b+tb+1,cmp); for(int i=1,lm=Mn(ta,tb);i<=lm;i++) ans+=Mx(a[i],b[i]); if(ta
1){fg=1;break;} if(!fg&&cd[1]<=2){S2::solve();return 0;} return 0;}

其实从 “链” 的部分受到启发,如果两个部分互相没有父子关系,就是把最大值和最大值放在一段,次大值和次大值放在一段这样贪心。

那么在树上也可以贪心(而不是 DP ),不用管 “有几个待合并的段” ,直接把子树里的所有已有的 “段” 都视作待合并的,那么就用大根堆维护子树里的 “段”。在 dfs 树的时候,合并两个子树就用堆的启发式合并即可。

#include
#include
#include
#include
#define ll long longusing namespace std;int rdn(){ int ret=0;bool fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){
if(ch=='-')fx=0;ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar(); return fx?ret:-ret;}int Mx(int a,int b){
return a>b?a:b;}int Mn(int a,int b){
return a
q[N];void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}void dfs(int cr){ for(int i=hd[cr],v;i;i=nxt[i]) { dfs(v=to[i]); if(q[rt[cr]].size()

 

转载于:https://www.cnblogs.com/Narh/p/10666680.html

你可能感兴趣的文章
oc2---类
查看>>
3. 尾缀
查看>>
.net之工作流工程展示及代码分享(三)数据存储引擎
查看>>
HDU - 2680(逆向思维,djikstra
查看>>
overflow:auto学习
查看>>
Android屏幕设置只允许上下旋转
查看>>
Android杂谈--修改Android系统内/system目录权限使其可读写
查看>>
函数式语言
查看>>
android 解析XML方式(二)
查看>>
ASP.Net AJAX CalendarExtender 使用
查看>>
oracle 触发器
查看>>
已有数据的表添加自增主键
查看>>
js中数组的用法
查看>>
20145233韩昊辰 第三次实验报告
查看>>
struts2解耦和获取提交的值
查看>>
Kafka实现细节(三)
查看>>
Eclipse+Maven构建web项目及部署时Maven lib依赖问题的解决
查看>>
【整理】LINUX下使用CMAKE安装MYSQL
查看>>
【Linux】Centos配置ssh无密码登录
查看>>
BZOJ3689 异或之
查看>>