C1 神秘问题求解
  • 板块学术版
  • 楼主Misserina
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/8/1 01:39
  • 上次更新2025/8/1 14:25:25
查看原帖
C1 神秘问题求解
1105993
Misserina楼主2025/8/1 01:39

本地样例一遍过,交到 CF 上面过不了样例

#include <bits/stdc++.h>
using namespace std;
int arr[10]={0,1,2,2,2,2,1,1,0,0},lk,rk,t,n,p,rp,m[1005];
vector<int> v;
int main() {
	scanf("%d",&t);
	while (t--) {
		scanf("%d",&n);
		for (int i=1;i<=n;i++) m[i]=0;
		int l=1,r=n;
		while (r-l>2) {
			int mid=(l+r)>>1;
			cout << "? " << mid-l+2 << " ";
			for (int i=l;i<=mid;i++) cout << i << " ";
			cout << 1 << endl;
			cin >> p;
			if (p!=0) r=mid;
			else {
				cout << "? " << r-mid+1 << " ";
				for (int i=mid+1;i<=r;i++) cout << i << " ";
				cout << mid+1 << endl;
				cin >> p;
				if (p!=0) l=mid+1;
				else {
					cout << "? 2 " << mid << " " << mid+1 << endl;
					cin >> p;
					int L,R;
					if (p==1) L=1,R=2;
					else L=2,R=1;
					for (int i=l;i<=mid;i++) m[i]=L;
					for (int i=mid+1;i<=r;i++) m[i]=R;
					rp=mid+p;
					break;
				}
			}
		}
		if (r-l==2) {
			cout << "? 10 ";
			for (int i=0;i<10;i++) cout << l+arr[i] << " ";
			cout << endl;
			cin >> p;
			int i=l;
			if (p==8) {
				m[i]=1;
				m[i+1]=1;
				m[i+2]=2;
				lk=i;
				rk=i+2;
			}
			if (p==7) {
				m[i]=1;
				m[i+1]=2;
				m[i+2]=2;
				lk=i;
				rk=i+2;
			}
			if (p==11) {
				m[i]=1;
				m[i+1]=2;
				m[i+2]=1;
				lk=i;
				rk=i+1;
			}
			if (p==10) {
				m[i]=2;
				m[i+1]=1;
				m[i+2]=2;
				lk=i+1;
				rk=i+2;
			}
			if (p==16) {
				m[i]=2;
				m[i+1]=2;
				m[i+2]=1;
				lk=i+2;
				rk=i;
			}
			if (p==14) {
				m[i]=2;
				m[i+1]=1;
				m[i+2]=1;
				lk=i+1;
				rk=i;
			}
		}
		else {
			cout << "? 2 " << l << " " << r << endl;
			cin >> p;
			if (p==0) {
				m[l]=2;
				m[r]=1;
				lk=r;
				rk=l;
			}
			else {
				m[l]=1;
				m[r]=2;
				lk=l;
				rk=r;
			}
		}
		for (int i=1;i<=n;i++) {
			if (m[i]==0) v.push_back(i);
		}
		for (int i=0;i<v.size();i+=3) {
			cout << "? 10 ";
			for (int j=0;j<10;j++) cout << v[(i+arr[j])%v.size()] << " ";
			cout << endl;
			cin >> p;
			if (p==8) {
				m[v[i]]=1;
				m[v[(i+1)%v.size()]]=1;
				m[v[(i+2)%v.size()]]=2;
				lk=v[i];
				rk=v[(i+2)%v.size()];
			}
			if (p==7) {
				m[v[i]]=1;
				m[v[(i+1)%v.size()]]=2;
				m[v[(i+2)%v.size()]]=2;
				lk=v[i];
				rk=v[(i+2)%v.size()];
			}
			if (p==11) {
				m[v[i]]=1;
				m[v[(i+1)%v.size()]]=2;
				m[v[(i+2)%v.size()]]=1;
				lk=v[i];
				rk=(i+1)%v.size();
			}
			if (p==10) {
				m[v[i]]=2;
				m[v[(i+1)%v.size()]]=1;
				m[v[(i+2)%v.size()]]=2;
				lk=v[(i+1)%v.size()];
				rk=v[(i+2)%v.size()];
			}
			if (p==16) {
				m[v[i]]=2;
				m[v[(i+1)%v.size()]]=2;
				m[v[(i+2)%v.size()]]=1;
				lk=v[(i+2)%v.size()];
				rk=v[i];
			}
			if (p==14) {
				m[v[i]]=2;
				m[v[(i+1)%v.size()]]=1;
				m[v[(i+2)%v.size()]]=1;
				lk=v[(i+1)%v.size()];
				rk=v[i];
			}
			if (p==0) {
				cout << "? 2 " << lk << " " << v[i] << endl;
				if (p==1) {
					m[v[i]]=2;
					m[v[(i+1)%v.size()]]=2;
					m[v[(i+2)%v.size()]]=2;
				}
				if (p==0) {
					m[v[i]]=1;
					m[v[(i+1)%v.size()]]=1;
					m[v[(i+2)%v.size()]]=1;
				}
			}
		}
		cout << "! ";
		for (int i=1;i<=n;i++) {
			if (m[i]==1) cout << "(";
			else cout << ")";
		}
		cout << endl;
	}
}
2025/8/1 01:39
加载中...