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

时间:2022-08-26 21:27:43

#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 &num;450&lbrack;集训队作业2018&rsqb;复读机

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

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

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

  3. UOJ &num;449&period; 【集训队作业2018】喂鸽子

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

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

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

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

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

  6. UOJ&num;422&period; 【集训队作业2018】小Z的礼物

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

  7. UOJ&num;428&period; 【集训队作业2018】普通的计数题

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

  8. &lbrack;UOJ422&rsqb;&lbrack;集训队作业2018&rsqb;小Z的礼物——轮廓线DP&plus;min-max容斥

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

  9. 2019&period;2&period;25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

随机推荐

  1. 9png图片制作

    制作步骤不多说了,这儿有链接:http://blog.csdn.net/pugongying1988/article/details/6938972 链接中去边框一个像素可以不用做,直接用androi ...

  2. 学习Entity Framework 中的Code First

    这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...

  3. 结合自己的程序对thinkphp模板常量的理解

    先上个图,有时候路径很多,没理解会搞混,看手册的说明 页面login.html模板的访问路径为http://www.tp.com/index.php/admin/Manager/login,测试他的常 ...

  4. python import详解

    1.import作用 引入模块 2.import的特点 一个程序中,import的模块不会重复被引用,如: # test1.py import test2 print test2.attr # tes ...

  5. UBNT ex-r &plus;netgear gs105e v2 &plus;ap 设置vlan 步骤记录 及相关知识整理

    设备连接:路由器ex-r的eth0 连接 光猫拨号,eth3连接交换机gs105e,交换机gs105e的eth3连接无线ap 需求:路由器拨号上网,通过不同ssid的无线网络可以连接不同vlan,且交 ...

  6. Hadoop小文件存储方案

    原文地址:https://www.cnblogs.com/ballwql/p/8944025.html HDFS总体架构 在介绍文件存储方案之前,我觉得有必要先介绍下关于HDFS存储架构方面的一些知识 ...

  7. 超简单的localStorage实现记住密码的功能

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...

  8. C&num;删除文件夹以及删除文件

    public static void DelectDir(string srcPath) { try { DirectoryInfo dir = new DirectoryInfo(srcPath); ...

  9. 08-部署node节点

    部署kubernetes node节点 kubernetes node 节点包含如下组件: Flanneld: 省略,参照之前部署的文档 Docker1.12.5: 省略,参照之前部署的文档 kube ...

  10. php 抛出异常信息try catch

    <meta charset="utf-8"> <?php /** * 自定义方法输出异常信息 */ $i=11; try { if ($i==1) { echo ...