萌新求助分块全 WA 大水题
  • 板块P4135 作诗
  • 楼主SIXIANG32
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/15 22:41
  • 上次更新2023/10/28 03:39:35
查看原帖
萌新求助分块全 WA 大水题
298549
SIXIANG32楼主2022/4/15 22:41

如题

调崩了,分块和我有仇罢/kk

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#define MAXN 125000
#define QWQ cout << "qwq" << endl;
using namespace std;
int n, m, CCC, cnt;
int a[MAXN + 10];
int pl[MAXN + 10], pr[MAXN + 10], cl[MAXN + 10], len;
int c[1000 + 10][MAXN + 10], T[MAXN + 10];
int f[1000 + 10][1000 + 10];
int ans;
void qwq(int l, int r, int num) {
	T[num]++;
    if((c[r][num] - c[l - 1][num] + T[num]) % 2 == 0) ans++;
    else if((c[r][num] - c[l - 1][num] + T[num]) > 2) ans--;
}
int solve(int l, int r) {
    int L = cl[l], R = cl[r];
    int x = 0, y = 0;
    if(L + 1 <= R - 1) x = L + 1, y = R - 1;
    ans = f[x][y];
    if(x == y) {
        for(int p = l; p <= r; p++) qwq(x, y, a[p]);
        for(int p = l; p <= r; p++) T[a[p]]--;
    }
    else {
        for(int p = l; p <= pr[L]; p++) qwq(x, y, a[p]);
        for(int p = pl[R]; p <= r; p++) qwq(x, y, a[p]);
        for(int p = l; p <= pr[L]; p++) T[a[p]]--;
        for(int p = pl[R]; p <= r; p++) T[a[p]]--;
    }
    return ans;
}
void block() {
    len = sqrt(n);
    for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
        pl[p] = (p - 1) * len + 1;
        pr[p] = p * len;
    }
    for(int p = 1; p <= n; p++)
        cl[p] = (p - 1) / len + 1, c[cl[p]][a[p]]++;
    for(int p = 1; p <= MAXN; p++)
    	for(int i = 1; i <= ceil(n * 1.0 / len); i++)
    		c[i][p] += c[i - 1][p];
    for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
        int tat = 0;
        for(int i = pl[p]; i <= n; i++) {
            T[a[i]]++;
            if(T[a[i]] % 2 == 0) tat++;
            else if(T[a[i]] > 2) tat--;
            f[p][cl[i]] = tat;
        }
        for(int i = pl[p]; i <= n; i++)
        	T[a[i]]--;
    }
    /*for(int p = 1; p <= ceil(n * 1.0 / len); p++) {
    	for(int i = p; i <= ceil(n * 1.0 / len); i++)
    		cout << f[p][i] << ' ';
    	cout <<endl;
	}*/ 
	memset(T, 0, sizeof(T));
}
int main() {
    //freopen("test.txt", "r", stdin);
    //freopen("taxt.txt", "w", stdout);
    cin >> n >> CCC >> m;
    for(int p = 1; p <= n; p++) cin >> a[p];
    block();
    int last = 0;
    while(m--) {
        int x, y;
        cin >> x >> y;
        x = (x + last) % n + 1, y = (y + last) % n + 1;
        if(x > y) swap(x, y);
        last = solve(x, y);
       cout << last << endl;
    }
}
2022/4/15 22:41
加载中...