【bzoj3702】二叉树 权值线段树

来源:互联网 发布:电脑笔记软件 编辑:程序博客网 时间:2024/05/22 12:24
神奇的解法
对于每个节点,建出权值线段树
每次查询右子树的权值线段树和左子树的权值线段树,左子树中比右子树小的有多少?右子树比左子树小的有多少?(分别对应不交换的逆序对和交换的逆序对)
将左子树和右子树的权值线段树合并
递归进行这个操作
感觉复杂度很不靠谱,于是想证明一下复杂度
最开始权值线段树共O(nlogn)个节点,最后共O(n)个节点
每次合并两棵树的每个节点都要访问一遍,所以每个节点好像是要访问O(dep[i])次?
但是,合并两棵树后,有些重复的节点被合并到了一起
所以好像有些节点又没有合并O(dep[i])次?

感觉很靠谱,但是不会证明


#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define maxn 400010#define N 4000100using namespace std;int lch[N],rch[N],sum[N];int root[maxn],l[maxn],r[maxn],w[maxn];int n,m,num,tot;long long ans,cnt1,cnt2;void dfs(int x){scanf("%d",&w[x]);if (!w[x]){l[x]=++num;dfs(num);r[x]=++num;dfs(num);}}void update(int x){sum[x]=sum[lch[x]]+sum[rch[x]];}void modify(int &x,int l,int r,int d){if (!x) x=++tot;if (l==r) {sum[x]=1;return;}int mid=(l+r)/2;if (d<=mid) modify(lch[x],l,mid,d);else modify(rch[x],mid+1,r,d);update(x);}int merge(int x,int y){if (!x) return y;if (!y) return x;cnt1+=(long long)sum[rch[y]]*sum[lch[x]];cnt2+=(long long)sum[rch[x]]*sum[lch[y]];lch[x]=merge(lch[x],lch[y]);rch[x]=merge(rch[x],rch[y]);update(x);return x;}void dfs1(int x){if (!w[x]){dfs1(l[x]);dfs1(r[x]);cnt1=cnt2=0;root[x]=merge(root[l[x]],root[r[x]]);ans+=min(cnt1,cnt2);}}int main(){scanf("%d",&n);num++;dfs(1);for (int i=1;i<=num;i++)  if (w[i]) modify(root[i],1,n,w[i]);dfs1(1);printf("%lld\n",ans);return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东买的货没收到怎么办 淘宝物流显示已揽件就是不动怎么办 淘宝查不到物流信息怎么办 快递物流信息更新错怎么办 淘宝上查不到物流怎么办 微信买的东西不给退怎么办 微信购物已收货怎么办 微信买东西不退怎么办 银行经营贷款资金回流怎么办 淘宝有运费险换货怎么办 淘宝有运费险的换货怎么办 淘宝换货一直不发货怎么办 淘宝申请换货卖家不发货怎么办 淘宝买家泄露卖家信息怎么办 高仿苹果没内存怎么办 高仿苹果7太卡怎么办 天猫客服处理不了怎么办 美团顾客电话打不通怎么办 美团众包顾客电话打不通怎么办 天猫退货商家拒绝退款怎么办 中关村买电脑被骗了怎么办 在闲鱼被买家骗了东西怎么办 在手机店买手机被骗怎么办 买手机分期付款被骗了怎么办 买电脑被骗了怎么办啊 小米卡puk锁了怎么办 红米3x电池松动怎么办 实体店买到苹果翻新机怎么办 小米手环2米粒掉怎么办 小米字体下架了怎么办 京东白条被锁定怎么办 苹果6splus很卡怎么办 苹果6s卡槽坏了怎么办 在京东买的电脑没发票怎么办 京东上买的空调没发票怎么办 分期手机被坑了怎么办 京东退货发票丢了怎么办 买东西的发票丢了怎么办 淘宝买东西发票丢了怎么办 网上买的手机没有发票怎么办 网上买的手机没发票怎么办