Codeforces Round #219 (Div. 1)部分题解

前言

做完打的VP,其实是很崩溃的。。
10min过了A,其中二分下界写错还Fail了一发。。
然后做B,感觉很水,但是一直犯傻逼错误,于是调了差不多两个小时
真不知道在搞什么东西。。

部分题解

A.很显然,二分答案,拍个序,贪心装就可以了
B.感觉 (Qnm) 可以过啊。。那就考虑 (Qnm) 的做法。。
就是暴力枚举左上角,然后对于每个点,预处理他到右边第一个1在哪里,然后对于一个左上角,贡献肯定是递减的和,也就是这样的:
这里写图片描述
r表示最优一个非1位,然后取递减的和就是这个点的贡献了
这个预处理一下就可以搞了

D.考虑枚举一个右端点,那么左端点肯定是单调递增的,于是我们考虑维护我们现在有多少个点被选中了。考虑当我们加入一个点 i ,肯定是连着加的,所以他和i1边上所有的点肯定是要选的。于是我们把 i ~i1上的所有点标为要选。为什么是 i1 呢,因为之前的点无论怎么变,这两个点的路径是一定要有的。然后删除一个点也是一样的, i i+1的点限制-1。当一个点的限制为0的时候,可以被删掉了。于是算法就出来了,加入一个点,就使得 i i1上所有的点+1,删除则-1.然后询问有多少个点是>0的。然后考虑怎么打lazy,考虑到这题的修改都是镜像的,就是有一个修改一定有一个相同的删除,然后不会有某一段出现小于0的。所以我们不需要标记下传,只要还有标记,且不为0,那么这一段肯定是大于0的,否则取儿子的值即可.
部分代码:

void change (int now,int l,int r,int c)
{
int s1=tr[now].s1,s2=tr[now].s2;
int mid=(tr[now].l+tr[now].r)>>1;
if (tr[now].l==l&&tr[now].r==r)
{
tr[now].lazy+=c;
if (tr[now].lazy==0) tr[now].val=tr[s1].val+tr[s2].val;
else tr[now].val=(r-l+1);
return ;
}
if (r<=mid) change(s1,l,r,c);
else if (l>mid) change(s2,l,r,c);
else change(s1,l,mid,c),change(s2,mid+1,r,c);
if (tr[now].lazy==0) tr[now].val=tr[s1].val+tr[s2].val;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值