博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P1908 逆序对
阅读量:4882 次
发布时间:2019-06-11

本文共 2810 字,大约阅读时间需要 9 分钟。

二次联通门 : 

 

 

/*    luogu P1908 逆序对        权值线段树 + 离散化 + 指针版线段树。。。        把所有数离散化后将其作为下标建空树              对于每次插入的数字x,    查找x+1到max区间的数字存在的个数,    并将这个个数加入答案,    然后插入这个数字        最后输出答案         %%Menci的线段树。。。6到一定境界了。。。 */#include 
#include
#define Max 40080void read (int &now){ now = 0; register char word = getchar (); while (word < '0' || word > '9') word = getchar (); while (word >= '0' && word <= '9') { now = now * 10 + word - '0'; word = getchar (); }}inline int min (int a, int b){ return a < b ? a : b;}inline int max (int a, int b){ return a > b ? a : b;}struct Segment_Tree_Date{ Segment_Tree_Date *Left, *Right; Segment_Tree_Date () { Left = NULL; Right = NULL; key = 0; } int l, r; int key; int Mid;};Segment_Tree_Date *Root;class Segment_Tree_Type{ public : void Build (Segment_Tree_Date *&now, int l, int r) { now = new Segment_Tree_Date; now->l = l; now->r = r; if (l == r) return ; now->Mid = l + r >> 1; Build (now->Left, l, now->Mid); Build (now->Right, now->Mid + 1, r); } void Change_Single (Segment_Tree_Date *&now, int pos) { if (now->l == now->r) { now->key++; return ; } if (pos <= now->Mid) Change_Single (now->Left, pos); else if (pos > now->Mid) Change_Single (now->Right, pos); now->key = now->Left->key + now->Right->key; } int Query (Segment_Tree_Date *&now, int l, int r) { if (l <= now->l && r >= now->r) return now->key; int res = 0; if (l <= now->Mid) res += Query (now->Left, l, min (now->Mid, r)); if (r > now->Mid) res += Query (now->Right, max (l, now->Mid + 1), r); return res; }}Tree;int N, M;int date[Max];int rank_number[Max];int main (int argc, char *argv[]){ read (N); for (int i = 1; i <= N; i++) { read (date[i]); rank_number[i] = date[i]; } std :: sort (date + 1, date + 1 + N); int Size = std :: unique (date + 1, date + 1 + N) - date - 1; int Answer = 0; Tree.Build (Root, 1, Size); for (int i = 1; i <= N; i++) { rank_number[i] = std :: lower_bound (date + 1, date + 1 + Size, rank_number[i]) - date; if (rank_number[i] < Size) Answer += Tree.Query (Root, rank_number[i] + 1, Size); Tree.Change_Single (Root, rank_number[i]); } printf ("%d", Answer); return 0;}

 

转载于:https://www.cnblogs.com/ZlycerQan/p/6935107.html

你可能感兴趣的文章
十二、网络编程——4-基于UDP协议的网络编程
查看>>
异常处理与调试6 - 零基础入门学习Delphi55(完)
查看>>
if语句三种形式
查看>>
正则表达式之字符串验证
查看>>
codeblocks如何支持_tmain?可移植代码的编码推荐
查看>>
省市联动 填坑
查看>>
canvas写的一个小时钟demo
查看>>
原来今天是冬至
查看>>
又混了一天班
查看>>
九度oj 1006
查看>>
HDU6400-2018ACM暑假多校联合训练1004-Parentheses Matrix-构造
查看>>
最短路问题专题
查看>>
《Redis复制与可扩展集群搭建》看后感
查看>>
Jquery Mobile总结
查看>>
223. Rectangle Area
查看>>
spring boot + velocity中文乱码解决方式
查看>>
读罢泪两行,人生成长必须面对的10个残酷事实
查看>>
ASP 32位程序运行与64位问题:ADODB.Connection 错误 '800a0ea9' 未指定提供程序,也没有指派的默认提供程序。...
查看>>
xcode-git笔记
查看>>
TCP和UDP的优缺点及区别
查看>>