ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3521 [POI2011]ROT-Tree Rotations (线段树合并)

2022-07-24 22:31:57  阅读:163  来源: 互联网

标签:ch lc P3521 int Rotations POI2011 tr rc 节点


对于一个非叶节点,不管是否要交换子树,其左右子树内部的逆序对数都不会受影响(内部的顺序并不会影响外部产生的逆序对数),受影响的是跨左右子树的情况,所以我们考虑统计这一部分的逆序对数。节点x的左右子树根节点为p,q,u+=size[t[p].rc] * size[t[q].lc],交换后 v+=size[t[p].lc]*size[t[q].rc]。

这道题的输入处理有些毒瘤(我还是第一次见),他让我们递归,那我们就递归求解,对于每个叶节点建立一颗权值线段树,不断向上合并,每次合并递归到线段树的所有非叶节点,按照上面的方式累加u和v,最后取min加入答案之中。

(画图模拟一下过程更好理解)

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 const int N = 2e5+10;
 4 using namespace std;
 5 struct node {
 6     int lc, rc, sze;
 7 }tr[22 * N];//N*logN的空间 
 8 int n, top;
 9 ll ans, u, v;
10 
11 int read() {//快读 
12     int x = 0; char ch = getchar();
13     while(ch > '9' || ch < '0') ch = getchar();
14     while(ch >= '0'&&ch <= '9') x = x * 10 + ch - '0', ch = getchar();
15     return x;
16 }
17 
18 int update(int l, int r, int val) {
19     int pos = ++top;
20     tr[top].sze++;
21     if (l == r) return pos;
22     int mid = (l + r) >> 1;
23     if (val <= mid) tr[pos].lc = update(l, mid, val);
24     else tr[pos].rc = update(mid + 1, r, val);
25     return pos;
26 } 
27 
28 int merge(int p, int q, int l, int r) {
29     if(!p || !q) return p + q;
30     if (l == r) {
31         tr[p].sze += tr[q].sze;
32         return p;
33     }
34     u += (ll)tr[tr[p].rc].sze * tr[tr[q].lc].sze;//交换前 
35     v += (ll)tr[tr[p].lc].sze * tr[tr[q].rc].sze;//交换后
36     int mid = (l + r) >> 1;
37     tr[p].lc = merge(tr[p].lc, tr[q].lc, l, mid);
38     tr[p].rc = merge(tr[p].rc, tr[q].rc, mid + 1, r); 
39     tr[p].sze = tr[tr[p].lc].sze + tr[tr[p].rc].sze;
40     return p;
41 }
42 
43 int dfs() {
44     int pos, val = read();
45     if (val == 0) {
46         int ls = dfs(), rs = dfs();
47         u = 0, v = 0;
48         pos = merge(ls, rs, 1, n);
49         ans += min(u, v);
50     }
51     else pos = update(1, n, val);//对叶子节点建树 
52     return pos; 
53 }
54 
55 int main() {
56     n = read();
57     dfs();
58     printf("%lld", ans);
59     return 0;
60 }

 

标签:ch,lc,P3521,int,Rotations,POI2011,tr,rc,节点
来源: https://www.cnblogs.com/yhxnoerror/p/16515717.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有