传送门

Solution

发现叶子节点的值都不样,所以可以线段树合并。

然后因为我们要维护一个后缀,所以我们先合并右儿子,在合并左儿子

Code

//2019.1.14 8:59~10:15 PaperCloud
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 300005
#define mod 998244353
int const INV_1e4=796898467;
int N,c[MN][3],fa[MN],p[MN];
struct Node
{int val,id;bool operator<(const Node&o)const {return val<o.val;}
}a[MN];int tot;
struct node{int ls,rs,lazy,p;}t[MN*15];int pin,root[MN];
#define mid ((l+r)>>1)
inline void Modify(int &x,int l,int r,int val)
{if(!x) x=++pin;t[x].lazy=t[x].p=1ll;if(l==r) return;val<=mid?Modify(t[x].ls,l,mid,val):Modify(t[x].rs,mid+1,r,val);
}
ll L,R,P;
inline void pushdown(int x)
{if(t[x].lazy==1) return;t[x].p=1ll*t[x].p*t[x].lazy%mod;t[t[x].ls].lazy=1ll*t[t[x].ls].lazy*t[x].lazy%mod;t[t[x].rs].lazy=1ll*t[t[x].rs].lazy*t[x].lazy%mod;t[x].lazy=1;
}
inline void pushup(int x){t[x].p=(t[t[x].ls].p+t[t[x].rs].p)%mod;}
inline int Merge(int x,int y)
{
//  printf("%d %d\n",x,y);if(!x&&!y)return 0;pushdown(x),pushdown(y);if(!y){(L+=t[x].p)%=mod,t[x].lazy=1ll*t[x].lazy*(R+P-2ll*R*P%mod+mod)%mod;pushdown(x);return x;}if(!x){(R+=t[y].p)%=mod,t[y].lazy=1ll*t[y].lazy*(L+P-2ll*L*P%mod+mod)%mod;pushdown(y);return y;}t[x].rs=Merge(t[x].rs,t[y].rs);t[x].ls=Merge(t[x].ls,t[y].ls);pushup(x);return x;
}
inline void dfs(int x=1)
{if(!c[x][0]) return;else if(c[x][0]==1) dfs(c[x][1]),root[x]=root[c[x][1]];else{dfs(c[x][1]),dfs(c[x][2]);L=R=0;P=p[x];root[x]=Merge(root[c[x][1]],root[c[x][2]]);}
}
inline void calc(int x=root[1],int l=1,int r=tot)
{static ll ans=0;pushdown(x);if(l==r){(ans+=(1ll*l*a[l].val%mod*t[x].p%mod*t[x].p%mod)%mod)%=mod;if(l==tot) printf("%lld\n",ans);return;}calc(t[x].ls,l,mid);calc(t[x].rs,mid+1,r);
}
int main()
{
//  freopen("1.in","r",stdin);N=read();register int i;for(i=1;i<=N;++i) fa[i]=read(),c[fa[i]][++c[fa[i]][0]]=i;for(i=1;i<=N;++i) if(c[i][0]>0) p[i]=1ll*read()*INV_1e4%mod; else a[++tot]=(Node){read(),i};std::sort(a+1,a+tot+1);for(i=1;i<=tot;++i) p[a[i].id]=i,Modify(root[a[i].id],1,tot,i);dfs();calc();return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10275295.html

「PKUWC2018」Minimax相关推荐

  1. LOJ 2537 「PKUWC2018」Minimax

    BZOJ 5461. 线段树合并优化$dp$. 假设所有离散之后的权值$\in [1, m]$,对于一个点$x$它的权值是$i$的概率是$f(x, i)$,那么 1.假如这个点只有一个儿子$y$,那么 ...

  2. loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】

    题目链接 loj2537 题解 观察题目的式子似乎没有什么意义,我们考虑计算出每一种权值的概率 先离散化一下权值 显然可以设一个\(dp\),设\(f[i][j]\)表示\(i\)节点权值为\(j\) ...

  3. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  4. loj2538 「PKUWC2018」Slay the Spire 【dp】

    题目链接 loj2538 题解 比较明显的是,由于强化牌倍数大于\(1\),肯定是能用强化牌尽量用强化牌 如果强化牌大于等于\(k\),就留一个位给攻击牌 所以我们将两种牌分别排序,企图计算\(F(i ...

  5. 「PKUWC2018」随机游走

    Min-Max容斥真好用 LOJ #2542 题意:给一棵不超过1818个节点的树,50005000次询问,每次问从根随机游走走遍一个集合的期望步数 Solution: 考虑Min-Max容斥 有Ma ...

  6. 【LOJ】 #2540. 「PKUWC2018」随机算法

    题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...

  7. 「PKUWC2018」Slay the Spire

    国际惯例不放题干 扯淡 其实题目翻译过来是杀戮尖塔,某steam上的卡牌游戏,我也曾热衷刷榜 题解 首先题目中要求的期望是假期望,结合题目中所给的阶乘就可以看出这其实是从$2*n$张牌中选择$m$张牌 ...

  8. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)

    题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...

  9. loj#2541. 「PKUWC2018」猎人杀

    传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...

最新文章

  1. check_ping.py
  2. 【292天】跃迁之路——程序员高效学习方法论探索系列(实验阶段50-2017.11.24)...
  3. mysql 123456_MySQL字符串中抽取数值的方法 select -(-'123456@163.com'); 很牛逼
  4. 前端必须掌握的经典布局:“双飞翼布局”
  5. 4.6.3 内表数据处理
  6. 这段百度问答,对我相关有对啊!!!----如何获取Windows系统登陆用户名
  7. linux minimal版没有ip信息,如何配置linux网络信息,访问外网
  8. Python 中的 - 是什么意思
  9. java 可以直接当自定义标示符_JAVA 从头开始二
  10. 初开:什么是系统思考
  11. UNIX网络编程 第1卷 数据分享
  12. vue下载文件常用的几种方式
  13. 艾宾浩斯30天计划表_干货丨艾宾浩斯遗忘曲线
  14. 我的 CSDN 两周年创作纪念日
  15. 【TBSchedule】TBSchedule应用实战手册
  16. python基础项目 --爬取金山词霸翻译功能
  17. html中按钮怎么设置渐变色,CSS3渐变色按钮
  18. Windows系统cmd命令+实用工具
  19. NodeJS使用socket传输大文件
  20. Spring Data JPA使用JPQL与原生SQL进行查询

热门文章

  1. Maven 使用代理下载依赖
  2. 一个简单的synchronized多线程问题、梳理与思考
  3. codewars-013: Ease the StockBroker
  4. CentOS 6.4 搭建SVN服务器
  5. 关于ios颜色渐进的总结
  6. 【CCNA考试】2010-06-17-杭州-1000(PASS)
  7. vsphere6.7+Horizon7.8推送桌面遇到的一些问题
  8. Android被忽略的tools
  9. java创建线程的两种方法区别
  10. android stack error message is Fail to start the plugin