總結:
小組情況: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;
}