35pts, 求hack
查看原帖
35pts, 求hack
400057
Jie_Xu_Sheng楼主2022/12/1 21:34

只AC了第一档和第三档,求hack

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[2000010],nxt[2000010],vis[610];
int s[310][3],ans[4000010][3],cnt,xh[310][3];
void work(){
	cnt=0;
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		scanf("%d",&a[i]);
	}
	if(k==(2*n-2)){
		for(int i=1;i<=m;i++){
			if(nxt[a[i]]==0){
				nxt[a[i]]=1;
				for(int j=1;j<n;j++){
					if(s[j][0]==0){
						s[j][0]=a[i];
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						break;
					}
					if(s[j][1]==0){
						s[j][1]=a[i];
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						break;
					}
				}
			}else{
				for(int j=1;j<n;j++){
					if(s[j][0]==a[i]){
						ans[++cnt][0]=1;
						ans[cnt][1]=n;
						ans[++cnt][0]=2;
						ans[cnt][1]=j;
						ans[cnt][2]=n;
						s[j][0]=s[j][1];
						s[j][1]=0;
						break;
					}
					if(s[j][1]==a[i]){
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						s[j][1]=0;
					}
				}
				nxt[a[i]]--;
			}
		}
	}else{
		for(int i=1;i<=m;i++){
			nxt[i]=0;
		}
		for(int i=1;i<=2*n;i++){
			vis[i]=0;
		}
		for(int i=1;i<=m;i++){
			if(vis[a[i]]==0){
				vis[a[i]]=i;
			}else{
				nxt[vis[a[i]]]=i;
				vis[a[i]]=i;
			}
		}
		for(int i=1;i<=m;i++){
			vis[i]=0;
		}
		for(int i=1;i<=m;i++){
			if(nxt[i]==0) nxt[i]=1e9;
		}
		for(int i=1;i<=n;i++){
			s[i][0]=s[i][1]=s[i][2]=0;
		}
		int bm=0,kz=n;
		for(int i=1;i<=m;i++){
			if(vis[a[i]]==0){
				vis[a[i]]=1;
				int fl=0;
				for(int j=1;j<=n;j++){
					if(j==kz) continue;
					if(j==bm) continue;
					if(s[j][0]==0){
						s[j][0]=a[i];
						xh[j][0]=i;
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						fl=1;
						break;
					}
					if(s[j][1]==0){
						s[j][1]=a[i];
						xh[j][1]=i;
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						fl=1;
						break;
					}
				}
				if(fl==1) continue;
				for(int j=1;j<=n;j++){
					if(j==kz) continue;
					if(nxt[xh[j][0]]<nxt[xh[j][1]]){
						s[j][2]=a[i];
						xh[j][2]=i;
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						fl=1;
						break;
					}
				}
				if(fl==1) continue;
				ans[++cnt][0]=1;
				ans[cnt][1]=kz;
				s[kz][0]=a[i];
				xh[kz][0]=i;
				kz=0;
			}else{
			//	cout<<s[1][0]<<" "<<s[1][1]<<" "<<s[1][2]<<endl;
				int minn=2e9;
				if(kz==0){
					for(int j=1;j<=n;j++){
						if(nxt[xh[j][0]]<minn){
							minn=nxt[xh[j][0]];
							bm=j;
						}
					}
				}
				vis[a[i]]--;
				for(int j=1;j<=n;j++){
					if(j==kz&&s[kz][0]==0) continue;
					if(s[j][0]==a[i]){
						if(s[j][1]==0){
							ans[++cnt][0]=1;
							ans[cnt][1]=j;
							kz=j;
							s[j][0]=0;
							xh[j][0]=0;
							if(j==bm){
								bm=0;
							}
							break;
						}else{
							ans[++cnt][0]=1;
							ans[cnt][1]=kz;
							s[j][0]=s[j][1];
							xh[j][0]=xh[j][1];
							s[j][1]=s[j][2];
							xh[j][1]=xh[j][2];
							s[j][2]=0;
							xh[j][2]=0;
							ans[++cnt][0]=2;
							ans[cnt][1]=kz;
							ans[cnt][2]=j;
							break;
						}
					}else if(s[j][1]==a[i]){
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						s[j][1]=0;
						xh[j][1]=0;
						break;
					}else if(s[j][2]==a[i]){
						ans[++cnt][0]=1;
						ans[cnt][1]=j;
						s[j][2]=0;
						xh[j][2]=0;
						break;
					}
				}
			}
		}
	}
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++){
		printf("%d ",ans[i][0]);
		for(int j=1;j<=ans[i][0];j++){
			printf("%d ",ans[i][j]);
		}
		printf("\n");
	}
}
signed main(){
//	freopen("meow.in","r",stdin);
//	freopen("meow.out","w",stdout);
	int t;
	cin>>t;
	while(t--){
		work();
	}
	return 0;
}
2022/12/1 21:34
加载中...