12 2018 档案
摘要:P2761 软件补丁问题 思路 貌似不用网络流,直接状态压缩 用spfa跑最短路,直接判断是否能过 位运算太渣了,WA了好几发 代码 cpp include using namespace std; const int N = 21, M = 101, inf = 0x3f3f3f3f; int r
阅读全文
摘要:12.27 cf div3 解题报告 "wxy" . "wxy" ,带上分拉,全场做了个无脑小白 "比赛场地" A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出谁 C: 他的二进制有多少个1 如果 k说明无解 他的二进制位都放优先队列里 每次
阅读全文
摘要:思路 如图,建立分层图跑dinic 每次在残余网络里加边继续跑 跑到ans =k时候的i就是答案 诶呀啊,忘记弄箭头了,最后一列是向上的箭头,不过聪明的你们应该没啥影响 代码
阅读全文
摘要:P3690 【模板】Link Cut Tree (动态树) 思路 "candy" 不是太掌握 也落落不太清楚 自己学习吧 ~~lmc讲的时候睡着了~~ cpp include define ls c[x][0] define rs c[x][1] const int N=300009; using
阅读全文
摘要:P2147 [SDOI2008]洞穴勘测 思路 没办法,我就是喜欢板子都想发的人 都是基础操作,不多说了 代码 cpp include define ls ch[x][0] define rs ch[x][1] define FOR(i,a,b) for(int i=a;i'9'||s='0'&&s
阅读全文
摘要:P3203 [HNOI2010]弹飞绵羊 思路 每个点都往后面连边 所以肯定没有环 超过n的算连向n+1 n+1个点,n条边,没有环,一定联通 那就差不多是个树了 然后就LCT模拟他的操作就行 有比较简单的LCT做法,不过我还是喜欢无脑一点的 错误 cut操作x写错i 代码
阅读全文
摘要:P4172 [WC2006]水管局长 前言 luogu数据太小 去bzoj,他的数据大一些 思路 正着删不好维护 那就倒着加,没了 LCT维护他的最小生成树MST 树上加一条边肯定会有一个环 看看环上最大值和加边的大小 然后选择加不加,改不改 错误 哇,恶心撒 怼着题解都写不出来 最后乱改了一下就A
阅读全文
摘要:P3979 遥远的国度 思路 一开始我用这个函数得到左端点 发现是错误的 无奈数据太水,还90,bzoj也错了一个点 debug了一上午 到现在我也不知道哪里错了,各路好汉看看吧 也许是我没用dfs序的性质吧 x的儿子点一定在x的子树范围内child[x] child[x]+siz[child[x]
阅读全文
摘要:思路 这个题哪里有那么费脑筋 我们可以树链剖分嘛~~LCT昨天学的时候睡着了,不是太会~~ 两遍dfs+一个5行的BIT 其实树链剖分学好了对倍增和LCT理解上都有好处 一条路径上的修改 由于一条剖出来的链是连续的,我们要选择数据结构维护 不过这里不用维护太多东西,只是区间+1 我们可以选择常数小,
阅读全文
摘要:P3178 [HAOI2015]树上操作 思路 板子嘛,其实我感觉树剖没啥脑子 就是debug 代码 cpp include define int long long define ll long long define ls rt'9'||s='0'&&s 1; build(l,mid,ls);
阅读全文
摘要:P3313 [SDOI2014]旅行 思路 有点恶心咯 每个信仰开一颗线段树记录 修改或者查询的时候去那一颗信仰线段树中查询就好 必须动态开点线段树 没有区间修改还算好写 错误 查询跳链写错了
阅读全文
摘要:[HEOI2016/TJOI2016]树 思路 做的时候也是糊里糊涂的 就是求最大值的线段树 错误 线段树写错了
阅读全文
摘要:GSS7解题报告 前言 唔,有点恶心哪,废了两个多小时debug 思路 很容易看出~~傻子都知道~~,这个是树链剖分+线段树的裸题,只不过是恶心了点,这里重点讲一下细节问题 线段树 做过GSS系列的都应该很熟悉了 线段树维护的前缀最大子段和,后缀最大子段和,和区间最大子段和 那么我们就可以很容易的写
阅读全文
摘要:树剖做法: 就是两个dfs+一个线段树 难度的取决基本==线段树的维护难度 所以对有点线段树基础的,树剖也不难做吧 这里操作有二 一:两点间路径染色 线段树的区间赋值操作 二:查询路径段的个数 考虑线段树如何做 我们发现两端区间的合并取决于他们相连接的那两个颜色 比如这张图 他两边区间合并的时候,完
阅读全文
摘要:cf解题报告 记录一下吧 做出:T1 rating : 97 想起几个月前做不出T1还是有点小搞笑呀2333 T1 双指针+特判 T2 发现k特别小,枚举剩余系 还要判断是否是能被n整除 移项发现可以算出整除是多少 然后$整除 k+剩余数=n$算出答案,复杂度$O(k)$ T3 大力贪心 先算出A、
阅读全文
摘要:"https://oj.zrt.io/problem/44" 比较容易懂得 "文档" "新浪"
阅读全文
摘要:思路 求出height之后 只要相邻两个子串是本串不同的来更新就好 因为这样一定是最优啊、、取min显然越长越不好 代码 cpp include include include define FOR(i,a,b) for(int i=a;i=b; i) using namespace std; co
阅读全文
摘要:前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个 "bzoj1031" 的复制子串和那个 "poj1743" 的差分 来看个例子 变成了这个(最后一个INF最好删掉吧,应该不影响的吧) 很明显,答案是min[5,10]+1=1+1=2 belong是后缀
阅读全文
摘要:思路 不得不说,罗穗骞太厉害了 他写的论文比哪一篇博客都好 去看吧,也别看我的了 里面有这题目详解 "论文" 代码 cpp // 不得不说,罗穗骞nb哇,%%%%%%%%% / 0 0 1 1 2 2 3 3 4 10 1 2 3 4 5 1 2 3 4 5 差分 1 1 1 1 0 1 1 1 1
阅读全文
摘要:前言 其实就是个后缀数组模板题 可还是有几个的地方不太明白 思路 先将子串复制一遍,组成长度为2 n的子串 给出的子串一定会在前n个后缀 而且后面的优先级不会影响前面的相对大小 然后求得sa输出就好 输出的时候把没有必要输出的忽略掉就好 代码 cpp include define FOR(i,a,b
阅读全文
摘要:[TOC] 前置 纯属博主虎的的 "罗穗骞2009NOI集训队论文" 还是原版的最明白啊 先了解基数排序和倍增求sa思想 并且有一定的看别人博客的基础(对,没错,就是这么不要脸) 基数排序= "博客" 这里主要说一下代码的理解及重要点 重点及其目标 根据后缀子串,他们一定是两两不同的 rk和sa也是
阅读全文
摘要:基数排序 无人问津的优秀算法 在这个被stl的sort独霸的c++世界(毕竟stl的sort太过好用) 似乎所有普通排序算法都被挤到了一边,但毕竟各有各的优点 这个排序算法还是不错的 但最近学习后缀数组的时候遇到了这个算法,就简单学习一下吧 介绍 多关键字排序中有两种方法:最高位优先法(MSD)和最
阅读全文
摘要:前言 考试的时候居然想错了区间贡献,mdzz 思路 题目看着很方啊,难道要树套树? 但数据范围提醒我们,是nlogn的复杂度 Sort(S)的定义是不是很鬼畜 但我们~~不动脑子的~~打表容易发现 连续区间[1,n]内$a_i^2 a_{i 1}^2$为连续的奇数 (其实这里直接用初中的完全平方公式
阅读全文
摘要:题目 树上求子树内出现次数 =1且在区间【l,r】内的数 题解 这道题的最初版本是询问子树不同颜色个数, 是一道很经典的 “树比序列容易” 的题. 在树上可以这样做: 对于每一种颜色, 将这种颜色的点提取出来按 DFS 序排序; 令每个点的贡 献为 1, 相邻点的 LCA 的贡献为 −1, 于是问题
阅读全文
摘要:思路 序列中 |i | 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| | | | | | | | | | | | | |a[i]| a| b| c| L| d| e| f| R| g| h| 现逆序对为ans,要交换L,R 则$[1,3],[9,10]$这两段区间的都不会被他俩影响
阅读全文
摘要:思路 模拟就好 左偏树合并 并查集寻找 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&sval[y]) swap(x,y); ch[x][0]=merge(ch[x][0],y); if(dis[ch[x][0]]
阅读全文
摘要:思路 合并时候统计逆序对贡献 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&s 1; if(k
阅读全文
摘要:思路 又是强制在线 主席树 每一次操作建一棵树 但实际用的的rt只有n个 所以实际内存是n 2 30 我见到只开n 30的,不会, 错误 debug 以为每一秒建立一颗树 第一次 query没有递归 第二、三次 权值线段树的查询处理,就是到叶子节点的处理 代码 cpp // luogu judger
阅读全文
摘要:思路 强制在线 主席树 以1为root建主席树 (就是在树上建树,差不多) rt[i]就是1到i的路径上的一棵树的root 其实我感觉,主席树之间的运算差不多于加减 类似lca的运算 root(1到x)+root(1到y) root(lca) root(fa[lca]) 查询他们的第k小就OK 错误
阅读全文
摘要:思路 区间内x出现次数大于一半 区间内排序,则x一定会在(一半+1)的位置上出现 找到那个数,再检查一下就好 错误 快读写错了、、,又浪费了1h 代码 cpp include define FOR(i,a,b) for(int i=a;i='9'||s='0'&&s 1; if(k 1; if(to
阅读全文
摘要:前置知识: 普通主席树,树状数组 大概 待修主席树 和静态的一样 只不过还要加一颗树 来维护你修改的值 这棵树就是是树状数组,每个节点上再维护一颗动态开点线段树 (就是所说的树套树,不过没啥可怕的,就是麻烦一丢丢) 查询的时候老样子 不过要多加上树状数组中的值罢了 代码还算好些,如果 主席树,树状数
阅读全文
摘要:思路 若opt=1 则为操作1,之后有三个数l,r,k 表示查询k在区间[l,r]的排名 若opt=2 则为操作2,之后有三个数l,r,k 表示查询区间[l,r]内排名为k的数 若opt=3 则为操作3,之后有两个数pos,k 表示将pos位置的数修改为k 若opt=4 则为操作4,之后有三个数l,
阅读全文
摘要:[TOC] 思路 每个节点维护一课线段树(当然是动态开点) 线段树的作用是统计这个节点有多少种粮食型号,以及最多的粮食型号 然后树上差分,u和v点 +1,lca(u,v)和f[lca(u,v)] 1(不显然就画图喽) 并不用转化为dfs序 只需要dfs一边,自底向上合并就好 优化 删除节点不必建树
阅读全文
摘要:题目链接 "luogu" 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并、、、 看代码吧 错误 和写主席树错的差不多 都是变量写错、、、、 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&s t[maxn];
阅读全文
摘要:顾名思义 就是两颗线段树合成一个线段树 那合成的线段树是适合所有线段树吗 当然不是,是动态开点线段树 建树 这里建n个节点的时候,每个节点建一棵树 而且要按照一定的形态建立一条链 就是说如果最终形态是有n个数字的树, 那你初始化的那一条链子一定是这颗树上扣下来的 这样才方便合并 merge操作 最重
阅读全文
摘要:思路 这里的初始化就不讲了,看完操作讲解就应该明白了,再不行就去看代码 对于操作1 由于操作2的需要,vector[n]存下数 对于操作2的维护 查询相邻两个元素的之间差值(绝对值)的最小值 先把所有答案存入一个小头堆里 比如 a,c之间你要插入b 那么,你就要删除|c a|,然后加入|a b|,|
阅读全文
摘要:思路 并查集+fhqtreap 合并的时候由于是大小不一,所以不能直接合并 所以我们就暴力合并喽 对,就是那种很暴力的把小的往大的身上靠 他们说是启发式合并 抄一波博客 然后不就A了 错误 合并写的没毛病呀,最后看着题解改了改就过了? 明明差不多 代码 cpp // luogu judger ena
阅读全文
摘要:思路 终于做了一个简单题,233 先对区间拍个序 因为他说所有区间互不包含 所以排序之后可以双指针l,r指呀指 容易得到 这样每个值最多插入删除一边 一次操作logn 总复杂度nlogn 代码 cpp include define FOR(i,a,b) for(int i=a;i'9'||s='0'
阅读全文
摘要:思路 一开始写fhq treap 感觉越写越感觉splay好些,就去splay 然后维护序列 注意前驱后继的不存在的情况 但不用插入虚拟节点(那插入岂不太麻烦) 跑的真慢的一批,splay太多了 错误 好多错误 只好对拍 代码 cpp //这个题用treap似乎小题大做了,所以我用splay inc
阅读全文
摘要:思路 超级恶心的pushdown 昏天黑地的调 让我想起了我那前几个月的线段树2 错误 这恶心的一道题终于过了 太多错误,简直说不过来 pushup pushdown 主要就是这俩不太清晰,乱pushdown 其他的写的还没啥毛病(能看出来) 代码 cpp include include inclu
阅读全文
摘要:[TOC] 前言 其实我感觉俩就够了,lmc还得让学替罪羊 旋转维持 分裂维护 拍扁维护 齐全了 "请点击ikka大爷的讲解" 我不会指针,所以数组模拟、、 回收可真麻烦,看来以后还得学指针那 感觉写完就会弃掉 updat:不是感觉,是一定,怎么我感觉比splay还麻烦 要点||摘录 好像就是一颗普
阅读全文
摘要:[TOC] 题目 "luogu" 思路 每次都是插入比之前所有数字大的数,所以之前的答案就不会改变 用fhq treap求出原序列,然后用树状数组依次算出每个值得lis(显然g[i]=g[i j]+1) 然后答案就是前i个得最大值(答案一定是不降的) 这里具体讲一下fhq treap 如果你还是维护
阅读全文
摘要:思路 splay确实有点绕 还是fhq treap牛逼啊,构造完美二叉树(他们说笛卡尔树),就不用rand的,直接计算就好 时间也不慢 代码 cpp] include define FOR(i,a,b) for(int i=a;i'9'||s='0'&&sr) return 0; int mid=(
阅读全文
摘要:[TOC] 可持久化fhq treap 支持查询历史版本的非旋treap luogu扣图: 先看看为啥他可以可持久化 由于fhq Treap是没有旋转操作的 所以每次操作后的其它没有操作的节点间的关系不变 而有旋转平衡树是要改变的,所以就不大能进行可持久化了 过程 回想,主席树的方法: 每次用log
阅读全文
摘要:[TOC] 题目 "luogu" csdn好像限制了展开博客次数,真的好xx 思路 显然一段区间内的值一定是他的中位数 少一点比多一点好 然后就可以枚举区间了 区间答案为 val[mid] 小于val[mid]的+大于val[mid] val[mid]的所有值 就是size[x] val[mid]
阅读全文