uo什么意思_2018五大学科集训队

uo什么意思_2018五大学科集训队uoj#418. 【集训队作业2018】三角形(线段树合并)

大家好,又见面了,我是你们的朋友全栈君。

传送门

好迷啊……膜一下ljz

考虑每个操作,如果把操作按先后顺序放到序列上的话,操作一就是把\(w_i\)的石子放到某个节点,那么就是在序列末端加入\(w_i\),然后根据贪心肯定要把它所有儿子的石子拿走,也就是要减去\(\sum w_{son}\)

那么每个点的答案就是序列的最大前缀

因为父亲节点的操作一要在儿子之后进行,很麻烦,那么可以每次在自己这里把\(w_i\)减掉,到父亲的时候再加回去

记\((x,y)\)为一个二元组,\(x\)表示当前位置的最大前缀和,\(y\)表示最小后缀和,然后定义一个运算\((ax,by)=(x+max(0,a+y),b+min(0,a+y)\),大概能看出是个什么东西,注意这个运算不满足交换律

然后考虑一下这些二元组在序列中的顺序,如果\(x+y<0\),那么肯定得放前面,因为可以让之后的前缀和减小。

那么当\(x+y<0\)时,按\(x\)排序,这样能使前缀和不断减小。如果\(x+y>0\),按\(y\)排序就好了

维护二元组的话,用线段树合并,如果当前二元组的\(x+y<0\)且有比它最大前缀大的二元组,那么就已经是最优的了否则将在它前面的二元组与它合并,合并完后加进线段树里就好了。注意合并完之后节点没了要记得清空

//minamoto
#include<bits/stdc++.h>
#define R register
#define int long long
#define loli 200000000000000
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
    if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++C]=z[Z],--Z);sr[++C]=' ';
}
const int N=4e5+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
struct node{
    int mx,mn;
    node(){}
    node(R int mx,R int mn):mx(mx),mn(mn){}
    inline node operator +(const node &b){return node(mx+max(0ll,mn+b.mx),b.mn+min(0ll,mn+b.mx));}
}tr[N<<5];
int w[N],rt[N],ans[N],ls[N<<5],rs[N<<5];
int n,cnt,fa;
void ins(int &p,int l,int r,node x){
    if(!p)p=++cnt;if(l==r)return (void)(tr[p]=tr[p]+x);
    int mid=(l+r)>>1;
    x.mx<=mid?ins(ls[p],l,mid,x):ins(rs[p],mid+1,r,x);
    tr[p]=tr[ls[p]]+tr[rs[p]];
}
int merge(int x,int y,int l,int r){
    if(!x||!y)return x|y;if(l==r)return tr[x]=tr[x]+tr[y],x;
    int mid=(l+r)>>1;
    ls[x]=merge(ls[x],ls[y],l,mid),rs[x]=merge(rs[x],rs[y],mid+1,r);
    tr[x]=tr[ls[x]]+tr[rs[x]];
    return x;
}
void update(int &p,int l,int r,node &x,bool &flag){
    if(!p||flag)return;
    if(l==r){
        if(x.mx+x.mn<0&&x.mx<l)return (void)(flag=1);
        x=x+tr[p],p=0;return;
    }
    int mid=(l+r)>>1;
    update(ls[p],l,mid,x,flag),update(rs[p],mid+1,r,x,flag);
    if(ls[p]||rs[p])tr[p]=tr[ls[p]]+tr[rs[p]];
    else p=0;
}
void dfs(int u){
    node res=node(0,-w[u]);
    go(u){
        res.mx+=w[v],dfs(v);
        rt[u]=merge(rt[u],rt[v],0,loli);
    }
    node qaq=res;bool flag=0;
    qaq.mx+=w[u],ans[u]=(qaq+tr[rt[u]]).mx;
    update(rt[u],0,loli,res,flag),ins(rt[u],0,loli,res);
}
signed main(){
//  freopen("testdata.in","r",stdin);
    read(),n=read();
    fp(i,2,n)fa=read(),add(fa,i);
    fp(i,1,n)w[i]=read();
    dfs(1);
    fp(i,1,n)print(ans[i]);
    return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10231616.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107104.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux复制文件夹及赋予权限

    1.cp命令命令:cpdir1/a.docdir2表示将dir1下的a.doc文件复制到dir2目录下cp-rdir1dir2表示将dir1及其dir1下所包含的文件复制到dir2下cp-rdir1/.dir2表示将dir1下的文件复制到dir2,不包括dir1目录说明:cp参数-i:询问,如果目标文件已经存在,则会询问是否覆盖;2.scp命令例如:scpid_rsa.pubrouter_17@IP:/home/router_17/.ssh/authori…

    2022年4月7日
  • CANalyzer及CANOE使用五:无DBC,调CSV方式的网关信号转发或单通道信号值控制ECU其他信号变化(包含设计自动化测试)[通俗易懂]

    CANalyzer及CANOE使用五:无DBC,调CSV方式的网关信号转发或单通道信号值控制ECU其他信号变化(包含设计自动化测试)[通俗易懂]前言Panel界面CSV文件解析发送与接收————————————————前言同事:CAN网络UDS、NM等可以实现自动化,功能信号是否也可以?有简单方法吗?手动测太累了,矩阵表信号那么多,几十个Bit都够算了,脑袋都昏了。我:可以哇,那就整一个自动算信号bit值的吧。同事:不仅要算,还要判断ECU接收某些开关信号、温度、档位等的一系列反应(其他信号值的改变是否正确)我:可以,整一个同事:还有可能有网关转发信号起始bit,bit长度,接收的一方的信号值也要变。我:。。。。。。Pa.

    2022年6月20日
  • 智能优化算法:麻雀搜索算法-附代码「建议收藏」

    2020智能优化算法:麻雀搜索算法-附代码文章目录2020智能优化算法:麻雀搜索算法-附代码1.算法原理2.算法结果3.参考文献4.Matlab代码摘要:麻雀搜索算法(SparrowSearchAlgorithm,SSA)是于2020年提出的。SSA主要是受麻雀的觅食行为和反捕食行为的启发而提出的。该算法比较新颖,具有寻优能力强,收敛速度快的优点1.算法原理建立麻雀搜索算法的数学模型,主要规则如下所述:发现者通常拥有较高的能源储备并且在整个种群中负责搜索到具有丰富食物的区域,为所有的加

    2022年4月9日
  • 数域相关概念「建议收藏」

    数域相关概念「建议收藏」现在开始密码学的学习阶段了,数学知识是必不可少的。数环:定义:设S是复数集的非空子集。如果S中的数对任意两个数的和、差、积(没有商)仍属于S,则称S是一个数环。例如整数集Z就是一个数环,有理数集Q、实数集R、复数集C等都是数环。性质:1.任何数环都包含数零(即零环是最小的数环)。2.设S是一个数环。若a∈S,则na∈S(n∈Z)。3.若M

    2022年10月27日
  • Pytest和Allure测试框架-超详细版+实战

    Pytest和Allure测试框架-超详细版+实战文章目录一:pytest的介绍,安装,框架结构,执行方式1,特点2,安装3,pytest的框架结构4,执行方式二:Pytest-断言、跳过及运行1,Pytest-断言、跳过及运行2,mark中的skip(跳过)3,mark中的xfail(失败)4,使用自定义标记mark只执行部分用例5,文件名类名方法执行部分用例6,-k组合调用执行部分用例三,Pytest-fixture1. 如下:…

    2022年7月26日
  • google cloud platform官网_ai智能体验店免费送

    google cloud platform官网_ai智能体验店免费送一、GoogleCloudPlatform(GCP)简介GoogleCloudPlatform(以下简称GCP)是Google提供的云平台,。Google云平台提供很多功能,包括计算服务,存储服务,网络服务,大数据服务,人工智能服务,以及谷歌的产品等,可以用来搭建加速服务,网站和存储数据等等。本文将介绍如何申请GCP一年的免费试用、Linux服务器环境搭建。Docker环境搭建…

    2022年10月23日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号