总结:
小组情况:3/2/1
A. Telephone Number
思路:好像做了很多次的电话号码问题,跟后面十位数无关,只要前面有8即可。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
const int manx=1e5+5;
int main()
{
ll p=read();
while(p--)
{
ll n=read();
string s;
cin>>s;
ll flag=1;
for(int i=0;i<=n-11;i++)
if(s[i]=='8')
{
put1();
flag=0;
break;
}
if(flag) put2();
}
return 0;
}
B. Lost Numbers
思路1:暴力遍历每个排序,判断是否跟输入的值一样,当12345 前面五位确定的时候,第6位也确定了。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
const int manx=1e5+5;
map<int,ll>vis;
ll a[6]={4,8,15,16,23,42};
ll x[10];
int main()
{
for(int i=1;i<=4;i++)
{
cout<<"? "<<i<<" "<<i+1<<endl;
cin>>x[i];
}
do{
bool flag=1;
for(int i=1;i<=4;i++) if(a[i-1]*a[i]!=x[i]) flag=0;
if(flag){
cout<<"! ";
for(int i=0;i<6;i++) cout<<a[i]<<" ";
cout<<endl;
break;
}
}while(next_permutation(a,a+6));
return 0;
}
思路2:这个是比赛的时候我的做法,由12 13 14 15的乘积求出最大公约数,然后没选到的就是第六个数字,当然这个题我没写出来,结束后dy指出要特判15跟23,因为剩下4个数都是偶数,会导致求出来的最大公约数是30和46,所以要特判一下,代码中注释处。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
const int manx=1e5+5;
map<int,ll>vis;
ll a[6]={4,8,15,16,23,42},b[10];
char s[manx];
int main()
{
ll index=0;
int x1,x2,x3,x4,x;
cout<<"? 1 2"<<endl;
fflush(stdout);
cin>>x1;
cout<<"? 1 3"<<endl;
fflush(stdout);
cin>>x2;
x=__gcd(x1,x2);
cout<<"? 1 4"<<endl;
fflush(stdout);
cin>>x3;
x=__gcd(x,x3);
cout<<"? 1 5"<<endl;
fflush(stdout);
cin>>x4;
x=__gcd(x,x4);
if(x==46||x==30) x/=2; //特判 加这一句 即可AC
x1/=x,x2/=x,x3/=x,x4/=x;
vis[x1]=1,vis[x2]=1,vis[x3]=1,vis[x4]=1,vis[x]=1;
b[++index]=x;
b[++index]=x1;
b[++index]=x2;
b[++index]=x3;
b[++index]=x4;
for(int i=0;i<6;i++)
if(!vis[a[i]])
{
b[++index]=a[i];
vis[a[i]]=1;
}
cout<<"! ";
for(int i=1;i<=6;i++)
cout<<b[i]<<" ";
cout<<endl;
return 0;
}
C. News Distribution
思路:并查集模板题,求同一个集合中的元素个数。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
const int manx=5e5+5;
ll a[manx],b[manx];
int find(int x)
{
if(a[x]==x) return x;
else return a[x]=find(a[x]);
}
int main()
{
ll n=read(),m=read();
for(int i=0;i<=n;i++) a[i]=i;
while(m--)
{
ll x=read(),u,v;
if(x>0) u=read();
for(int i=1;i<x;i++)
{
v=read();
ll uu=find(u),vv=find(v);
if(uu==vv) continue;
a[uu]=vv;
}
}
for(int i=1;i<=n;i++)
b[find(i)]++;
for(int i=1;i<=n;i++)
cout<<b[find(i)]<<" ";
return 0;
}
D. Bicolored RBS
思路:这里我是用栈模拟,左括号进栈,右括号出栈,然后对2取余染色,这样交叉染色可以保证括号层数最小化。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
const int manx=2e5+5;
ll a[manx];
int main()
{
ll p=read(),index=0;
stack<char>q;
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(') q.push(s[i]),a[++index]=q.size()&1;
else if(s[i]==')') a[++index]=q.size()&1,q.pop();
}
for(int i=1;i<=index;i++)
cout<<a[i];
return 0;
}