玄关,和哈希求条
查看原帖
玄关,和哈希求条
895690
gghack_Nythix楼主2024/8/19 16:00

rt,hack掉或者调出来都行。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[2000005];
int s2[2000005];
unsigned int st1[2000005],edn[2000005],sum[2000005];
unsigned int H[2000005];
void solve() {
	int ans = 0,maxx = -1,minn = 1e18;
	cin >> n;	
	for(int i = 1;i <= n;++i) cin >> a[i],s2[i] = s2[i - 1] + (a[i] & 1);
	int ji = (n + 1) / 2;
	for(int i = 1;i <= n;++i) H[i] = (rand() * rand() + 105 * rand()) + rand();//每个数的hash
	for(int i = 1;i <= n;++i) st1[i] = st1[i - 1] + H[i];//1开始
	edn[n + 1] = 0;
	for(int i = n;i >= 1;--i) edn[i] = edn[i + 1] + H[i];//n结尾
	for(int i = 1;i <= n;++i) sum[i] = sum[i - 1] + H[a[i]];
	for(int i = 1;i <= n;++i) if((s2[i] == ji && i == s2[i]) || (s2[n] - s2[i] == ji && n - i == ji)) {++ans;break;}//div = 2
	for(int i = 1;i < n;++i) { //div = 1
		maxx = max(maxx,a[i]);
		minn = min(minn,a[i]);
		if(sum[i] == st1[maxx] && edn[maxx + 1] == sum[n] - sum[i]) ++ans;
		if(sum[i] == edn[minn] && st1[minn + 1] == sum[n] - sum[i]) ++ans;
	}
	if(max(a[1],a[2]) - min(a[1],a[2]) == n - 1)++ans;
	else if(max(a[n],a[n - 1]) - min(a[n - 1],a[n]) == n - 1)++ans;	
	if(n == 1) return cout << "0\n",void();
	if(n == 2) return cout << "1\n",void();
	if(n == 3) return cout << "2\n",void();
	return cout << ans << '\n',void();
}
int32_t main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	srand(214914514);
	int T;
	cin >> T;
	while(T-->0)solve();
	return 0;
}
/*
6
2
1 2
20
16 2 10 18 4 6 8 20 14 12 3 9 17 13 1 15 7 11 19 5
9
3 4 1 5 2 6 7 8 9
10
1 3 2 4 7 6 5 8 10 9
13
5 7 3 11 1 9 13 6 10 4 2 8 12
5
1 2 3 4 5
*/
2024/8/19 16:00
加载中...