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

Posted Meek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 22 E. Army Creation 主席树 或 分块相关的知识,希望对你有一定的参考价值。

E. Army Creation
 
 

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

 

题意:

    给出长度为n的数组和k

    要求在线询问区间[l, r]权值,  权值定义为对于所有不同元素a[i]在区间出现的次数总和;

     如果x出现次数>k, 那么按k算。

题解

   k = 1时就是 求区间不同数个数了

   k大一点,那么往前数第k个以前出现的相同的数就是多余的了;

  插好,主席树求一求

      这题还可以分快写

 

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18+1LL;
const double Pi = acos(-1.0);
const int N = 4e6+10, M = 1e3+20, mod = 1e9+7,inf = 2e9;

int n,k,a[N];
vector<int > G[N];
int l[N],r[N],v[N],sz;
void update(int x,int &y,int ll,int rr,int k,int c) {
    y = ++sz;
    v[y] = v[x] + c;
    r[y] = r[x];
    l[y] = l[x];
    if(ll == rr) return ;
    if(k <= mid)
        update(l[x],l[y],ll,mid,k,c);
    else update(r[x],r[y],mid+1,rr,k,c);
}
int query(int x,int ll,int rr,int s,int t) {
    if(s <= ll && rr <= t) return v[x];
    int ret = 0;
    if(s <= mid) ret += query(l[x],ll,mid,s,t);
    if(t > mid) ret += query(r[x],mid+1,rr,s,t);
    return ret;
}

int b[N],root[N];
int main() {
    scanf("%d%d",&n,&k);
    for(int i = 1; i <= n; ++i)scanf("%d",&a[i]);
    for(int i = 1; i <= n; ++i)G[a[i]].push_back(i);
    for(int i = 1; i <= 100000; ++i) {
        if(G[i].size() <= k) continue;
        for(int j = k; j < G[i].size(); ++j) {
            b[G[i][j]] = G[i][j-k];
        }
    }
    for(int i = 1; i <= n; ++i) {
        int xx = 0;
        if(b[i])
            update(root[i-1],xx,1,n,b[i],-1),
            update(xx,root[i],1,n,i,1);
        else update(root[i-1],root[i],1,n,i,1);

    }

    int q,last = 0;
    scanf("%d",&q);
    while(q--) {
        int x,y;
        scanf("%d%d",&x,&y);
        int L = (x + last)%n + 1;
        int R = (y + last)%n + 1;
        if(L > R) swap(L,R);
        last = query(root[R],1,n,L,R);
        printf("%d\n",last);
    }
    return 0;
}

 

以上是关于Educational Codeforces Round 22 E. Army Creation 主席树 或 分块的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27