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
6 2
1 1 1 2 2 2
5
1 6
4 3
1 1
2 6
2 6
output
2
4
1
3
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个同样的数出现的位置,然后在块内二分即可。真的是一道好题。

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
const int M = 320;
struct Block
{
int l, r;
};
Block B[M];
vector<int>prepos[N];
int arr[N], pre[N], ori[N], belong[N];
int unit, bcnt; void reset(int bx)
{
sort(pre + B[bx].l, pre + B[bx].r + 1);
}
void init(int n)
{
int i;
unit = sqrt(n);
bcnt = n / unit;
if (n % unit)
++bcnt;
for (i = 1; i <= bcnt; ++i)
{
B[i].l = (i - 1) * unit + 1;
B[i].r = i * unit;
}
B[bcnt].r = n;
for (i = 1; i <= n; ++i)
belong[i] = (i - 1) / unit + 1;
for (i = 1; i <= bcnt; ++i)
reset(i);
}
int bs(int bx, int key)
{
int ans = -1;
int L = B[bx].l, R = B[bx].r;
while (L <= R)
{
int mid = MID(L, R);
if (pre[mid] < key)
{
ans = mid;
L = mid + 1;
}
else
R = mid - 1;
}
return ~ans ? ans - B[bx].l + 1 : 0;
}
int query(int l, int r)
{
int bl = belong[l], br = belong[r];
int ans = 0;
if (bl == br)
{
for (int i = l; i <= r; ++i)
if (ori[i] < l)
++ans;
}
else
{
for (int i = l; i <= B[bl].r ; ++i)
if (ori[i] < l)
++ans;
for (int i = B[br].l; i <= r; ++i)
if (ori[i] < l)
++ans;
for (int i = bl + 1; i < br; ++i)
ans += bs(i, l);
}
return ans;
}
int main(void)
{
int n, k, i;
scanf("%d%d", &n, &k);
for (i = 1; i <= n; ++i)
{
scanf("%d", &arr[i]);
int sz = prepos[arr[i]].size();
if (sz < k)
{
pre[i] = 0;
}
else
pre[i] = prepos[arr[i]][sz - k];
ori[i] = pre[i];
prepos[arr[i]].push_back(i);
}
init(n);
int last = 0;
int q;
scanf("%d", &q);
while (q--)
{
int l, r;
scanf("%d%d", &l, &r);
l = (l + last) % n + 1;
r = (r + last) % n + 1;
if (l > r)
swap(l, r);
printf("%d\n", last = query(l, r));
}
return 0;
}

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. Python监控日志中经常访问的ip

    一.需求:每分钟检查一次日志文件,如果这一分钟内同一个ip请求次数超过200次,加入黑名单 1.日志文件中,每一行的格式为:XXX.XXX.XXX.XXX - - [04/Jun/2017:05:25 ...

  2. node的webserver模板

    const express = require('express'); const swig =require('swig'); const fs = require('fs'); //创建服务器 c ...

  3. 配置vim nginx.conf高亮

    #!/bin/bashwget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vimmv nginx.vim ...

  4. Gearman任务分配

    Gearman 实现多数据库数据同步 测试环境:windows(mysql)+ 虚拟机(ubuntu + mysql)+ PHP 1:gearman 的官方文档可以了解gearman,在ubuntu中 ...

  5. utf8和utf8mb4区别

    原文链接 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编 ...

  6. Alarm机制用于定时服务

    获取一个 AlarmManager 的实例: AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE) ...

  7. python单元测试用例

    demo1.py #!/usr/bin/python # encoding: utf-8 def hello(): print "i am in demo1" def add(x, ...

  8. Android广告页循环播放

    摘要:项目要求做一个广告页,实现几秒更换一次广告页,下方还有指示第几张广告页,同样也支持手动左滑或右滑. 1.准备好粘贴5个有关广告页的类. ①BaseViewPager==>自定义高度的Vie ...

  9. python基础——18(面向对象2+异常处理)

    一.组合 自定义类的对象作为另一个类的属性. class Teacher: def __init__(self,name,age): self.name = name self.age = age t ...

  10. axure rp教程(四)动态面板滑动效果

    转载自: http://www.iaxure.com/74.html 实现目标: 1.  点击登录滑出登录面板 2.  点击确定滑出动态面板 最终效果如下: 这种效果可以通过两种方法实现: 首先准备需 ...