前言
做完打的VP,其实是很崩溃的。。
10min过了A,其中二分下界写错还Fail了一发。。
然后做B,感觉很水,但是一直犯傻逼错误,于是调了差不多两个小时
真不知道在搞什么东西。。
部分题解
A.很显然,二分答案,拍个序,贪心装就可以了
B.感觉
(Qnm)
可以过啊。。那就考虑
(Qnm)
的做法。。
就是暴力枚举左上角,然后对于每个点,预处理他到右边第一个1在哪里,然后对于一个左上角,贡献肯定是递减的和,也就是这样的:
r表示最优一个非1位,然后取递减的和就是这个点的贡献了
这个预处理一下就可以搞了
D.考虑枚举一个右端点,那么左端点肯定是单调递增的,于是我们考虑维护我们现在有多少个点被选中了。考虑当我们加入一个点
i
,肯定是连着加的,所以他和
部分代码:
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;
}