QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#453816#8818. Colorful Graph 3csy2005WA 11ms3804kbC++144.7kb2024-06-24 12:20:492024-06-24 12:20:49

Judging History

你现在查看的是最新测评结果

  • [2024-06-24 12:20:49]
  • 评测
  • 测评结果:WA
  • 用时:11ms
  • 内存:3804kb
  • [2024-06-24 12:20:49]
  • 提交

answer

#include <iostream>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<ctime>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<bitset>
#include<cassert>
#include<random>
#define sqr(x) ((x)*(x))
#define fz1(i,n) for ((i)=1;(i)<=(n);(i)++)
#define fd1(i,n) for ((i)=(n);(i)>=1;(i)--)
#define fz0g(i,n) for ((i)=0;(i)<=(n);(i)++)
#define fd0g(i,n) for ((i)=(n);(i)>=0;(i)--)
#define fz0k(i,n) for ((i)=0;(i)<(n);(i)++)
#define fd0k(i,n) for ((i)=(((long long)(n))-1);(i)>=0;(i)--)
#define fz(i,x,y) for ((i)=(x);(i)<=(y);(i)++)
#define fd(i,y,x) for ((i)=(y);(i)>=(x);(i)--)
#define fzin fz1(i,n)
#define fzim fz1(i,m)
#define fzjn fz1(j,n)
#define fzjm fz1(j,m)
#define ff(c,itr) for (__typeof((c).begin()) itr=(c).begin();itr!=(c).end();++itr)
#define pb push_back
#define mk make_pair
#define rdst(st,len){static char ss[len];scanf(" %s",ss);(st)=ss;}
#define spln(i,n) (i==n?'\n':' ')
#define fac_init(n){fac[0]=fac[1]=inv[1]=fi[0]=fi[1]=1;fz(i,2,n){fac[i]=1ll*fac[i-1]*i%mod;inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;fi[i]=1ll*fi[i-1]*inv[i]%mod;}}
using namespace std;
typedef long long i64;
typedef long double f80;
typedef unsigned int u32;
typedef unsigned long long u64;
//typedef __int128 i128;
//typedef unsigned __int128 u128;
/*#ifndef ONLINE_JUDGE
	FILE *___=freopen(".in","r",stdin);
#endif*/
inline void read(int &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
int t,n,m,i,j;
vector<int> v0,v1;
vector<pair<pair<int,int>,int> > ans;
int lx,ly;
int id(int x,int y)
{
	return (y-1)*lx+x;
}
void solve2()
{
	int mi=ans.size(),i,j,k,s=0;
	fz1(i,n){
		j=n/i;
		while(i*j<n) j++;
		if(i>j) break;
		int t=n+n-i-j;
		if(i*2>j||(i*2==j&&i*j==n)){
			if(t<mi){
				mi=t;
				s=i;
			}
		}
	}
	if(!s) return;
	i=s;j=n/i;
	while(i*j<n) j++;
	lx=i;ly=j;
	ans.clear();
	fz1(i,ly){
		int p=id(max(1,lx-i+1),i);
		fz1(j,lx){
			int q=id(j,i);
			if(q==p) continue;
			if(q>n) break;
			ans.push_back(make_pair(make_pair(p,q),v1[0]));
		}
	}
	int c=0,x=1,ty=ly;
	if(lx*ly!=n){
		fz1(i,ly-1){
			int p=id(1,i);
			int q=id(1,ly);
			ans.push_back(make_pair(make_pair(p,q),v1[1]));
		}
		fz(i,2,lx){
			int p=id(i,ly);
			if(p<=n){
				int q=id(i,1);
				ans.push_back(make_pair(make_pair(p,q),v1[1]));
			}
		}
		x++;
		ty--;
	}
	while(x<=lx){
		c++;c=min(c,ly);
		int l=c,r=c,flg=0;
		fz1(j,ty-1){
			if(flg){
				l--;
				if(l==0) l=ty;
			}
			else{
				r++;
				if(r==ty+1) r=1;
			}
			ans.push_back(make_pair(make_pair(id(x,l),id(x,r)),v1[1]));
			flg^=1;
		}
		x++;
	}
	assert(ans.size()==mi);
}
int lst[500005],cnt; 
void solve3()
{
	int mi=ans.size(),i,j,k,s=0;
	fz1(i,n){
		int t=n+n-i-1;
		if(1ll*i*(i-1)/2<=n-1){
			if(t<mi){
				mi=t;
				s=i;
			}
		}
	}
	if(!s) return;
	ans.clear();
	lx=s;
	cnt=lx;
	fz1(i,lx) lst[i]=i;
	fz(i,2,lx){
		ans.push_back(make_pair(make_pair(lst[1],lst[i]),v1[0]));
	}
	fz(i,2,lx){
		fz(j,i+1,lx){
			cnt++;
			ans.push_back(make_pair(make_pair(lst[j],cnt),v0[0]));
			lst[j]=cnt;
			ans.push_back(make_pair(make_pair(lst[i],cnt),v1[0]));
		}
	}
	while(++cnt<=n){
		ans.push_back(make_pair(make_pair(1,cnt),v0[0]));
		ans.push_back(make_pair(make_pair(1,cnt),v1[0]));
	}
	assert(ans.size()==mi);
}
int main()
{
	read(t);
	while(t--){
		read(n);read(m);
		v0.clear();v1.clear();ans.clear();
		int id=0;
		fz1(i,m){
			int x;read(x);
			if(x==0)v0.push_back(i);
			if(x==1)v1.push_back(i);
			if(x>1) id=i;
		}
		if(id){
			printf("%d\n",n-1);
			fz(i,2,n){
				printf("%d %d %d\n",1,i,id);
			}
			continue;
		}
		if(v1.size()+1>=n){
			printf("%d\n",n-1);
			fz(i,2,n){
				printf("%d %d %d\n",1,i,v1[i-2]);
			}
			continue;
		}
		int cur=1,fir=1;
		while(cur<n){
			int lst=1;
			if(fir){
				fir=0;
				ff(v1,it){
					if(cur<=n){
						cur++;
						ans.push_back(make_pair(make_pair(lst,cur),*it));
						lst=cur;
					}
				}
				ff(v1,it){
					if(cur<=n){
						cur++;
						ans.push_back(make_pair(make_pair(lst,cur),*it));
						lst=cur;
					}
				}
			}
			ff(v0,it){
				if(cur<=n){
					cur++;
					ans.push_back(make_pair(make_pair(lst,cur),*it));
					lst=cur;
				}
			}
			ff(v1,it){
				if(cur<=n){
					cur++;
					ans.push_back(make_pair(make_pair(lst,cur),*it));
					lst=cur;
				}
			}
			ans.back().first.second=1;
			cur--;
		}
		if(v1.size()==2&&v0.size()==0){
			solve2();
		}
		if(v1.size()==1&&v0.size()==1){
			solve3();
		}
		printf("%d\n",(int)ans.size());
		ff(ans,it){
			printf("%d %d %d\n",it->first.first,it->first.second,it->second);
		}
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3752kb

input:

3
4 2
1 1
2 2
0 0
5 2
3 1

output:

4
1 2 1
2 3 2
3 4 1
4 1 2
2
1 2 1
2 1 2
4
1 2 1
1 3 1
1 4 1
1 5 1

result:

ok orz (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 11ms
memory: 3804kb

input:

4645
2 2
0 0
2 2
0 1
2 2
1 1
3 2
0 0
3 2
0 1
3 2
1 1
3 3
0 0 0
3 3
1 0 0
3 3
1 0 1
3 3
1 1 1
4 2
0 0
4 2
1 0
4 2
1 1
4 3
0 0 0
4 3
0 0 1
4 3
0 1 1
4 3
1 1 1
4 4
0 0 0 0
4 4
0 1 0 0
4 4
1 1 0 0
4 4
1 1 1 0
4 4
1 1 1 1
5 2
0 0
5 2
1 0
5 2
1 1
5 3
0 0 0
5 3
0 1 0
5 3
1 1 0
5 3
1 1 1
5 4
0 0 0 0
5 4
0 1...

output:

2
1 2 1
2 1 2
1
1 2 2
1
1 2 1
4
1 2 1
2 1 2
1 3 1
3 1 2
3
1 2 2
2 3 2
3 1 1
2
1 2 1
1 3 2
3
1 2 1
2 3 2
3 1 3
3
1 2 1
2 3 1
3 1 2
2
1 2 1
1 3 3
2
1 2 1
1 3 2
6
1 2 1
2 1 2
1 3 1
3 1 2
1 4 1
4 1 2
4
1 2 1
2 3 1
3 4 2
4 1 1
4
1 2 1
2 3 2
3 4 1
4 1 2
5
1 2 1
2 3 2
3 1 3
1 4 1
4 1 2
4
1 2 3
2 3 3
3 4 1
...

result:

wrong answer your solution is suboptimal (test case 143)