刚学莫队,求救,样例过了
查看原帖
刚学莫队,求救,样例过了
342584
流夏的美楼主2020/5/8 22:03

RT

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#define maxn 50005 
using namespace std;

struct node{
	int l , r , id;
};

int l = 1 , r , k , m , q, ans , col[maxn] , print[maxn] , be[maxn] , cnt[maxn];
char c;
bool f[maxn];
node que[maxn];

int cmp(node a , node b)
{
	return (be[a.l] ^ be[b.l]) ? be[a.l] < be[b.l] : (be[a.l] & 1) ? a.r < b.r : a.r > b.r;
}

int main()
{
	scanf("%d %d %d" , &m , &q , &k);
	for(int i = 1; i <= m; ++i)
		scanf("%d" , &col[i]);
	for(int i = 1; i <= q; ++i){
		scanf("%d %d" , &que[i].l , &que[i].r);
		que[i].id = i;
	}
	int size = sqrt(m);
	int len = ceil((double)m / size);
	for(int i = 1; i <= len; ++i){
		for(int j = (i - 1) * size + 1; j <= i * size; ++j){
			be[j] = i;
		}
	}
	sort(que + 1 , que + 1 + q , cmp);
	for(int i = 1; i <= q; ++i){
		int ql = que[i].l , qr = que[i].r;
		while(l < ql) {--cnt[col[l]] , ans -= 2 * cnt[col[l]] + 1 , ++l;}
		while(l > ql) {--l , ++cnt[col[l]]; ans += 2 * cnt[col[l]] - 1;} 
		while(r < qr) {++r , ++cnt[col[r]]  , ans += 2 * cnt[col[r]] - 1;} 
		while(r > qr) {--cnt[col[r]] , ans -= 2 * cnt[col[r]] + 1 , --r;} 
		print[que[i].id] = ans;
	}
	for(int i = 1; i <= q; ++i) 
		printf("%d\n" , print[i]);
}

网上才看了莫队,兴高采烈的来打了一道,结果wa了,求大佬找错QAQ

2020/5/8 22:03
加载中...