luogu P1083 借教室 (NOIP2012d2t2) 二分,差分

打了蓝桥杯回来,三体攻击不会做,李主席说是三维差分+二分,有道理啊.
有一道原题,就是本题,做一下.

题目背景略
给n(1e6)个数,还有m(1e6)个操作di,si,ei,表示将[si,ei]的数减去di.(di>0)
每次操作后若操作范围内有一个数小于0,则操作终止,输出-1和操作序号i.
若所有操作正常进行完毕,则输出0.所有数在int范围内

数据结构的话,可以考虑线段树区间修改,维护最小值.
但是不会,而且有可能超时.

观察题目发现,是否操作终止是满足二分性质的,即如果当前操作终止了,之后的操作一定会中止.
如果当前操作正常进行了,那么之前的操作一定可以正常进行.
二分的i叫做mid,那么
每个操作可以视为对差分序列进行两个点的加减,直接操作到mid,然后从1到n查询一次即可.
复杂度O(mid*2+n).其中mid不超过m,所以一次的复杂度是O(m+n)
二分一共会有O(logm)次,总复杂度O((m+n)logm).
评测机真好,1e6能过.

关于二分:
我采用了最经典的二分搜索的类似方法,初始l=1,r=m
每次循环mid=(l+m)>>1,查询后l=mid+1或者r=mid-1.

关于差分:
适合多个区间修改,不适合多次查询.
设原序列为a,差分序列为b(最好从1开始)
一维差分b[i]=a[i]-a[i-1]
修改a[i,j],加d时,只要将b[i]+d,然后b[j+1]-d即可.
查询a[i]时,a[i]=∑b(1,i)

对应的前缀和:
适合多个区间查询,不适合多次修改.
设原序列为a,前缀和序列为b
一维前缀和b[i]=b[i-1]+a[i]
查询a[i,j]的和,为b[j]-b[i-1].
修改a[i],加d时,需要将b[i]到b[n]全加d.

蓝桥杯那道题是一个三维差分,其他都一样,唔,等题出来了再补.
先写一下方程
二维差分
由容斥原理
设原序列a[i][j],差分序列b[i][j]
则b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1].
查询时a[i][j]=∑∑b[1,i][1,j].
修改[lx,rx][ly,ry],加d时
需要b[lx][ly]+d,b[lx][ry+1]-d,b[rx+1][ry]-d,b[rx+1][ry+1]+d.

差分序列和前缀和是反运算.

三维差分
设原序列a[i][j][k],差分序列b
则…………….
则啥啊?咋回事啊?我脑容量不够了啊?
简单来说
一共8个数
-1出现了偶数次的,加
-1出现了奇数次的,减
想想一维,二维.
查询时,全部求和
修改时,b[lx][ly][lz]肯定+d, b[rx+1][ry+1][rz+1]肯定-d
这样的话,肯定偶数个+1就是+,奇数个+1就是减啦
还是一共修改8个.
嗯,就这样,等题.
蓝桥杯nb

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页