A. Beautiful String
题目链接:
https://codeforces.com/contest/1265/problem/A
Hint:
水题,除非原本的串中除了"??"以外还存在其它的相邻且相同的字符,否则一定有解,瞎搞
#include<bits/stdc++.h>
using namespace std;
#define ll long long
char s[1000005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
bool flag=false;
int len=strlen(s);
for(int i=0; i<len; i++)
{
if(s[i]!='?')
{
if(i==len-1) break;
if(s[i]==s[i+1])
{
flag=true;
break;
}
}
else
{
if(i==0)
{
char c1=s[i+1];
if(c1=='?')
s[i]='a';
else if(c1=='a')
s[i]='b';
else if(c1=='b')
s[i]='a';
else
s[i]='a';
}
else if(i==len-1)
{
char c1=s[i-1];
if(c1=='a')
s[i]='b';
else if(c1=='b')
s[i]='a';
else
s[i]='a';
}
else
{
char c1=s[i-1];
char c2=s[i+1];
if(c1=='a')
{
if(c2=='a')
s[i]='b';
else if(c2=='b')
s[i]='c';
else if(c2=='c')
s[i]='b';
else
s[i]='b';
}
else if(c1=='b')
{
if(c2=='a')
s[i]='c';
else if(c2=='b')
s[i]='a';
else if(c2=='c')
s[i]='a';
else
s[i]='a';
}
else//c
{
if(c2=='a')
s[i]='b';
else if(c2=='b')
s[i]='a';
else if(c2=='c')
s[i]='a';
else
s[i]='b';
}
}
}
}
if(flag) printf("-1\n");
else printf("%s\n",s);
}
return 0;
}
B. Beautiful Numbers
题目链接:
https://codeforces.com/contest/1265/problem/B
Hint:
思维
标一下各个数字所在的位置,O(n)扫一遍,每次更新最大值最小值,若位置i满足条件,很显然有(maxn-minn+1)==i
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int p[200005];
int loc[200005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
loc[p[i]]=i;
}
int minn=n+1,maxn=0;
for(int i=1;i<=n;i++)
{
minn=min(minn,loc[i]);
maxn=max(maxn,loc[i]);
if(maxn-minn+1==i)
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
}
return 0;
}
C. Beautiful Regional Contest
题目链接:
https://codeforces.com/contest/1265/problem/C
Hint:
贪心、让金牌取第一大的数判是否可行
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int hm[400005];
int p[400005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(hm,0,sizeof(hm));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
int loc=n/2;
while(p[loc]==p[loc+1])
loc--;
int cnt=1,hm1=0,hm2=0;
p[0]=p[1];
for(int i=1;i<=loc;i++)
{
if(p[i]!=p[i-1])
cnt++;
hm[cnt]++;
}
if(cnt<3)
{
printf("0 0 0\n");
}
else
{
int sumb=0;
for(int i=2;i<=cnt;i++)
{
sumb+=hm[i];
if(sumb>hm[1])
{
break;
}
}
int sumc=loc-hm[1]-sumb;
//cout<<hm[1]<<' '<<hm[1]<<' '<<sumb<<' '<<sumc<<endl;
if(sumc<=hm[1])
{
printf("0 0 0\n");
}
else
{
printf("%d %d %d\n",hm[1],sumb,sumc);
}
}
}
return 0;
}
D. Beautiful Sequence
题目链接:
https://codeforces.com/contest/1265/problem/D
Hint:
推导、分类
画个图更好理解
分析一下0和1之间的数量关系、2和3之间的数量关系
再分个类即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int ans[400005];
int main()
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a==0&&b==0&&d==c+1)
{
printf("YES\n");
for(int i=1;i<=c;i++)
{
if(i!=1)
printf(" ");
printf("3 2");
}
printf(" 3\n");
}
else if(c==0&&d==0&&a==b+1)
{
printf("YES\n");
for(int i=1;i<=b;i++)
{
if(i!=1)
printf(" ");
printf("0 1");
}
printf(" 0\n");
}
else if(a<=b&&d<=c)
{
if(b-a==c-d)
{
printf("YES\n");
for(int i=1;i<=a;i++)
{
if(i!=1)
printf(" ");
printf("0 1");
}
if(a!=0) printf(" ");
for(int i=1;i<=b-a;i++)
{
if(i!=1)
printf(" ");
printf("2 1");
}
if(b-a!=0) printf(" ");
for(int i=1;i<=d;i++)
{
if(i!=1)
printf(" ");
printf("2 3");
}
printf("\n");
}
else if(b-(a+1)==c-d)
{
printf("YES\n");
for(int i=1;i<=a;i++)
{
if(i!=1)
printf(" ");
printf("1 0");
}
if(a!=0) printf(" ");
printf("1 ");
for(int i=1;i<=c-d;i++)
{
if(i!=1)
printf(" ");
printf("2 1");
}
if(a!=0||b-a!=0) printf(" ");
for(int i=1;i<=d;i++)
{
if(i!=1)
printf(" ");
printf("2 3");
}
printf("\n");
}
else if(b-a==c-(d+1))
{
printf("YES\n");
for(int i=1;i<=a;i++)
{
if(i!=1)
printf(" ");
printf("0 1");
}
if(a!=0) printf(" ");
for(int i=1;i<=b-a;i++)
{
if(i!=1)
printf(" ");
printf("2 1");
}
if(b-a!=0) printf(" ");
for(int i=1;i<=d;i++)
{
if(i!=1)
printf(" ");
printf("2 3");
}
printf(" 2\n");
}
else
{
printf("NO\n");
}
}
else
printf("NO\n");
return 0;
}
E. Beautiful Mirrors
题目链接:
https://codeforces.com/contest/1265/problem/E
Hint:
数学、概率
我是用概率dp做的(和以前做过的HDU 6656很像),好像还有别的更快的方法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
int p[200005];
ll dp[200005];
ll sum[200005];
ll quick_pow(ll x,ll a)
{
ll ans=1;
while(a)
{
if(a&1)
{
ans*=x;
ans%=mod;
}
x*=x;
x%=mod;
a>>=1;
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++)
{
ll x=100,y=quick_pow(p[i],mod-2);
x*=y;
x%=mod;
dp[i]=1+(x-1)*(sum[i-1]+1);
dp[i]%=mod;
sum[i]=sum[i-1]+dp[i];
sum[i]%=mod;
}
printf("%I64d\n",sum[n]);
return 0;
}