Mato的文件管理

Time Limit: 40 Sec  Memory Limit: 128 MB
Submit: 4325  Solved: 1757
[Submit][Status][Discuss]

Description

Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号
。为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问。Mato每天随机选一个区间[l,r
],他今天就看编号在此区间内的这些资料。Mato有一个习惯,他总是从文件大小从小到大看资料。他先把要看的
文件按编号顺序依次拷贝出来,再用他写的排序程序给文件大小排序。排序程序可以在1单位时间内交换2个相邻的
文件(因为加密需要,不能随机访问)。Mato想要使文件交换次数最小,你能告诉他每天需要交换多少次吗?

Input

第一行一个正整数n,表示Mato的资料份数。
第二行由空格隔开的n个正整数,第i个表示编号为i的资料的大小。
第三行一个正整数q,表示Mato会看几天资料。
之后q行每行两个正整数l、r,表示Mato这天看[l,r]区间的文件。
n,q <= 50000

Output

q行,每行一个正整数,表示Mato这天需要交换的次数。

Sample Input

4
1 4 2 3
2
1 2
2 4

Sample Output

0
2
//样例解释:第一天,Mato不需要交换
第二天,Mato可以把2号交换2次移到最后。

HINT

 

题解:树状数组维护逆序对,然后莫队降低复杂度,要换绝对要换

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<queue>
  7.  
  8. #define N 50007
  9. using namespace std;
  10. inline int read()
  11. {
  12. int x=,f=;char ch=getchar();
  13. while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
  14. while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  15. return x*f;
  16. }
  17.  
  18. unsigned int now,ans[N];
  19. int n,m;
  20. int a[N],disc[N],belong[N],t[N];
  21. struct query
  22. {
  23. int l,r,id;
  24. }q[N];
  25.  
  26. bool operator<(query a,query b)
  27. {
  28. if(belong[a.l]==belong[b.l])return a.r<b.r;
  29. return belong[a.l]<belong[b.l];
  30. }
  31. void add(int x,int val)
  32. {
  33. for(int i=x;i<=n;i+=i&-i)
  34. t[i]+=val;
  35. }
  36. unsigned int query(int x)
  37. {
  38. unsigned int sum=;
  39. for(int i=x;i;i-=i&-i)
  40. sum+=t[i];
  41. return sum;
  42. }
  43. void solve()
  44. {
  45. sort(q+,q+m+);
  46. int l=,r=;
  47. for(int i=;i<=m;i++)
  48. {
  49. while(l<q[i].l)
  50. add(a[l],-),now-=query(a[l]-),l++;
  51. while(r>q[i].r)
  52. add(a[r],-),now-=r-l-query(a[r]),r--;
  53. while(l>q[i].l)
  54. l--,add(a[l],),now+=query(a[l]-);
  55. while(r<q[i].r)
  56. r++,add(a[r],),now+=r-l+-query(a[r]);
  57. ans[q[i].id]=now;
  58. }
  59. }
  60. int main()
  61. {
  62. n=read();int t=sqrt(n);
  63. for(int i=;i<=n;i++)disc[i]=a[i]=read();
  64. sort(disc+,disc+n+);
  65. for(int i=;i<=n;i++)a[i]=lower_bound(disc+,disc+n+,a[i])-disc;
  66. m=read();
  67. for(int i=;i<=m;i++)
  68. q[i].l=read(),q[i].r=read(),q[i].id=i;
  69. for(int i=;i<=n;i++)
  70. belong[i]=(i-)/t+;
  71. solve();
  72. for(int i=;i<=m;i++)
  73. printf("%d\n",ans[i]);
  74. }

bzoj 3289 Mato的文件管理 树状数组+莫队的更多相关文章

  1. BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)

    BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...

  2. BZOJ 1878 SDOI2009 HH的项链 树状数组/莫队算法

    题目大意:给定一个序列.求一个区间内有多少个不同的数 正解是树状数组 将全部区间依照左端点排序 然后每次仅仅统计左端点開始的每种颜色的第一个数即可了 用树状数组维护 我写的是莫队算法 莫队明显能搞 m ...

  3. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  4. 「10.15」梦境(贪心)·玩具(神仙DP)·飘雪圣域(主席树\树状数组\莫队)

    A. 梦境 没啥可说的原题.... 贪心题的常见套路我们坐标以左端点为第一关键字,右端点为第二关键字 然后对于每个转折点,我们现在将梦境中左端点比他小的区间放进$multiset$里 然后找最近的右端 ...

  5. BZOJ-1878 HH的项链 树状数组+莫队(离线处理)

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 2701 Solved: 1355 [Submit][Statu ...

  6. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  7. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1539  Solved: 665[Submit][Status][Di ...

  8. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  9. BZOJ 3289: Mato的文件管理 【莫队 + 树状数组】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3289 3289: Mato的文件管理 Time Limit: 40 Sec  Memory ...

随机推荐

  1. spark操作数据库的几种方法

    一.使用jdbcRDD的接口: SparkConf conf = new SparkConf(); conf.setAppName("Simple Application").se ...

  2. ElasticSearch 2.0以后的改动导致旧的资料和书籍需要订正的部分

    id原先是可以通过path指定字段的 "thread": { "_id" : { "path" : "thread_id" ...

  3. FFM

    转载自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/details/77772565 点击率预估算 ...

  4. 如何在etherscan提交代币官方信息

    https://ethlinkersupport.zendesk.com/hc/zh-cn/articles/360001334992-%E5%A6%82%E4%BD%95%E5%9C%A8ether ...

  5. 基础数据类型-dict

    字典Dictinary是一种无序可变容器,字典中键与值之间用“:”分隔,而与另一个键值对之间用","分隔,整个字典包含在{}内: dict1 = {key1:value1, key ...

  6. Thunder团队第一周 - Scrum会议2

    Scrum会议2 小组名称:Thunder 项目名称:待定 Scrum Master:李传康 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传康(M ...

  7. 2019寒假训练营寒假作业(二) MOOC的网络空间安全概论笔记部分

    视频课程--MOOC的网络空间安全概论笔记 第一章 网络空间安全概述 2001年,网络空间概念被首次提出: 网络空间安全框架: 1.设备层安全: 可通过截获电磁辐射获取计算机信息.通过硬件木马(恶意电 ...

  8. Java容器之Set接口

    Set 接口: 1. Set 接口是 Collection 的子接口,Set 接口没有提供额外的方法,但实现 Set 接口的容器类中的元素是没有顺序的,且不可以重复: 2. Set 容器可以与数学中的 ...

  9. Java容器之Iterator接口

    Iterator 接口: 1. 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象. 2. Iterator 对象称作迭代器,用以方便的 ...

  10. PHPcmsv9 还原数据库 操作步骤

    相比dedecms,相同之处:模版好制作,都是开源.不同之处:pc貌似有更好的 负载能力. 言归正传,这两天在捣鼓phpcmsv9程序,但是本地调试好了之后,无论是通过打包方式,还是 转移数据的方式. ...