求助!Wa on#2
查看原帖
求助!Wa on#2
310439
星星与辰楼主2023/11/2 18:56

多半是多测的问题,但是我多测明明清空和覆盖了。

// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
// #pragma GCC optimize("Ofast","unroll-loops","inline")
#include <bits/stdc++.h>
using namespace std;
#define long long int
struct fIO {
    char ibuf[(1 << 20) + 1], *iS, *iT, obuf[(1 << 20) + 1], *oS;
    fIO() : iS(ibuf), iT(ibuf), oS(obuf) {} ~fIO() { fwrite(obuf, 1, oS - obuf, stdout); }
	#if ONLINE_JUDGE
	#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
	#else
	#define gh() getchar()
	#endif
	inline bool eof (const char &ch) { return ch == ' ' || ch == '\n' || ch == '\r' || ch == 't' || ch == EOF; }
    inline int read() {
        char ch = gh();
        int x = 0;
        while (!isdigit(ch)) ch = gh();
        while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = gh();
        return x;
    }
} IO;
int fa[100005] , nxt[100005] , las[100005] , siz[100005] , f[100005][30] , a[100005];
template<typename T>
T find (T x) {
	return (fa[x] == x) ? x : (fa[x] = find(fa[x]));
}
template<typename T>
inline T Max(T &x , T &y)
{
	return x < y ? y : x;
}
inline void solve() {
	const int n (IO.read()) , m (IO.read());
	int q (IO.read());
	for (int i (1) ; i <= n ; ++ i)
		siz[las[i] = fa[i] = i] = 1 , nxt[i] = a[i] = 0;
	
	
	for (int i (1) ; i <= m ; ++ i)
	{
		int x (find(IO.read())) , y (find(IO.read()));
		if (x != y)
		{
			if (siz[x] > siz[y])
				x ^= y , y ^= x , x ^= y;
			fa[y] = x;
			for (int now (x) ; now ; now = nxt[now])
				a[now - 1] = (a[now - 1] == 0) ? ((find(now - 1) == x) ? i : 0) : 0,
				a[now] = (a[now] == 0) ? ((find(now + 1) == x) ? i : 0) : 0;
			siz[x] += siz[y],
			nxt[las[x]] = y,
			las[x] = las[y];
		}
	}
	for (int i (1) ; i <= n - 1 ; ++ i)
		f[i][0] = a[i];
	for (int i (1) ; i <= n - 1 ; ++ i)
		for (int j (1) ; i >= (1 << j) ; ++ j)
			f[i][j] = Max(f[i][j - 1] , f[i - (1 << j - 1)][j - 1]);
	int ans (0);
	while (q --)
	{
		const int l (IO.read()) , r (IO.read() - 1);
		if (l <= r)
			printf("%d " , Max(f[r][int(log2(r - l + 1))] , f[l + (1 << int(log2(r - l + 1))) - 1][int(log2(r - l + 1))]));
		else putchar('0') , putchar(' ');
	}
	puts("");
	for (int i (1) ; i <= n ; ++ i)
		las[i] = fa[i] = i , siz[i] = 1 , nxt[i] = a[i] = 0;
	for (int i (1) ; i <= n - 1 ; ++ i)
		for (int j (1) ; i >= (1 << j) ; ++ j)
			f[i][j] = 0;
}
int main() {
	int T (IO.read());
	while (T --)
		solve();
	return 0;
}
2023/11/2 18:56
加载中...