E. Army Creation
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

As you might remember from our previous rounds, Vova really likes computer games. Now he is playing a strategy game known as Rage of Empires.

In the game Vova can hire n different warriors; ith warrior has the type ai. Vova wants to create a balanced army hiring some subset of warriors. An army is called balanced if for each type of warrior present in the game there are not more than k warriors of this type in the army. Of course, Vova wants his army to be as large as possible.

To make things more complicated, Vova has to consider q different plans of creating his army. ith plan allows him to hire only warriors whose numbers are not less than li and not greater than ri.

Help Vova to determine the largest size of a balanced army for each plan.

Be aware that the plans are given in a modified way. See input section for details.

Input

The first line contains two integers n and k (1 ≤ n, k ≤ 100000).

The second line contains n integers a1, a2, ... an (1 ≤ ai ≤ 100000).

The third line contains one integer q (1 ≤ q ≤ 100000).

Then q lines follow. ith line contains two numbers xi and yi which represent ith plan (1 ≤ xi, yi ≤ n).

You have to keep track of the answer to the last plan (let's call it last). In the beginning last = 0. Then to restore values of li and ri for the ith plan, you have to do the following:

  1. li = ((xi + lastmod n) + 1;
  2. ri = ((yi + lastmod n) + 1;
  3. If li > ri, swap li and ri.
Output

Print q numbers. ith number must be equal to the maximum size of a balanced army when considering ith plan.

Example
input
  1. 6 2
  2. 1 1 1 2 2 2
  3. 5
  4. 1 6
  5. 4 3
  6. 1 1
  7. 2 6
  8. 2 6
output
  1. 2
  2. 4
  3. 1
  4. 3
  5. 2
Note

In the first example the real plans are:

  1. 1 2
  2. 1 6
  3. 6 6
  4. 2 4
  5. 4 6

题目链接:E. Army Creation

神队友突然给我一道题目,这题跟BZOJ 那个维护队列的分块做法一样,那道题是分块维护倒数第1个同样的数的出现的位置,这题是维护倒数第k个同样的数出现的位置,然后在块内二分即可。真的是一道好题。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. #define LC(x) (x<<1)
  5. #define RC(x) ((x<<1)+1)
  6. #define MID(x,y) ((x+y)>>1)
  7. #define CLR(arr,val) memset(arr,val,sizeof(arr))
  8. #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
  9. typedef pair<int, int> pii;
  10. typedef long long LL;
  11. const double PI = acos(-1.0);
  12. const int N = 100010;
  13. const int M = 320;
  14. struct Block
  15. {
  16. int l, r;
  17. };
  18. Block B[M];
  19. vector<int>prepos[N];
  20. int arr[N], pre[N], ori[N], belong[N];
  21. int unit, bcnt;
  22.  
  23. void reset(int bx)
  24. {
  25. sort(pre + B[bx].l, pre + B[bx].r + 1);
  26. }
  27. void init(int n)
  28. {
  29. int i;
  30. unit = sqrt(n);
  31. bcnt = n / unit;
  32. if (n % unit)
  33. ++bcnt;
  34. for (i = 1; i <= bcnt; ++i)
  35. {
  36. B[i].l = (i - 1) * unit + 1;
  37. B[i].r = i * unit;
  38. }
  39. B[bcnt].r = n;
  40. for (i = 1; i <= n; ++i)
  41. belong[i] = (i - 1) / unit + 1;
  42. for (i = 1; i <= bcnt; ++i)
  43. reset(i);
  44. }
  45. int bs(int bx, int key)
  46. {
  47. int ans = -1;
  48. int L = B[bx].l, R = B[bx].r;
  49. while (L <= R)
  50. {
  51. int mid = MID(L, R);
  52. if (pre[mid] < key)
  53. {
  54. ans = mid;
  55. L = mid + 1;
  56. }
  57. else
  58. R = mid - 1;
  59. }
  60. return ~ans ? ans - B[bx].l + 1 : 0;
  61. }
  62. int query(int l, int r)
  63. {
  64. int bl = belong[l], br = belong[r];
  65. int ans = 0;
  66. if (bl == br)
  67. {
  68. for (int i = l; i <= r; ++i)
  69. if (ori[i] < l)
  70. ++ans;
  71. }
  72. else
  73. {
  74. for (int i = l; i <= B[bl].r ; ++i)
  75. if (ori[i] < l)
  76. ++ans;
  77. for (int i = B[br].l; i <= r; ++i)
  78. if (ori[i] < l)
  79. ++ans;
  80. for (int i = bl + 1; i < br; ++i)
  81. ans += bs(i, l);
  82. }
  83. return ans;
  84. }
  85. int main(void)
  86. {
  87. int n, k, i;
  88. scanf("%d%d", &n, &k);
  89. for (i = 1; i <= n; ++i)
  90. {
  91. scanf("%d", &arr[i]);
  92. int sz = prepos[arr[i]].size();
  93. if (sz < k)
  94. {
  95. pre[i] = 0;
  96. }
  97. else
  98. pre[i] = prepos[arr[i]][sz - k];
  99. ori[i] = pre[i];
  100. prepos[arr[i]].push_back(i);
  101. }
  102. init(n);
  103. int last = 0;
  104. int q;
  105. scanf("%d", &q);
  106. while (q--)
  107. {
  108. int l, r;
  109. scanf("%d%d", &l, &r);
  110. l = (l + last) % n + 1;
  111. r = (r + last) % n + 1;
  112. if (l > r)
  113. swap(l, r);
  114. printf("%d\n", last = query(l, r));
  115. }
  116. return 0;
  117. }

Educational Codeforces Round 22 E. Army Creation(分块好题)的更多相关文章

  1. Educational Codeforces Round 22 E. Army Creation

    Educational Codeforces Round 22 E. Army Creation 题意:求区间[L,R]内数字次数不超过k次的这些数字的数量的和 思路:和求区间内不同数字的数量类似,由 ...

  2. Educational Codeforces Round 22 E. Army Creation 主席树 或 分块

    http://codeforces.com/contest/813/problem/E 题目大意: 给出长度为n的数组和k,  大小是1e5级别. 要求在线询问区间[l, r]权值,  权值定义为对于 ...

  3. [Educational Codeforces Round#22]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 晚上去clj博客逛来逛去很开心,突然同学提醒了一下,发现cf已经开始40分钟了,慌的一B,从B题开始写,写完了B到E最后收掉了A,结果太着急B ...

  4. Educational Codeforces Round 22 补题 CF 813 A-F

    A The Contest 直接粗暴贪心 略过 #include<bits/stdc++.h> using namespace std; int main() {//freopen(&qu ...

  5. Educational Codeforces Round 22.B 暴力

    B. The Golden Age time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  6. Educational Codeforces Round 22 B. The Golden Age(暴力)

    题目链接:http://codeforces.com/contest/813/problem/B 题意:就是有一个数叫做不幸运数,满足题目的 n = x^a + y^b,现在给你一个区间[l,r],让 ...

  7. 【Educational Codeforces Round 22】

    又打了一场EDU,感觉这场比23难多了啊…… 艹还是我太弱了. A. 随便贪心一下. #include<bits/stdc++.h> using namespace std; ,ans=- ...

  8. Educational Codeforces Round 5 E. Sum of Remainders (思维题)

    题目链接:http://codeforces.com/problemset/problem/616/E 题意很简单就不说了. 因为n % x = n - n / x * x 所以答案就等于 n * m ...

  9. Educational Codeforces Round 7 D. Optimal Number Permutation 构造题

    D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...

随机推荐

  1. 求和VII

    问题 K: 求和VII 时间限制: 2 Sec  内存限制: 256 MB提交: 422  解决: 53[提交] [状态] [讨论版] [命题人:admin] 题目描述 master对树上的求和非常感 ...

  2. python_52_函数返回值2

    def test1(x,y): print(x,y) test1(1,2)#位置参数调用,按顺序来,与形参一一对应 test1(y=1,x=2)#输出为2 1,不是1 2.关键字参数调用按关键字,不按 ...

  3. SecureCRT连接Linux

    一.服务端 1.在linux上安装openssh-server服务,并确认打开了22监听端口 1)安装openssh-server:apt-get install openssh-server 2)查 ...

  4. Mybatis generator(复制粘贴完成)

    命令行模式 1.java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml 2.Maven plugin(my ...

  5. IPV6验证正则表达式

    验证ipv6的正则表达式: 例:fe80::ec61:c1d1:9827:82be%13 \s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9 ...

  6. 绘制圆形 和 椭圆形:边圆形 imageellipse() 、 填充圆形imagefilledellipse()

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  7. centos7安装phpstudy

    操作系统:CentOS 7 x86_64 SSH登录工具:FinalSHell 2.9.7 一.安装phpstudy 1.下载完整版: wget -c http://lamp.phpstudy.net ...

  8. Flask初学者:URL(传参,请求,重定向)

    URL传参: 良好的URL:视图函数对应的url以/结尾是一种良好url,因为用户在访问的时候无论他有没有加上最后这个斜杠,都是能访问到的,相反,视图函数的url没有以/结尾,用户访问的时候却加上了这 ...

  9. Codeforces Round #462 (Div. 2) C. A Twisty Movement

    C. A Twisty Movement time limit per test1 second memory limit per test256 megabytes Problem Descript ...

  10. UVALive 4685 Succession 树DP+背包

    一.前言 这道题同样来自于红书P142,作为树DP专题中的一道比较难的题目,A了一天左右的时间,看上去事实证明,这题的难度理我本身的实力还是有些太远了,于是正确的做法应该是分析一下题目之后进行解析什么 ...