差分
ModestCoder_
一个modest的coder
展开
-
【题解】LuoGu6869:[COCI2019-2020#5] Putovanje
原题传送门树上差分就是走n−1n-1n−1条路每次从iii走到i+1i+1i+1,所以用树上差分进行路径覆盖对于每条边可以直接买多程票,也可以买几次单程票Code:#include <bits/stdc++.h>#define maxn 200010#define LL long longusing namespace std;LL delta[maxn], odd[maxn], even[maxn], ans;struct Edge{ int to, next;}ed原创 2020-12-03 21:24:13 · 342 阅读 · 0 评论 -
【学习笔记】差分
差分思想,一言以概之,就是delta[i]=a[i]−a[i−1]delta[i]=a[i]-a[i-1]delta[i]=a[i]−a[i−1]a[i]=∑j=1idelta[j]a[i]=\sum_{j=1}^{i}delta[j]a[i]=∑j=1idelta[j]然后可以做很多题目原创 2020-12-03 20:55:37 · 217 阅读 · 1 评论 -
【题解】LuoGu1083:借教室
原题传送门不能满足的方案满足二分性二分枚举什么时候无法满足然后O(n)O(n)O(n)用差分算出每天需要的教师数量进行判断Code:#include <bits/stdc++.h>#define maxn 1000010#define LL long longusing namespace std;int n, m;LL a[maxn], b[maxn], d[maxn], s[maxn], t[maxn];inline int read(){ int s = 0, w原创 2020-12-03 20:17:06 · 170 阅读 · 0 评论 -
【题解】LuoGu4623:BUREK
原题传送门直线能穿过三角形,因为直线是平行于坐标轴的,所以很简单以x=px=px=p为例若直线能穿过某一个三角形,那么这条直线必定能穿过三角形的某一条边换句话说,令三角形三个点中横坐标最小是xminxminxmin,最大是xmaxxmaxxmax如果xmin<p<xmaxxmin<p<xmaxxmin<p<xmax,直线就能穿过这个三角形所以可以直接差分,dxmin+1++,dxmax−−d_{xmin+1}++,d_{xmax}--dxmin+1++,dx原创 2020-10-25 17:56:02 · 227 阅读 · 0 评论 -
【题解】牛客206091:小王子
原题传送门一个正确的暴力思路是遍历树,然后对于每个点,把它和它父亲之间的边断掉。那就看看,边集E2E2E2中有多少条把两个连通块联通的,记条数为cntcntcntcnt=0cnt=0cnt=0,说明E2E2E2中每一条边都可以选择,答案累加mmmcnt=1cnt=1cnt=1,那就只能断掉那一条边,答案累加1cnt>1cnt>1cnt>1,没有边可以断如何统计这个cntcntcnt?可以暴力并查集,但是我们可以树上差分对于一条E2E2E2中的边(u,v)(u,v)(u,v原创 2020-09-16 11:03:29 · 241 阅读 · 0 评论 -
【题解】LuoGu3943:星空
原题传送门因为这个k<=8k<=8k<=8所以想到状压主要思想是差分令灯暗为1,灯亮为0比如一行灯的情况是a:01001100a:01001100a:01001100那么对应差分数组就是b:011010100b:011010100b:011010100可以发现ai=b1xorb2xor...xorbia_i=b_1xorb_2xor...xorb_iai=b1xorb2xor...xorbi然后我对于区间[l,r][l,r][l,r]进行反转操作,在差分数组里的表原创 2020-09-09 16:24:51 · 189 阅读 · 0 评论 -
【题解】LuoGu1438:无聊的数列
原题传送门区间加等差数列,单点求和,可以用树状数组维护开两个树状数组,第一个维护和,第二个维护deltadeltadelta魔改暴力加等差数列的方式,用树状数组只加lognlognlogn个地方,但我需要保存deltadeltadelta,求和的时候,累计和与k∗deltak*deltak∗delta,这个kkk就是实际意义上的要求的第xxx个数和当前的差懂了具体操作之后,就知道如何更新了update(l,k,d),update(r+1,−k−(r−l+1)∗d,−d)update(l,k,d),原创 2020-09-08 21:22:29 · 193 阅读 · 0 评论 -
【题解】LuoGu6623:[省选联考 2020 A 卷] 树
原题传送门考虑一个点上的数对整体产生的贡献因为是亦或,考虑某个数每个位对整体产生的贡献加入一个点上的数为3,把这个3,以及它对祖先的贡献形式写出来位数从右往左为0123……3 00114 01005 01016 01107 01118 10009 100110 101011 101112 110013 110114 111015 1111单独取出第1位二进制数,发现是有规律的:1001100110011……第1位,01的循环节长度为222^222,每个循环节中,0/1重原创 2020-09-08 21:03:21 · 258 阅读 · 0 评论 -
【题解】LuoGu3168: [CQOI2015]任务查询系统
原题传送门嗯,区间修改+单点求值仅仅是这样的话,用线段树/树状数组维护差分数组的前缀和即可不过,本题加强了难度,要求操作中前k小的值对点进行修改想到对于每个点都维护一颗权值线段树,不过空间不允许如此奢侈我们把差分思想和权值线段树结合起来,并且凭着优化空间的目的,想到用主席树维护差分数组的前缀和,询问用权值线段树搞一搞Code://感觉没什么好注释的,代码很好理解~~#include...原创 2019-04-20 18:14:37 · 613 阅读 · 0 评论 -
【题解】LuoGu3948:数据结构
原题传送门 由于本题题面要复制的话比较麻烦,我就不copy了~~~ 【题解】 首先两个操作:区间修改,区间查询 看到n<=80000 opt<=1000000就有点方了,此题题如其名,需要用到线段树? 当然不用!我发现了“你的询问操作不会超过1000次” 说明什么?询问可以暴力跑一遍,时间复杂度O(1000n)在承受范围内 那么修改呢?差分。我们只需用delta[i]表示...原创 2018-08-17 20:27:05 · 376 阅读 · 0 评论