QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#98846#4218. Hidden Graph_yjhWA 2ms3444kbC++142.7kb2023-04-20 14:47:282023-04-20 14:47:29

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-20 14:47:29]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:3444kb
  • [2023-04-20 14:47:28]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
int n,mx,m,col[2005],d[2005],dd[2005];
bool del[2005],vis[2005];
vector <int> nt[2005];
vector <int> v[2005];
queue <int> q;
bool check(int x,int nw) {
	for(int i=1;i<=nw;i++) dd[i]=v[i].size(),del[i]=false,vis[i]=0;
	while(!q.empty()) q.pop();
	for(int i=1;i<=nw;i++) {
		if(dd[i]<=x-1) {
			q.push(i);
			del[i]=true;
		}
	}
	int cnt=0;
	while(!q.empty()) {
		cnt++;
		int s=q.front();
//		cout<<"S"<<s<<'\n';
		vis[s]=true;
		q.pop();
		for(int to:v[s]) {
			if(vis[to]) continue;
			dd[to]--;
			if(dd[to]<=x-1&&!del[to]) {
				q.push(to);
				del[to]=true;
			}
		}
	}
//	cout<<"WYY"<<x<<' '<<cnt<<'\n';
	if(cnt==nw) return 1;
	return 0;
}
int main() {
	cin>>n;
	nt[1].push_back(1);
	mx=1;
	for(int nw=2;nw<=n;nw++) {
		for(int i=1;i<=mx;i++) {
			if(!nt[i].size()) continue;
			int sz=nt[i].size();
			while(sz) {
				cout<<"? "<<sz+1<<' ';
				for(int k:nt[i]) {
					if(!del[k]) cout<<k<<' ';
				}
				cout<<nw<<endl;
				int x,y;
				cin>>x>>y;
				if(x==-1||y==-1) break;
				if(x==nw) swap(x,y);
				v[y].push_back(x);
				v[x].push_back(y);
				m++;
				del[x]=true;
				sz--;
			}
			nt[i].clear();
		}
		mx=n+1;
		for(int i=1;i<=nw;i++) {
			del[i]=false;
			col[i]=0;
//			cout<<i<<' '<<v[i].size()<<'\n';
//			mx=min(mx,int(v[i].size())+1);
		    d[i]=v[i].size();
		}
//		cout<<mx<<'\n';
//		if(n==2000) assert(mx<=3);
        int l=1,r=nw,ans=-1;
        while(l<=r) {
        	int mid=(l+r)/2;
        	if(check(mid,nw)) r=mid-1,ans=mid;
        	else l=mid+1;
		}
		mx=ans;
//		cout<<mx<<'\n';
		for(int i=1;i<=nw;i++) {
			if(d[i]<=mx-1) {
				q.push(i);
//				break;
			}
		}
//		cout<<q.front()<<'\n';
		vector <int> tmp;
		while(!q.empty()) {
			int s=q.front();
			q.pop();
			tmp.clear();
			del[s]=true;
//			cout<<s<<col[s]<<'\n';
		    if(!col[s]) {
		    	for(int to:v[s]) {
		    		if(col[to]) tmp.push_back(col[to]);
				}
				sort(tmp.begin(),tmp.end());
				int nww=1;
				for(int i:tmp) {
					if(nww!=i) break;
					nww++;
				}
//				cout<<"S"<<nww<<'\n';
				col[s]=nww;
				for(int to:v[s]) {
					d[to]--;
//					if(!del[to]) q.push(to); 
					if(d[to]<=mx-1&&!del[to]) q.push(to);
				}
				nt[col[s]].push_back(s);
			}
		}
//		for(int i=1;i<=nw;i++) {
//			cout<<i<<':';
//			for(int to:v[i]) {
//				cout<<to<<' ';
//			}
//			cout<<'\n';
//		}
		for(int i=1;i<=nw;i++) {
			del[i]=false;
//			assert(col[i]);
//			cout<<col[i]<<' ';
		}
//		cout<<'\n';
	}
	cout<<'!'<<' '<<m<<'\n';
	for(int i=1;i<=n;i++) {
		for(int j:v[i]) {
			if(j<i) continue;
			cout<<i<<' '<<j<<'\n';
		}
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 3436kb

input:

3
1 2
1 3
2 3

output:

? 2 1 2
? 2 1 3
? 2 2 3
! 3
1 2
1 3
2 3

result:

ok correct

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 3444kb

input:

10
1 2
1 3
-1 -1
-1 -1
1 4
4 5
2 5
-1 -1
-1 -1
2 6
-1 -1
-1 -1
3 7
-1 -1
-1 -1
-1 -1
4 8
3 8
-1 -1
-1 -1
-1 -1
-1 -1

output:

? 2 1 2
? 2 1 3
? 2 2 3
? 3 2 3 4
? 2 1 4
? 4 2 3 4 5
? 3 2 3 5
? 2 3 5
? 2 1 5
? 4 2 3 4 6
? 3 3 4 6
? 3 5 1 6
? 4 3 4 6 7
? 3 4 6 7
? 3 5 1 7
? 2 2 7
? 4 3 4 6 8
? 3 3 6 8
? 2 6 8
? 3 5 7 8
? 5 5 6 7 8 9
? 6 5 6 7 8 9 10
! 9
1 2
1 3
1 4
2 5
2 6
3 7
3 8
4 5
4 8

result:

wrong answer read 9 edges but expected 12 edges