48ptsWA 求调
查看原帖
48ptsWA 求调
685964
shuqiang楼主2024/10/17 01:18

调了 3h 了,一直看不出为啥 WA。

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>

using namespace std;

const int N = 2e5 + 10;
int c, n, m, k, q, u, v, a[N], d[N], lst[N], fg[N], idx = 0, sqrtm;
bool is1[N];

struct line{
	int l, r, id, ans;
	bool operator < (const line & o) const{
		return r < o.r;
	}
} b[N];

bool cmp(line x, line y){
	return x.id < y.id;
}

vector<int> g[N], gn[N];

void add(int x, int xx){
	x = k - x + 1;
	while(x <= k+1){
		d[x] += xx;
		x += x & -x;
	}
}

int get(int x){
	x = k - x + 1;
	int ret = 0;
	while(x){
		ret += d[x];
		x -= x & -x;
	}
	return ret;
}

int main(){
	cin >> c >> n >> m >> k >> q;
	sqrtm = sqrt(m);
	for(int i = 0; i < m; i++){
		cin >> u >> v;
		g[u].push_back(v);
		if(v == 1) is1[u] = 1;
	}
	for(int i = 1; i <= n; i++){
		if(g[i].size() >= sqrtm){
			for(int j: g[i]) gn[j].push_back(i);
		}
	}
	for(int i = 1; i <= k; i++) cin >> a[i];
	for(int i = 0; i < q; i++){
		cin >> b[i].l >> b[i].r;
		b[i].id = i;
	}
	sort(b, b + q);
	for(int i = 1; i <= k; i++){
		u = a[i];
		add(lst[u], -1);
		if(is1[u]) lst[u] = i;
		else if(g[i].size() >= sqrtm){
			lst[u] = max(lst[u], fg[u]);
		}
		else{
			for(int v: g[u]){
				lst[u] = max(lst[u], lst[v]);
			}
		}
		for(int v: gn[u]){
			fg[v] = max(fg[v], lst[u]);
		}
		add(lst[u], 1);
		while(idx < q && b[idx].r == i){
			b[idx].ans = n - 1 - get(b[idx].l);
			idx++;
		}
	}
	sort(b, b + q, cmp);
	for(int i = 0; i < q; i++) cout << b[i].ans << '\n';
	return 0;
}
2024/10/17 01:18
加载中...