摘要:
bit区间增加区间求和,只不过是二维的......比一维麻烦多了。 这种题还是得自己推啊,强记果断会晕掉。 公式大概是ΣΣdij*(x-i+1)*(y-j+1),其中dij表示在(i,j)点上累计的增量,展开后得到ΣΣdij*(x+1)*(y+1)-dij*i*(y+1)-dij*j*(x+1)+dij*i*j 然后x+1和y+1是在具体询问中才知道的,所以我们维护4个bit:dij , dij*i , dij*j , dij*i*j 。 询问的时候注意上面乘i的下面要乘x+1,上面乘j的下面要乘y+1。 View Code 1 #include<iostream> 2 #inc. 阅读全文
摘要:
额,这个题巨恶心啦~ 树分治不会写,只能翻论文写括号序列了,cqx把每个点分成了三分"(",“)”,数字,那么两个数字之间未匹配的括号数就是两个点之间的距离,然后我们要求的就是两个黑点之间的距离,于是就可以用线段树维护了吧。 最恶心的就是维护了,要维护6个量,左括号总数,右括号总数,前缀和,前缀差,后缀和,后缀差(只是简称),合并的时候用后4个量可以得到区间的最大距离,然后这6个量之间可以互相更新,不行我已经晕了,如果有兴趣的话去看看cqx的论文吧,贴个代码帮助有耐心的人差错...... 对于黑白点的处理,就吧白点的后4个量设为-inf,黑点的后4个量设为0,就可以了。 h 阅读全文
摘要:
整体二分是个很神的东西,它可以把许多复杂的数据结构题化简。它的精髓在于巧妙地利用了离线的特点,把所有的修改、询问操作整体把握。 先说说第k大数吧,这种问题是整体二分的标志性题目,什么划分树啊,主席树啊,树套树啊见了整体二分都得自叹不如。首先对于一次询问来说我们可以二分答案,然后通过验证比答案大的数有多少个来不断地缩小答案范围直至得到一个准确的答案。而对于多个询问我们同样可以这么做,只不过对每一个询问我们都需要判定一下,以决定它被划分到哪一个答案的区间里。这个判定过程就是通过比较比二分的mid大的数的个数和k。同时我们看到,如果比二分的mid大的数的个数小于k了,我们是要去寻找小的答案,那... 阅读全文
摘要:
题意:给你一个N项数列的首项X,之后的每一项要么比前一项多A,要么少B,N项前缀和为M,构造一个可行的数列。分析:首先,后一项只和前一项有关,那么对于一项来说+A和-B都是对后面每一项都造成影响的,比如第i个位置选择+A,那么后面N-i+1个位置相对都+A。于是我们设一共加了x个A,y个b,容易得到:ax+by=M-N*Xx+y=n*(n-1)/2这样我们可以解得x和y,那么怎么求方案呢?我们看到x和y是由1..n-1这些数组合而成的。并且我们发现,1..n*(n-1)/2中所有的数都可以用1..n-1中得数组合成,我们观察组合的过程(以10为例),1=1,2=2,3=3...11=10+1, 阅读全文