摘要:
题面 "题目传送门" 解法 题目就是一个二维偏序问题 将某一个询问转化成二维前缀和的形式即可 还是用常数比较小的cdq分治吧,空间小,比较容易实现 坐标需要离散化 时间复杂度:$O(n+m)\ log^2\ n$ 代码 cpp include define N 2500010 using names 阅读全文
摘要:
题面 "题目传送门" 解法 每一次询问有已知点中与询问点曼哈顿距离最小是多少 把绝对值拆开来分别维护一下 ~~我写的比较丑,写了4个cdq,然后光荣T飞……~~ 好像这道题k dtree比cdq要优一点吧 cdq复杂度:$O((n+m)\ log^2 n)$ 代码 cpp include defin 阅读全文
摘要:
题面 "题目传送门" 解法 同 "bzoj2716" ~~自己cdq写的还是丑啊,别人A掉了我T飞了~~ 代码 cpp include define inf 1 void chkmax(node &x, node y) {x = max(x, y);} template void chkmin(no 阅读全文
摘要:
题面 "题目传送门" 解法 可以离线,那么就是非常简单的cdq分治了 只要把询问拆成4个,然后就变成了一个三维偏序问题 时间复杂度:$O(q\ log^2\ n)$ 代码 cpp include define int long long define N 1000010 using namespac 阅读全文
摘要:
题面 "题目传送门" 解法 动态点分治模板题 什么是动态点分治呢??? 静态的点分治就是不断地找到当前树的重心,然后分成若干个子树继续递归下去 但是如果有修改似乎静态的就不好处理了 我们现在引入一个叫点分树的东西 说白了,就是每一次静态点分治的时候这一次的重心和上一次的连边,这样形成了一棵树 再说清 阅读全文
摘要:
题面 "题目传送门" 解法 正解是LCT,当然分块也可以做 先简单讲一下分块的做法吧: 分成$\sqrt n$个块,每一个元素维护最近的到达不是自己这一块的位置和步数 预处理直接倒着做即可 时间复杂度:$O(m\sqrt n)$ 当然,LCT的解法比较优,但是代码较长 显然,每一次跳相当于一条边 可 阅读全文
摘要:
题面 "题目传送门" 解法 LCT模板题 有些博客讲得挺好的,转一下 "博客" 这个挺详细的 时间复杂度:$O(m\ log\ n)$,~~尽管常数巨大~~ 代码 cpp include define N 20010 using namespace std; template void chkmax 阅读全文
摘要:
题面 "题目传送门" 解法 挺妙的一道题 显然不能每一次都多重背包,效率太低 发现物品种类只有4种,可以干点什么 设$f_i$表示所有物品都无限取的时候的方案数 这个可以通过无限背包处理出来 对于每一次询问,答案即为得到面值S的超过限制的方案数 – 第1种硬币超过限制的方案数 – 第2种硬币超过限制 阅读全文
摘要:
题面 "题目传送门" 解法 维护双关键字好像不太可做吧 所以我们先按照$a$从小到大排序,然后逐一检查$b$ 如果构成环,那么把环上最大的$b$删掉 只要出现1和$n$连通的时候就更新答案 时间复杂度:$O((n+m)\ log\ n)$ 代码 cpp include define N 150010 阅读全文
摘要:
题面 "题目传送门" 解法 离线询问,然后莫队 建2棵权值树状数组,一棵为区间有多少个数,另一棵为区间有多少个不同的数 在扩展区间的时候用树状数组修改即可 代码 cpp include define N 3000010 using namespace std; template void chkma 阅读全文