http://acm.uestc.edu.cn/#/problem/show/841

休生伤杜景死惊开

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

陆伯言军陷八卦阵之中,分明只是一条直路,却怎的也走不到尽头。阵中尽是石堆,以某一石堆为参考,无论向走还是向右,总是会回到出发的石堆,最后幸得一黄姓老翁带路才得脱出。

陆伯言逃离八卦阵后,来到山顶观察此阵,记从左往右第i堆石堆的高度为Ai,发现任何两堆较矮的石堆都能和它们之间的一座较高的石堆形成"八卦锁",将其中之人牢牢锁住,无从逃脱。

根据石堆的情况,陆伯言大致计算了“八卦锁”的数量(即 Ai<Aj>Ak,i<j<k 的组合数),不禁心中一惊,对孔明惊为天人,遂放弃追击,收兵回吴。

“有劳岳父了。” “为何将其放走?” “...一表人才,何必浪费于此。”

Input

第一行一个整数n,表示石堆堆数。

接下来一行,n个整数,第i个数表示从左到右第i堆石堆的高度Ai。

1≤n≤50000,1≤Ai≤32768

Output

一个整数,“八阵锁”的数目。

Sample input and output

Sample Input Sample Output
  1. 5
  2. 1 2 3 4 1
  1. 6

题意:求Ai<Aj>Ak,i<j<k 的组合数。

思路:这道题目其实是求逆序数,稍作变形,可以采用线段树或者树状数组来实现。两次扫描,先从前往后扫,即插即查,每插入一次,便计算该位置之前的总数并记录,再从后往前扫,原理相同。最后求对应位置乘积和。详情见代码:

线段树实现:

  1. #include <fstream>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7.  
  8. const int N=;
  9. int n,m,maxn,a[N],l[N];
  10. struct node
  11. {
  12. int left,right;
  13. int sum_;
  14. }tree[*];
  15.  
  16. void build(int id,int l,int r);//建一棵线段树
  17. int query_sum(int id,int l,int r);//查询区间和
  18. void update(int id,int pos);//更新位置pos的值增加1
  19.  
  20. int main()
  21. {
  22. //freopen("D:\\input.in","r",stdin);
  23. //freopen("D:\\output.out","w",stdout);
  24. long long ans=;
  25. scanf("%d",&n);
  26. for(int i=;i<=n;i++)
  27. scanf("%d",&a[i]),maxn=max(a[i],maxn);
  28. build(,,maxn);
  29. for(int i=;i<=n;i++)
  30. {
  31. update(,a[i]);
  32. l[i]=query_sum(,,a[i]-);
  33. }
  34. build(,,maxn);
  35. for(int i=n;i>=;i--)
  36. {
  37. update(,a[i]);
  38. ans+=l[i]*query_sum(,,a[i]-);
  39. }
  40. printf("%lld\n",ans);
  41. return ;
  42. }
  43. void build(int id,int l,int r)
  44. {
  45. tree[id].left=l;
  46. tree[id].right=r;
  47. if(l==r)
  48. {
  49. tree[id].sum_=;
  50. }
  51. else
  52. {
  53. int mid=(l+r)/;
  54. build(*id,l,mid);
  55. build(*id+,mid+,r);
  56. tree[id].sum_=tree[*id].sum_+tree[*id+].sum_;
  57. }
  58. }
  59. int query_sum(int id,int l,int r)
  60. {
  61. if(l>r) return ;//注意参数的大小关系限制
  62. if(tree[id].left==l&&tree[id].right==r)
  63. return tree[id].sum_;
  64. else
  65. {
  66. int mid=(tree[id].left+tree[id].right)/;
  67. if(r<=mid) return query_sum(*id,l,r);
  68. else if(l>mid) return query_sum(*id+,l,r);
  69. else
  70. return query_sum(*id,l,mid)+query_sum(*id+,mid+,r);
  71. }
  72. }
  73. void update(int id,int pos)
  74. {
  75. if(tree[id].left==tree[id].right)
  76. {
  77. tree[id].sum_++;
  78. }
  79. else
  80. {
  81. int mid=(tree[id].left+tree[id].right)/;
  82. if(pos<=mid) update(*id,pos);
  83. else update(*id+,pos);
  84. tree[id].sum_=tree[*id].sum_+tree[*id+].sum_;
  85. }
  86. }

树状数组实现:

  1. #include <fstream>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7.  
  8. int n,m,maxn;
  9. int a[],tree[],l[];
  10.  
  11. int read(int pos);//求 sum[1,pos]的答案
  12. void update(int pos);//把a[pos]加上1
  13.  
  14. int main()
  15. {
  16. //freopen("D:\\input.in","r",stdin);
  17. //freopen("D:\\output.out","w",stdout);
  18. long long ans=;
  19. scanf("%d",&n);
  20. for(int i=;i<=n;i++)
  21. scanf("%d",&a[i]),maxn=max(a[i],maxn);
  22. for(int i=;i<=n;i++)
  23. {
  24. update(a[i]);
  25. l[i]=read(a[i]-);
  26. }
  27. memset(tree,,sizeof(tree));
  28. for(int i=n;i>=;i--)
  29. {
  30. update(a[i]);
  31. ans+=l[i]*read(a[i]-);
  32. }
  33. printf("%lld\n",ans);
  34. return ;
  35. }
  36. int read(int pos)
  37. {
  38. int ans=;
  39. while(pos>)
  40. {
  41. ans+=tree[pos];
  42. pos-=pos&(-pos);
  43. }
  44. return ans;
  45. }
  46. void update(int pos)
  47. {
  48. while(pos<=maxn)
  49. {
  50. tree[pos]++;
  51. pos+=pos&(-pos);
  52. }
  53. }

cdoj841-休生伤杜景死惊开 (逆序数变形)【线段树 树状数组】的更多相关文章

  1. cdoj 841 休生伤杜景死惊开 逆序数/树状数组

    休生伤杜景死惊开 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 陆伯言军陷八卦 ...

  2. P4315 月下“毛景树”(树链剖分)

    P4315 月下"毛景树"(树链剖分) 题面 简述: 边权转点权(在dfs1处转换) 把一条边权赋值在深度更深的上 需要实现对单边权的染色 , 路径边权的染色 , 路径边权的增加 ...

  3. 懂,你的App生,不懂,死!

    近期有一些开发人员.创业公司的人加我微信viyi88,咨询一些关于自己App的事情.被问得最多的可能就是:"我的App怎样推广添加下载量?"而且信誓旦旦地说自己的App做得非常好, ...

  4. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  5. 【BZOJ1984】月下“毛景树” 树链剖分+线段树

    [BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...

  6. 【BZOJ-1984】月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1314  Solved: 416[Submit][Status][Discu ...

  7. Bzoj 1984: 月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1282  Solved: 410[Submit][Status][Discu ...

  8. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下“毛景树” 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来,可以发现a到b节点间 ...

  9. P4315 月下“毛景树”[树剖]

    题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬毛毛虫爬到了一颗小小的"毛景树&quo ...

随机推荐

  1. 用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)

    # -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...

  2. HTML5: input:file上传类型控制

    ylbtech-HTML5: input:file上传类型控制   1. 一.input:file 属性返回顶部 一.input:file属性 属性值有以下几个比较常用: accept:表示可以选择的 ...

  3. [转]NSIS:判断D盘存在与否确定安装路径

    转载自:http://www.flighty.cn/html/bushu/20140704_239.html   现在我们想实现这样的功能: 如果目标机器存在D盘,那么就安装程序到D盘,否则安装在系统 ...

  4. ecliplse java log4j 配置

    log4j的一些配置 a). 新建JavaProject>>新建package>>新建Java类: b). import jar包(一个就够),这里我用的是log4j-1.2. ...

  5. Centos 的计划任务 crontab

    使用计划任务! crontab命令主要有3个参数: -e :编辑用户的crontab. -l :列出用户的crontab的内容. -r :删除用户的crontab的内容. 执行crontab -e,将 ...

  6. 小朋友学C++(1)

    Hello World! 在学C++之前,最好先学习一下C语言 让我们先运行一段简单的代码,编译器可以使用 在线C++编译器 或 Xcode(苹果系统) 或Dev C++(Windows系统). #i ...

  7. 基于Linux的Samba开源共享解决方案测试(一)

    转自http://blog.csdn.net/u013394982/article/details/17914429 Linux操作系统 Linux是一类Unix计算机操作系统的统称.Linux操作系 ...

  8. 学习MongoDB 三: MongoDB无法启动的解决方法

    一简介 我们之前介绍了MongoDB入门(安装与配置),我们今天在打开MongDB时,我们先运行cmd.exe进入dos命令界面,然后进入cd  D:\mongodb\bin目录下,启动服务或者mon ...

  9. System Error:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

    System Error:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found 1.运行程序是,系统报错库文件libstdc++. ...

  10. openstack 基镜像与差异镜像的整合