求助卡常
查看原帖
求助卡常
241817
Chancylaser楼主2024/10/17 10:57

RT。

#include<bits/stdc++.h>
#define PII pair<int,int>
#define P16 pair<i16,i16>
#define F first
#define S second
#define i16 unsigned short
using namespace std;
typedef long long LL;
const int N=505, M=513;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int T;
int n,m;
int a[N];
i16 xsum[N];
bool dp[N][N];
vector<int> G[N*N], usd[N];
P16 pk1[N][M], pk3[N][M];
i16 rlen[N][N];

int getid(int i,int j){return (i-1)*n+j-1;}

i16 pos[N];

i16 Qxor(const i16 &l,const i16 &r){return xsum[r]^xsum[l-1];}

P16 Revid(int x){return {x/n+1,x%n+1};}

vector<pair<i16,P16 > > Ans;
void dfs(int x){
	int L,R;
	tie(L,R)=Revid(x);
	if(L==R) return;
	for(auto y:G[x]) dfs(y);
	Ans.push_back({pos[Revid(G[x][0]).F],{pos[Revid(G[x][1]).F],pos[Revid(G[x][2]).F]}});
	for(int i=R+1;i<=n;i++) pos[i]-=rlen[L][R];
}

void Clear(){
	for(i16 i=1;i<=n;i++) usd[i].clear();
	for(i16 i=1;i<=n;i++)
		for(i16 j=i;j<=n;j++)
			dp[i][j]=0, G[getid(i,j)].clear();
	for(i16 i=1;i<=n;i++)
		for(i16 v=0;v<=m;v++)
			pk1[i][v]={n+1,0},
			pk3[i][v]={n+1,0};
	
}

void ckmin(P16 &x,const P16 &y){ if(y.F < x.F) x=y;}

//void Giv(i16 i,i16 j,const int &a,const int &b,const int &c,const int &d){
//	G[getid(i,j)].emplace_back(getid(i,a));
//	G[getid(i,j)].emplace_back(getid(b,c));
//	G[getid(i,j)].emplace_back(getid(d,j));
//	rlen[i][j]=b-a-1 + d-c-1 + 2;
//	dp[i][j]=1;
//	usd[j].emplace_back(i);
//}

void Trans(i16 i,i16 j){
	auto Giv = [&](const i16 &a,const i16 &b,const i16 &c,const i16 &d) {
		G[getid(i,j)].emplace_back(getid(i,a));
		G[getid(i,j)].emplace_back(getid(b,c));
		G[getid(i,j)].emplace_back(getid(d,j));
		rlen[i][j] = b - a - 1 + d - c - 1 + 2;
		dp[i][j] = true;
		usd[j].emplace_back(i);
	};	
	
	for(auto d:usd[j]){
		if(d>=i && dp[d][j] && pk3[i][Qxor(d,j)].F < d){
			int a=pk3[i][Qxor(d,j)].S;
			int b,c;
			tie(c,b)=pk1[a+1][Qxor(i,a)^Qxor(d,j)];
			Giv(a,b,c,d);
			return;
		}
	}
}

void update(){
	for(i16 st=n;st>=1;st--){
		for(i16 len=1;st+len-1<=n;len++){
			i16 ed=st+len-1;
			Trans(st,ed);
			if(dp[st][ed]){
				i16 val=Qxor(st,ed);
				ckmin(pk1[st][val],{ed,st});
				for(i16 i=st;i>=1;i--)
					ckmin(pk1[i][val],{ed,st});
				if(ed<n){
					for(i16 v=0;v<=m;v++)
						ckmin(pk3[st][val^v],{pk1[ed+1][v].F,ed});
				}
			}
		}		
	}
}

void Solve(){
	n=read();
	m=0;
	for(i16 i=1;i<=n;i++){
		a[i]=read();
		xsum[i]=xsum[i-1]^a[i];
		m=max(m,a[i]);
	}
	m=1<<(__lg(m)+1);
	Clear();
	
	for(i16 i=1;i<=n;i++)
		dp[i][i]=1,usd[i].emplace_back(i);
	update();
	
	if(!dp[1][n]){
		printf("Shuiniao\n");
		return;
	}
	printf("Huoyu\n");
	for(i16 i=1;i<=n;i++) pos[i]=i;
	Ans.clear();
	dfs(getid(1,n));
	printf("%d\n",(int)Ans.size());
	for(auto i:Ans)
		printf("%d %d %d\n",i.F,i.S.F,i.S.S);
}

int main(){
//	freopen("P9746_18.in","r",stdin);
//	freopen("qwq.out","w",stdout);
	
	T=read();
	while(T--){
		Solve();
	}
	return 0;
}
2024/10/17 10:57
加载中...