随笔分类 - ACM
大二到大三不堪回首的记忆....
摘要:原题链接 考察:线段树 思路: 参考线段树模板.对于线段树结点我们需要定义使得能求出连续区间的子段和. [l,r]这是模板 maxn 表示[l,r]区间内最大的连续子段和. 但是这样我们能从子节点的子段和推到父节点吗?答案是不能的.考虑父节点的子段和要如何求.父节点的maxn有三个来源: (1) 左
阅读全文
摘要:原题链接 考察:树状数组 思路: 类似于树状数组的扩展,利用差分数组将区间修改转为单点修改,单点查询改为区间查询.最后输出单点值%2即可. #include <iostream> #include <cstring> using namespace std; const int N = 100010
阅读全文
摘要:原题链接 考察:树状数组 思路: 操作1:读入 l,r 表示在 l 到 r 之间种上一种树,每次操作种的树的种类都不同. 有点像差分,在[l,r]区间内加入同一种树.但是不能全部加1,最后答案是计数种类数.比较直观的想法就是在x = l处+1,x = r处-1.但是当询问[1,r+1]等区间时应该输
阅读全文
摘要:原题链接 考察:树状数组 思路: 操作1: 将序列的第k个数改为a 很明显的树状数组单点修改 操作2:在这个序列上,每次选出c个正数,看是否能-s次 这个操作与区间大小无关,也就是所有操作都是在整个序列上进行的.我们需要求出正数的个数,并且求出是否每次能选出c个-1. 每个操作都是a>=0,所以直接
阅读全文
摘要:原题链接 考察:树状数组 思路: 本蒟蒻是完全想不到怎么写....参考大佬题解. 求种类数,可以处理的方法一个是针对询问实时加入数.但是这样一定会TLE,然后不好求重复的数字数. 参考大佬的题解,正解做法是i从1~n实时加入数,到询问的右端点求ans.这里与求逆序对的方法不同的是tr[i]表示下标为
阅读全文
摘要:原题链接 考察:树状数组+离散化 思路: 很明显先离散化能力值.然后建边开始dfs树. 比较难想的是如何求每个点比它能力高的子结点数量~~(对本蒟蒻而言)~~ 首先确定搜索顺序.先遍历子结点,然后再单点加入自己的权值.深度深的子节点可能会被深度浅的父节点用到更新,因此不能删除树状数组在子节点的存储的
阅读全文
摘要:原题链接 考察:树状数组+hash 本题的总结: 如果b可以交换任意元素到a,那么最少交换次数 = 环长度-1 如果b需要交换相邻的到a,那么最少交换次数 = 逆序对数目. 思路: 这道题如果贪心把每个数列的数字尽可能换成一样的是错误的.例二就是HACK数据.既然这样我们就考虑怎么转化答案式子来求最
阅读全文
摘要:原题链接 考察:树状数组+二分 完全没想到,fw本f 思路: 这道题实际有点像逆康拓展开.对于某个位置i,在它前面的数有a[i]个.第一头牛是无法确定身高的,但是如果我们从后往前考虑就可以用排除法确定身高. 对于最后一头牛,比它矮的有a[n]个,说明它是1~n中,第a[i]+1个数.我们考虑第n-1
阅读全文
摘要:原题链接 考察:树状数组+差分 上一道题的加强版,但还是结合差分数组 思路: 操作一:"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。 这里还是得用到差分,设b数组为原数组的差分数组,那么此操作就转化为单点修改 操作二:"Q a b" 询问[a,
阅读全文
摘要:原题链接 考察:树状数组 确实简单....就是差分+树状数组即可.本蒟蒻还以为又有什么神乎其神的优化..... 思路: 我们先看第一个指令:第一类指令形如 C l r d,表示把数列中第 l∼r 个数都加 d。 l~r区间内+d .单看这个操作容易想到差分. 即 修改b[l]与b[r+1] 再看第二
阅读全文
摘要:原题链接 考察:并查集 并查集维护序列的连通性 Y总在课上提过的题目,本蒟蒻果然不会 思路: 本质是快速染色某个区间.并查集可以帮助我们快速找到第一个未染色的点. 设p[i]为以i为起点第一个需要还未涂色的点(包括i) .通过findf(i)可以帮助我们找到第一个未染色的点.我们在for循环染色[l
阅读全文
摘要:原题链接 考察:枚举 思路: 枚举四个边角的情况就行..... 疯狂WA到我麻木....看了题解发现是和A一样的解法.... 1 #include <iostream> 2 using namespace std; 3 int n,op[4]; 4 bool check(int s) 5 { 6 i
阅读全文
摘要:原题链接 考察:并查集+离线 和这题有点像的题 HDU 3938 (本蒟蒻甚至写过) 思路: 乍一看似乎是LCA,但是询问两点最短距离必定TLE.我们可以发现两点之间的最短边首先是原题给定一条边,然后再对该边进行延伸.假定当前给定值是k,我们枚举边,将边两端进行合并,这样就是符合条件的结点个数.当k
阅读全文
摘要:原题链接 考察:LCA+二分答案 这题也太难想了,本蒟蒻完全不会QAQ 思路: 树上建边,然后每个任务都是一个查询,我们可以利用LCA求出树上任意两点的时间和.这道题要求去除一条边后最小的最大值. 两个最字很容易想到二分答案.假设二分答案为mid.对于每一个任务,检测它的时间是否会>mid.如果会统
阅读全文
摘要:原题链接 考察:树上差分 思路: 点差分.区别在于中间点多+了1.注意不能在dfs前对差分数组-1.这样会导致递推错误.比如下图: 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std;
阅读全文
摘要:原题链接 考察:树上差分 思路: 点差分模板题.定义d[i] 为某路径上经过i的次数. 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 const int N = 50010
阅读全文
摘要:原题链接 考察:LCA+最大生成树 思路: 实际是求两点之间最大的最短边.这样很容易想到二分,但是直接二分会TLE. 然后又会想到次小生成树,但是这道题边不能构成树.由于我们要的边尽量大,可以考虑贪心一波建立最大生成树.然后求两点之间的最小距离直接套LCA倍增板子.这题比次小生成树省事. 时间复杂度
阅读全文
摘要:原题链接 考察:LCA 思路: md想到了两两求lca但是没敢继续想下去...我是sb 最近公共祖先一定是对u,v来说最近的,但是对于第三个点需要两两枚举求最小值. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4
阅读全文
摘要:原题链接 考察:思维 顺着LCA的标签而来,结果这题貌似没什么关系(甚至想半天没想出来( 思路: 我们发现每个子结点和父节点都差一个斐波那契数.对于样例的树可以表示成 (1) (2) (3) (4 5) (6 7 8) (9 10 11 12 13) 每个数字减去斐波那契数列中最大但严格小于自己的数
阅读全文
摘要:原题链接 考察:LCA + 枚举 完全不会...LCA真难.... 思路: 很容易看出两个分为两段的方式: 附加边加上成环后,环上去掉一个树边和一个非树边. 未成环的树边去掉一个边,然后任意去掉一个非树边. 设d[x] 表示 x点到其父节点的边上要去掉d[x]条非树边才断. 考虑枚举非树边,对于非树
阅读全文

浙公网安备 33010602011771号