比赛链接
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;
}
比赛结束后