萌新考前刚学图论求助
查看原帖
萌新考前刚学图论求助
209454
watermonster楼主2020/11/6 08:21

RT,为什么本地可以运行的代码交到CF上第一个点(就是样例)RE了?

提交编号97742546,有大佬可以给个HACK数据或者帮忙看一下吗

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
 
using namespace std;
 
#define il inline
#define re register
 
const int N = 2e5 + 10;
const int M = 3e5 + 10;
const int Q = 5e5 + 10;
 
namespace IO {
	char buf1[1<<21], buf2[1<<21], *p1 = buf1, *p2 = buf2;
	il int get_char() {return p1 == p2 && (p2 = (p1 = buf1) + fread(buf1, 1, 1<<21, stdin), p1 == p2) ? EOF : *p1++;}
	#define isdigit(ch) (ch >= 48 && ch <= 57)
	template <typename T>
	il void read(T &x) {
		x=0; re int f = 0, ch = get_char();
		while(!isdigit(ch)) f |= ch == '-', ch = get_char();
		while(isdigit(ch)) x = (x<<1) + (x<<3) + (ch^48), ch = get_char();
		x = f ? -x : x; return;
	}
	int p3,p4 = -1;
	il void Flush() {fwrite(buf2, 1, p4 + 1, stdout); p4 = -1; return;}
	il void print(int x) {
		if(p4 > (1<<20)) Flush();
		if(x < 0) buf2[++p4] = '-', x = -x;
		re int tmp[50];
		do{tmp[++p3] = x % 10 + 48;}while(x /= 10);
		do{buf2[++p4] = tmp[p3--];}while(p3);
		buf2[++p4] = '\n';
	}
}
using namespace IO;
 
int n, m, q, lg;
int w[N];
 
struct Edge{int u, v, w;}E[M];
il bool cmp(Edge a, Edge b){return a.w > b.w;}
 
int cnt, h[N<<1];
struct edge{int v, nxt;}e[N<<2];
il void add(int u, int v){e[++cnt] = (edge) {v, h[u]}; h[u] = cnt;}
 
int bel[N];
il int getanc(int x){return bel[x] = (bel[x] ^ x ? getanc(bel[x]) : x);}
il void merge(int u, int v) {
	u = getanc(u); v = getanc(v);
	bel[u] = v; return;
}
 
int fa[20][N], dep[N], lef[N], rig[N];
il void dfs(int x, int f) {
	if(x <= n) {lef[x] = rig[x] = ++rig[0]; return;}
	for(re int i = h[x]; i; i = e[i].nxt) {
			fa[0][e[i].v] = x, dfs(e[i].v, f);
			lef[x] = min(lef[x], lef[e[i].v]);
			rig[x] = max(rig[x], rig[e[i].v]);
		}
	return;
}
 
int dti[N];
il void kruscal() {
	sort(E + 1, E + m +1, cmp); re int tot = n;
	for(re int i = 1; i <= (n<<1); ++i) bel[i] = i;
	for(re int i = 1, u, v; i <= m; ++i) {
		u = getanc(E[i].u); v = getanc(E[i].v);
		if(u == v) continue;
		dti[++tot] = E[i].w; bel[u] = bel[v] = tot;
		add(tot, u); add(tot, v);
		if(tot == n*2 - 1) break;
	}
	memset(lef, 0x3f, sizeof(lef));
	for(re int i = tot; i > n; --i)
		if(!rig[i]) dfs(i, 0);
	for(re int i = 1; i <= lg; ++i)
		for(re int j = 1; j <= tot; ++j)
			fa[i][j] = fa[i - 1][fa[i - 1][j]];
	return;
}
 
struct operation{int opt, x;}ope[Q];
 
int Max[N<<2], pos[N<<2];
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
il void pushup(int x)
{
	pos[x] = Max[ls(x)] > Max[rs(x)] ? pos[ls(x)] : pos[rs(x)];
	Max[x] = Max[pos[x]]; return;
}
il void change(int i, int l, int r, int po, int x)
{
	if(l == r) {Max[i] = x; pos[i] = i; return;}
	re int mid = (l + r) >> 1;
	if(po > mid) change(rs(i), mid + 1, r, po, x);
	else change(ls(i), l, mid, po, x);
	pushup(i); return;
}
il int query(int i, int l, int r, int L, int R)
{
	if(l > R || r < L) return 0;
	if(l >= L && r <= R) return pos[i];
	re int mid = (l + r) >> 1;
	re int pl = query(ls(i), l, mid, L, R), pr = query(rs(i), mid + 1, r, L, R);
	return Max[pl] > Max[pr] ? pl : pr;
}
 
il void pushall(int x)
{
	while(x/2) pushup(x), x /= 2;
	return;
}
 
il int ask(int x, int ti) {
	re int res = 0, goal = 0;
	for(re int i = lg; i >= 0; --i)
		if(dti[fa[i][x]] > ti) x = fa[i][x];
	goal = query(1, 1, n, lef[x], rig[x]);
	res = Max[goal]; Max[goal] = 0; pushall(goal);
	return res;
}
 
int main() {
	read(n), read(m), read(q);
	for(re int i = 1; i <= n; ++i) read(w[i]);
	for(re int i = 1, u, v, w; i <= m; ++i) {
		read(u), read(v);
		E[i] = (Edge) {u, v, q + 1};
	}
	for(re int i = 1, opt, x; i <= q; ++i) {
		read(opt); read(x);
		ope[i] = (operation) {opt, x};
		if(opt == 2) E[x].w = i;
	}
	kruscal();
	for(re int i = 1; i <= n; ++i) change(1, 1, n, lef[i], w[i]);
	for(re int i = 1; i <= q; ++i) if(ope[i].opt == 1) print(ask(ope[i].x, i));
	Flush(); return 0;
}
2020/11/6 08:21
加载中...