题目描述

排排坐,吃果果,生果甜嗦嗦,大家笑呵呵。你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和。

红星幼儿园的小朋友们排起了长长地队伍,准备吃果果。不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观。设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:满足i<j且hi>hj的(i,j)数量。

幼儿园阿姨每次会选出两个小朋友,交换他们的位置,请你帮忙计算出每次交换后,序列的杂乱程度。为方便幼儿园阿姨统计,在未进行任何交换操作时,你也应该输出该序列的杂乱程度。

输入输出格式

输入格式:

第一行为一个正整数n,表示小朋友的数量;

第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高;

第三行为一个正整数m,表示交换操作的次数;

以下m行每行包含两个正整数ai和bi­,表示交换位置ai与位置bi的小朋友。

输出格式:

输出文件共m+1行,第i行一个正整数表示交换操作i结束后,序列的杂乱程度。

输入输出样例

输入样例#1: 复制

  1. 3
  2. 130 150 140
  3. 2
  4. 2 3
  5. 1 3
输出样例#1: 复制

  1. 1
  2. 0
  3. 3

说明

【样例说明】

未进行任何操作时,(2,3)满足条件;

操作1结束后,序列为130 140 150,不存在满足i<j且hi>hj的(i,j)对;

操作2结束后,序列为150 140 130,(1,2),(1,3),(2,3)共3对满足条件的(i,j)。

对于15%的数据, n,m \le 15n,m≤15 ;

对于30%的数据, n,m \le 200n,m≤200 ;

在剩下的70%数据中:

存在15%的数据, h_ihi​ 各不相同;

存在15%的数据, 1^{10} \le h_i \le 1^{60}110≤hi​≤160 ;

以上两类数据不存在交集。

对于100%的数据, 1 \le m \le 2\times 10^31≤m≤2×103 , 1 \le n \le 2 \times 10^41≤n≤2×104 , 1 \le h_i \le 10^91≤hi​≤109 , a_i \ne b_iai​≠bi​ , 1 \le a_i,b_i \le n1≤ai​,bi​≤n。

代码

直接暴力分块,然后在每一个块内排序。

查询时可以在每一个块内二分。

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define M 210
  6. #define N 20101
  7.  
  8. using namespace std;
  9.  
  10. int n, m, t, S, C, ans;
  11. int a[N], b[N], c[N], st[M], ed[M], belong[N], sorted[M][M], len[M];
  12.  
  13. inline int read()
  14. {
  15. int x = 0, f = 1;
  16. char ch = getchar();
  17. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
  18. for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  19. return x * f;
  20. }
  21.  
  22. inline int query(int x)
  23. {
  24. int ret = 0;
  25. for(; x; x -= x & -x) ret += c[x];
  26. return ret;
  27. }
  28.  
  29. inline void add(int x)
  30. {
  31. for(; x <= m; x += x & -x) c[x]++;
  32. }
  33.  
  34. inline void init()
  35. {
  36. int i, j;
  37. S = sqrt(n);
  38. for(i = 1; i <= n; i += S)
  39. {
  40. st[++C] = i;
  41. ed[C] = min(i + S - 1, n);
  42. len[C] = ed[C] - st[C] + 1;
  43. }
  44. for(i = 1; i <= C; i++)
  45. {
  46. for(j = st[i]; j <= ed[i]; j++)
  47. belong[j] = i, sorted[i][j - st[i] + 1] = a[j];
  48. sort(sorted[i] + 1, sorted[i] + len[i] + 1);
  49. }
  50. }
  51.  
  52. inline void solve(int x, int y)
  53. {
  54. if(x > y) swap(x, y);
  55. int i, l = belong[x], r = belong[y], tmp;
  56. if(l == r)
  57. for(i = x + 1; i < y; i++)
  58. {
  59. ans -= (a[i] < a[x]);
  60. ans += (a[i] > a[x]);
  61. ans -= (a[i] > a[y]);
  62. ans += (a[i] < a[y]);
  63. }
  64. else
  65. {
  66. for(i = l + 1; i < r; i++)
  67. {
  68. ans -= lower_bound(sorted[i] + 1, sorted[i] + len[i] + 1, a[x]) - sorted[i] - 1;
  69. ans += len[i] - (upper_bound(sorted[i] + 1, sorted[i] + len[i] + 1, a[x]) - sorted[i]) + 1;
  70. ans -= len[i] - (upper_bound(sorted[i] + 1, sorted[i] + len[i] + 1, a[y]) - sorted[i]) + 1;
  71. ans += lower_bound(sorted[i] + 1, sorted[i] + len[i] + 1, a[y]) - sorted[i] - 1;
  72. }
  73. for(i = x + 1; i <= ed[l]; i++)
  74. {
  75. ans -= (a[i] < a[x]);
  76. ans += (a[i] > a[x]);
  77. ans -= (a[i] > a[y]);
  78. ans += (a[i] < a[y]);
  79. }
  80. for(i = st[r]; i < y; i++)
  81. {
  82. ans -= (a[i] < a[x]);
  83. ans += (a[i] > a[x]);
  84. ans -= (a[i] > a[y]);
  85. ans += (a[i] < a[y]);
  86. }
  87. }
  88. if(a[x] > a[y]) ans--;
  89. if(a[x] < a[y]) ans++;
  90. swap(a[x], a[y]);
  91. for(i = st[l]; i <= ed[l]; i++) sorted[l][i - st[l] + 1] = a[i];
  92. for(i = st[r]; i <= ed[r]; i++) sorted[r][i - st[r] + 1] = a[i];
  93. sort(sorted[l] + 1, sorted[l] + len[l] + 1);
  94. sort(sorted[r] + 1, sorted[r] + len[r] + 1);
  95. }
  96.  
  97. int main()
  98. {
  99. int i, x, y;
  100. n = read();
  101. for(i = 1; i <= n; i++) a[i] = b[i] = read();
  102. sort(b + 1, b + n + 1);
  103. m = unique(b + 1, b + n + 1) - b - 1;
  104. for(i = 1; i <= n; i++)
  105. {
  106. a[i] = lower_bound(b + 1, b + m + 1, a[i]) - b;
  107. ans += i - query(a[i]) - 1, add(a[i]);
  108. }
  109. printf("%d\n", ans);
  110. init();
  111. t = read();
  112. while(t--)
  113. {
  114. x = read();
  115. y = read();
  116. solve(x, y);
  117. printf("%d\n", ans);
  118. }
  119. return 0;
  120. }

  

洛谷 P1975 [国家集训队]排队 Lebal:块内排序+树状数组的更多相关文章

  1. 洛谷 P2038 无线网络发射器选址 —— 二维树状数组

    题目:https://www.luogu.org/problemnew/show/P2038 大水题暴露出我的愚蠢. 用二维树状数组,然而居然忘了它应该那样写,调了一个小时: 正方形可以超出外面,只要 ...

  2. 洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)

    传送门 •题意 给你一个包含 n 个数的数组 $a$: 有 m 此操作,每次操作求区间 [l,r] 中不同数的个数: •题解(离线+树状数组) 以样例 $[1,2,3,4,3,5]$ 为例,求解区间 ...

  3. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  4. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  5. 洛谷 P2757 [国家集训队]等差子序列 解题报告

    P2757 [国家集训队]等差子序列 题目描述 给一个\(1\)到\(N\)的排列\(\{A_i\}\),询问是否存在 \[1 \le p_1<p_2<p_3<p_4<p_5& ...

  6. 洛谷 P1527 [国家集训队]矩阵乘法 解题报告

    P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...

  7. BZOJ 2141 排队 (三维偏序CDQ+树状数组)

    题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作 ...

  8. Bzoj 2141: 排队 分块,逆序对,树状数组

    2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1310  Solved: 517[Submit][Status][Discuss] D ...

  9. 洛谷 1775. [国家集训队2010]小Z的袜子

    1775. [国家集训队2010]小Z的袜子 ★★★   输入文件:hose.in   输出文件:hose.out   简单对比时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活 ...

随机推荐

  1. sklearn学习笔记之开始

    简介   自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了.scikit-learn简称sklearn,支持包括分类.回归.降维和聚类四大机器学习算法.还包含了特征 ...

  2. 腾讯开源手游热更新方案,Unity3D下的Lua编程

    原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...

  3. spring3: 4.4 使用路径通配符加载Resource

    4.4.1  使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...

  4. iptables(一)iptables概念

    为什么想写这个系列呢?openstack中的安全组.防火墙都是用iptables实现,后面的规则我们如果想要完全理解,不懂iptables的话,或者不精通iptables的话,会看的比较吃力.所以下定 ...

  5. hibernate映射(一对一、一对多、多对一、多对多)配置 【转】

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...

  6. python基础之socket编程(TCP三次握手和四次挥手)

    TCP协议中中的三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接 ...

  7. LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  8. Flask的消息message机制flash

    Flask的消息机制flash message是一个基于session实现的用于保存数据的集合,其特点是:使用一次就删除. 原理就是 操作成功 session['操作'] = 'msg' # 设置 s ...

  9. MyEclipse Tern was unable to complete your request in time

    1.错误描述 2.错误原因 由错误提示可知,是由于MyEclipse Tern不能及时完成回复 3.解决办法 (1)Window--->Preferences--->MyEclipse-- ...

  10. apply 无循环拼接数组

    apply()第二个参数只能是数组,这个数组将作为参数传给原函数的参数列表arguments. 其实在实际开发中,JS 继承的方法并不止这一种,使用原型链继承是更加常用的方式,此外还有构造函数继承,这 ...