博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5792 树状数组
阅读量:4977 次
发布时间:2019-06-12

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

题意:给一组序列,从中找出一个四元组,使四个元素下标两两不同,且a<b,c<d有X< Xb , Xc > Xd。问一共有多少组满足要求的四元组。

思路:使用树状数组保存左边小于,左边大于,右边小于,右边大于当前位的数的个数。保存逆序对,顺序对组数。在逆序对X顺序对的结果中存在b,c为同一数,a,d为同一数,a,c为同一数,d,b为同一数的情况,将这些情况数量减去得到答案。

 

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 const int N = 50005; 7 typedef long long LL; 8 9 int tmp[N] , arr[N]; 10 int n,cnt; //cnt为离散后不同数的个数 11 int ls[N],rs[N],rb[N],lb[N]; // ls:左边小于当前位的数的个数 , rs:右边小于当前位的数的个数,lb:左边大于当前位的数的个数,rb:右边大于当前位的数的个数 12 int tls[N],trs[N],trb[N],tlb[N]; // 树状数组 13 LL ans,suml,sumb; //答案,逆序对个数,顺序对个数 14 15 16 void init() 17 { 18 memset(tls,0,sizeof (tls)); 19 memset(trs,0,sizeof (trs)); 20 memset(tlb,0,sizeof (tlb)); 21 memset(trb,0,sizeof (trb)); 22 ans = suml = sumb = 0; 23 } 24 25 LL getl(int p,int *tr) 26 { 27 LL res = 0; 28 while (p > 0) 29 { 30 res += (LL)tr[p]; 31 p -= (p&-p); 32 } 33 return res; 34 } 35 36 LL getr(int p,int *tr) 37 { 38 LL res = 0; 39 while (p <= cnt) 40 { 41 res += (LL)tr[p]; 42 p += (p&-p); 43 } 44 return res; 45 } 46 47 void upl(int p,int *tr) 48 { 49 while (p<=cnt) 50 { 51 tr[p] += 1; 52 p += (p&-p); 53 } 54 } 55 56 void upr(int p,int *tr) 57 { 58 while (p > 0) 59 { 60 tr[p] += 1; 61 p -= (p&-p); 62 } 63 } 64 65 66 int main() 67 { 68 while (scanf("%d",&n)==1) 69 { 70 init(); 71 for (int i=0;i
=0;i--) 91 { 92 rb[i] = getr(arr[i]+1,trb); rs[i] = getl(arr[i]-1,trs); 93 upl(arr[i],trs); upr(arr[i],trb); 94 } 95 96 ans = suml * sumb; //逆序对数乘顺序对数,结果存在不合法的情况 97 for (int i=0;i

 

转载于:https://www.cnblogs.com/bdNestInLastation/p/5735349.html

你可能感兴趣的文章
邻接表详解
查看>>
迭代dict的value
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>
Py 可能是最全面的 python 字符串拼接总结(带注释版)
查看>>
《Java程序设计实验》 软件工程18-1,3 OO实验2
查看>>
【Herding HDU - 4709 】【数学(利用叉乘计算三角形面积)】
查看>>
OPENSSL使用方法
查看>>
开发WINDOWS服务程序
查看>>
cross socket和msgpack的数据序列和还原
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
更新.net core 3.0,dotnet ef命令无法使用的解决办法
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(2)——Babel
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>