Codeforces Round #418 (Div. 2) ABCD

来源:互联网 发布:淘宝的trw轮毂好用么 编辑:程序博客网 时间:2024/06/05 00:23

一个小时做了三道题…第四道结束的时候wxl给我讲了一下贪心做法…当时看到题目吓虚了压根不敢写…结果也不是特别麻烦


【A】

An abandoned sentiment from past

构造一个序列,如果序列只能严格上升输出No,否则输出Yes
好像很可做的样子…大家自己YY吧,我这题被hack了艹


【B】

An express train to reveries

给两个数列,每个数列只能改动一个数字,使最终两个数列完全相同,输出改动后的数列。
分类讨论…好像很可做的样子…大家自己YY吧,我这题又被hack了艹


【C】

An impassioned circulation of affection

额这题没被hack,这是我唯一真正A掉的题233…
枚举每个数字,dp[k][cnt]表示字母k可以染色cnt次所能get到的最长连续字母串。O(26n^2)暴力扫一遍就可以处理出来…

终于可以上个代码了

//C#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=1505;char s[mxn],ch;int n,q,c;int a[mxn],dp[28][mxn];int main(){    int i,j,x,k;    scanf("%d",&n);    scanf("%s",s+1);    scanf("%d",&q);    fo(i,1,n) a[i]=s[i]-'a'+1;    fo(k,1,26)      fo(i,1,n)      {          int cnt=0;          for(j=i;j>=1;j--)          {              if(a[j]!=k) cnt++;              dp[k][cnt]=max(dp[k][cnt],i-j+1);          }      }    fo(k,1,26)      fo(i,1,n)        if(!dp[k][i]) dp[k][i]=dp[k][i-1];    while(q--)    {        scanf("%d",&x);        cin>>ch;        c=ch-'a'+1;        printf("%d\n",dp[c][x]);    }    return 0;}

【D】

An overnight dance in discotheque

给出一堆不相交的圆…分成两个集合,最大化两个集合圆面积异或并的和

如果一个圆覆盖一个小圆,那么大圆向小圆连边,拓扑排序一发后可以发现这些圆套圆可以变成很多个森林,把每个森林拿出来单独考虑。

考虑贪心,深度为1,深度为2的圆要放在两个集合中,下面深度奇数的圆减去,深度偶数的圆加上即可。

//CF D. An overnight dance in discotheque#include<queue>#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define pi acos(-1)#define eps 1e-10#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;queue <int> q;const int mxn=1005;double ans;int n,cnt,du[mxn],step[mxn],head[mxn];struct edge {int to,next;} f[mxn*mxn]; inline void add(int u,int v){    f[++cnt].to=v,f[cnt].next=head[u],head[u]=cnt;}struct circle{    double x,y,r;}c[mxn];inline double dis(circle a,circle b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}inline double calc(circle a){    return pi*a.r*a.r;}inline void topsort(){    int i,j;    fo(i,1,n) if(!du[i]) q.push(i);    while(!q.empty())    {        int u=q.front();q.pop();        for(i=head[u];i;i=f[i].next)        {            int v=f[i].to;            du[v]--;            if(!du[v]) step[v]=step[u]+1,q.push(v);        }    }    fo(i,1,n)      if(!step[i] || step[i]&1) ans+=calc(c[i]);      else ans-=calc(c[i]);}int main(){    int i,j;    scanf("%d",&n);    fo(i,1,n)      scanf("%lf%lf%lf",&c[i].x,&c[i].y,&c[i].r);    fo(i,1,n)      fo(j,1,i-1)        if(dis(c[i],c[j])<c[i].r+c[j].r-eps)        {            if(c[i].r>c[j].r) add(i,j),du[j]++;            else add(j,i),du[i]++;        }    topsort();    printf("%.8lf\n",ans);    return 0;}
原创粉丝点击