https://codeforces.com/contest/1167/problem/B
交互题技巧,cin,cout可以自动刷新,而scanf,printf则需要手动用fflush(stdout)来刷新
根据观察我们可以发现,这六个数两两乘积不相等,所以a1a2 a2a3这样的解是唯一的,并且只有六个数,我们用next_permatation全排列函数可以得到结果
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=4e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
ll t,a[maxn],b[maxn],n,m;
string s;
int q[4];
vector<int> v {4,8,15,16,23,42};
int main()
{
cout<<"? 1 2"<<endl;
cin>>q[0];
cout<<"? 2 3"<<endl;
cin>>q[1];
cout<<"? 4 5"<<endl;
cin>>q[2];
cout<<"? 5 6"<<endl;
cin>>q[3];
do{
bool f=true;
if(v[0]*v[1]!=q[0] || v[1]*v[2]!=q[1] || v[3]*v[4]!=q[2] || v[4]*v[5]!=q[3])
f=false;
if(f)
break;
} while(next_permutation(v.begin(), v.end()));
cout<<"!";
for(int i=0;i<6;i++)
{
cout<<" "<<v[i];
}
cout<<endl;
return 0;
}
C
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=5e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
ll t,a[maxn],b[maxn],n,m,k,x,y;
string s;
int pre[maxn],num[maxn];
void init(int n){
rep(i,1,n){
pre[i]=i;
num[i]=1;
}
}
int find(int x){
if(pre[x]==x)
return x;
else{
pre[x]=find(pre[x]);
return pre[x];
}
}
void unite(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
num[fy]+=num[fx];
}
}
int main()
{
cin>>n>>m;
init(n);
while(m--){
cin>>k;
if(k==0)
continue;
cin>>x;
rep(i,1,k-1)
{
cin>>y;
unite(x,y);
x=y;
}
}
rep(i,1,n){
cout<<num[find(i)];
if(i!=n)
cout<<" ";
}
cout<<endl;
return 0;
}
D
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; //1e9
typedef pair<ll,ll> pll;
const int maxn=5e5+5;
const int INF=0x3f3f3f3f;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
ll t,a[maxn],b[maxn],n,m,k,x,y;
string s;
//给你一个合法的括号序列 把它的层数最小变成n/2上取整 ((( 红蓝分也得2层
int main()
{
cin>>n;
cin>>s;
int b=0; //还剩b对未匹配
rep(i,0,n-1){
if(s[i]=='(')
{
b++;
printf("%d",(b&1));
}
else{
printf("%d",(b&1));
b--;
}
}
return 0;
}