QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#98846 | #4218. Hidden Graph | _yjh | WA | 2ms | 3444kb | C++14 | 2.7kb | 2023-04-20 14:47:28 | 2023-04-20 14:47:29 |
Judging History
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