Educational Codeforces Round 46(Div 2)(A~)

比赛链接
CF的第1000场比赛。。
顺便在学校熬到12点半打CF而不是看他们打联盟真是。。并不爽啊,差点rating掉成狗了。

今后目标:减少迷之错误。

惨啊。。结束前五分钟A掉C。

A.Codehorses T-shirts

因为长度固定,所以看着分就好了...

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=105;

int n,have[4][3],sum[4][3],ref[2333];//x:0~3 S/L

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}

int main()
{
    n=read(); char s[233];
    ref['S']=0, ref['L']=1, ref['M']=2;
    for(int l,i=1; i<=n; ++i)
    {
        scanf("%s",s+1), l=strlen(s+1);
        ++have[l-1][ref[s[l]]];
    }
    for(int l,i=1; i<=n; ++i)
    {
        scanf("%s",s+1), l=strlen(s+1);
        ++sum[l-1][ref[s[l]]];
    }
    int res=0;
    for(int i=0; i<=3; ++i)
    {
        int tmp=0;
        for(int j=0; j<=2; ++j) tmp+=std::abs(have[i][j]-sum[i][j]);
        res+=tmp>>1;
    }
    printf("%d",res);

    return 0;
}

B.Light It Up

对于要开的和要灭的要放的最优位置是确定的,有不同的贡献。枚举一下放在哪就行了。
漏了一个-A[i-1]竟然过了三个样例 WA了三遍。。aaaaaa

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e5+7;

LL n,m,A[N],sum[N],suf[N];

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}

int main()
{
    n=read(),m=read();
    for(int i=1; i<=n; ++i) A[i]=read();
    for(int i=1; i<=n; i+=2) sum[i+1]=sum[i]=sum[i-1]+A[i]-A[i-1];
    if(n&1){
        for(int i=n-1; i>0; i-=2) suf[i-1]=suf[i]=suf[i+1]+A[i+1]-A[i];
    }
    else{
        A[n+1]=m;
        for(int i=n; i>0; i-=2) suf[i-1]=suf[i]=suf[i+1]+A[i+1]-A[i];
    }
//  for(int i=1; i<=n; ++i) printf("%d:pre:%I64d suf:%I64d\n",i,sum[i],suf[i]);
    LL ans=sum[n];
    if(!(n&1)) ans+=m-A[n];
    if(n&1) A[++n]=m;
    for(LL i=1; i<=n; ++i)
        if(A[i]-A[i-1]>1){
            if(i&1) ans=std::max(ans,sum[i-1]+A[i]-A[i-1]-1+m-A[i]-suf[i]);
            else ans=std::max(ans,sum[i-1]+A[i]-A[i-1]-1+m-A[i]-suf[i]);
        }
    printf("%I64d",ans);

    return 0;
}

C.Covered Points Count

离散化,差分。每个区间拆成4个点,即在修改前计算一遍。
Ans原本开的longlong,但是WA了一次发现,我怎么用%d输出longlong了?遂改int Ans[]。。
数据范围有问题啊mmp

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1e6+7;

int n,cnt,val[N];
LL ref[N*4],L[N],R[N],Ans[N];

inline LL read()
{
    LL now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
inline int Find(LL x)
{
    int l=1, r=cnt, mid;
    while(l<r)
        if(ref[mid=l+r>>1]>=x) r=mid;
        else l=mid+1;
    return l;
}

int main()
{
    n=read(); int tot=0;
    for(int i=1; i<=n; ++i) L[i]=ref[++tot]=read(), ref[++tot]=L[i]-1, R[i]=ref[++tot]=read(), ref[++tot]=R[i]+1;

    std::sort(ref+1,ref+1+tot), cnt=1;
    for(int i=2; i<=tot; ++i) if(ref[i]!=ref[i-1]) ref[++cnt]=ref[i];

    for(int i=1; i<=n; ++i) ++val[Find(L[i])], --val[Find(R[i]+1)];
    ref[0]=ref[1]-1;
    for(int now=0,i=1; i<=cnt; ++i)
    {
        now+=val[i];
        Ans[now]+=ref[i]-ref[i-1];
    }
    for(int i=1; i<=n; ++i) printf("%I64d ",Ans[i]);

    return 0;
}

比赛结束后

猜你喜欢

转载自www.cnblogs.com/SovietPower/p/9236711.html