#418. 【集训队作业2018】三角形

和三角形没有关系

只要知道儿子放置的顺序,就可以直接模拟了

记录历史最大值

用一个pair(a,b):之后加上a个,期间最大值为增加b个

合并?

A1+A2=(a1+a2,max(b1,a1+b2))

放置顺序考虑贪心

比较:

A放在B前面(和父亲进行合并)当且仅当(C=A+B).b<(D=B+A).b

分A.a和B.a的正负进行讨论

初始的pair:(w[x]-∑w[son[x]],w[x])把儿子会都扔掉

初始的pair放进堆里,取n-1次,和父亲合并,加入新的连通块的pair

链表维护操作序列

处理出操作顺序,模拟或者线段树合并

懒惰删除堆自带的bug

必须要使得决策堆和删除堆的元素的相对顺序是一样的!

小于号重载充分!不能出现决策堆A,B,删除堆B,A的情况!

小于号重载充分的话:

使得除非二者完全相等,否则必须有固定的大小顺序(未定义的话会有很多相等,比较就是随机的)

这样才能使得两个堆的相对位置相同。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=2e5+;
int n;
struct po{
ll a,b;
int id;
po(){}
po(ll aa,ll bb,ll dd){
a=aa;b=bb;id=dd;
}
po friend operator +(po a,po b){
return po(a.a+b.a,max(a.b,a.a+b.b),b.id);//warning!!! b.id
}
bool friend operator <(po a,po b){
// if(a.a==b.a&&a.b==b.b) return a.id<b.id;
if(a.a<=&&b.a>) return ;
if(a.a>&&b.a<=) return ;
if(a.a<=&&b.a<=){
if(a.b!=b.b) return a.b<b.b;
if(a.id!=b.id) a.id>b.id;
return a.a<b.a;
}
if(a.a-a.b!=b.a-b.b) return a.a-a.b<b.a-b.b;
if(a.id!=b.id) return a.id>b.id;
return a.a>b.a;
}
bool friend operator ==(po a,po b){
return (a.a==b.a)&&(a.b==b.b)&&(a.id==b.id);
}
void op(){
cout<<a<<" "<<b<<" : "<<id<<endl;
}
}nc[N],ori[N]; priority_queue<po>q,d; int ff[N];
int fin(int x){
return ff[x]==x?x:ff[x]=fin(ff[x]);
}
int st[N],nd[N];
struct lc{
int pre,nxt,id;
}p[N];
int pos[N];
struct node{
int ls,rs;
po ans;
}t[*N];
int tot;
int rt[N];
int vis[N];
void pushup(int x){
t[x].ans=t[t[x].ls].ans+t[t[x].rs].ans;
}
void upda(int &x,int l,int r,int p,po c){
x=++tot;
if(l==r){t[x].ans=c;return;}
if(p<=mid) upda(t[x].ls,l,mid,p,c);
else upda(t[x].rs,mid+,r,p,c);
pushup(x);
}
int merge(int x,int y){
if(!x||!y) return x+y;
t[x].ls=merge(t[x].ls,t[y].ls);
t[x].rs=merge(t[x].rs,t[y].rs);
pushup(x);
return x;
}
int pa[N],w[N];
ll ans[N];
int main(){
int haha;rd(haha);
rd(n);
for(reg i=;i<=n;++i) rd(pa[i]);
for(reg i=;i<=n;++i) {
rd(w[i]);ff[i]=i;
nc[i].id=i;
nc[i].a+=w[i];nc[i].b=w[i];
nc[pa[i]].a-=w[i];
p[i].pre=p[i].nxt=;
p[i].id=i;
st[i]=nd[i]=i;
}
for(reg i=;i<=n;++i) {
ori[i]=nc[i];
if(i!=)q.push(nc[i]);
}
int o=n-;
while(o--){
po now=q.top();q.pop();
// cout<<now.a<<" "<<now.b<<" "<<now.id<<endl;
if(now.id==){
cout<<" shit ";return ;
}
if(vis[now.id]){
cout<<" mmp "<<now.id<<" eqaul "<<(now==ori[now.id]);return ;
}
vis[now.id]=; int to=fin(pa[now.id]);
// cout<<" to "<<to<<endl;
ff[now.id]=to;
if(to!=){
d.push(nc[to]);
// cout<<" dele "<<endl;
// nc[to].op();
nc[to]=now+nc[to];
// nc[to].op();
// cout<<" over "<<endl;
q.push(nc[to]);
}
p[nd[now.id]].nxt=st[to];
p[st[to]].pre=nd[now.id];
st[to]=st[now.id]; while(q.size()&&d.size()) {
// po lp1=d.top(),lp2=q.top();
// cout<<" rubish "<<endl;
// lp2.op();lp1.op();
if(!(q.top()==d.top())) break;
q.pop(),d.pop();
}
}
for(reg i=;i<=n;++i){
if(!vis[i]){
cout<<" WTF "<<i;return ;
}
} int x=st[];
for(reg i=;i<=n;++i){
pos[x]=i;
x=p[x].nxt;
}
// prt(pos,1,n);
for(reg i=;i<=n;++i){
upda(rt[i],,n,pos[i],ori[i]);
}
// prt(rt,1,n); x=st[];
for(reg i=;i<=n;++i){
ans[x]=t[rt[x]].ans.b;
if(pa[x]){
rt[pa[x]]=merge(rt[pa[x]],rt[x]);
}
x=p[x].nxt;
}
prt(ans,,n);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/4/13 19:58:12
*/

UOJ#418. 【集训队作业2018】三角形的更多相关文章

  1. uoj #450[集训队作业2018]复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

  2. UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp

    LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...

  3. UOJ #449. 【集训队作业2018】喂鸽子

    UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...

  4. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  5. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  6. UOJ#422. 【集训队作业2018】小Z的礼物

    #422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...

  7. UOJ#428. 【集训队作业2018】普通的计数题

    #428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...

  8. uoj450 【集训队作业2018】复读机(生成函数,单位根反演)

    uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...

  9. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

随机推荐

  1. [转帖]Vim 编辑器底端 [noeol], [dos] 的含义

    Vim 编辑器底端 [noeol], [dos] 的含义 2012年11月28日 23:13:04 strongwangjiawei 阅读数:15484 https://blog.csdn.net/s ...

  2. mac下php开发环境的搭建

    1.phpstorm 在官网:https://www.jetbrains.com/phpstorm/,下载最新版:phpstorm-2016.2.1 在http://15.idea.lanyus.co ...

  3. png8、16、24、32位的区别

    我们都知道一张图片可以保存为很多种不同的格式,比如bmp/png/jpeg/gif等等.这个是从文件格式的角度看,我们抛开文件格式,看图片本身,我们可以分为8位, 16位, 24位, 32位等. 单击 ...

  4. CART算法与剪枝原理

    参考:https://blog.csdn.net/u014688145/article/details/53326910 知乎:https://www.zhihu.com/question/22697 ...

  5. RestTemplate proxy 设置方式

    RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory() {{ setProxy(new ja ...

  6. 三、checkedListBoxControl

    一.checkedListBoxControl的使用全选 private void InitDate() { CheckedListBoxItem[] itemArr = { new CheckedL ...

  7. vue实例相关

    第一种方法要比第二种更省事 if (!row.alert_at) return; if(row.alert_at){ } else { } v-for="todo in list" ...

  8. DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例

    本文已收录至:开源 DotNetty 实现的 Modbus TCP/IP 协议 ModbusFunction 类图如下: 如前文所述,所有请求/相应的 PDU 均继承自 ModbusFunction, ...

  9. JarvisOJ Basic 美丽的实验室Logo

    出题人丢下个logo就走了,大家自己看着办吧 扔进01Editor中,发现最后有14844个不属于jpg的字节 扔进Kali中用dd命令提取出附加的文件,可以看到也是一个图片,图片上的文字即是flag

  10. ab与nc命令,tcpdump命令

    ab与nc命令,tcpdump命令 ab  -p post.txt  -T  application/json   "http://127.0.0.1:8083/main/index&quo ...