
数据结构
文章平均质量分 58
sancpp
这个作者很懒,什么都没留下…
展开
-
牛客练习赛59.E 石子搬运(数据结构优化dp)
传送门分析dp状态表示:f[i][j]表示前i个物品搬运了j次的最小代价。因为第x个物品搬n次是可以o(1)o(1)o(1)算出来的。LL calc(int x, int n){ if (x <= n) return 1ll * x; int cur = x / n, tmp = x -= cur * n; return 1ll * cur * cur * (n - tmp) + 1ll * tmp * (cur + 1) * (cur + 1);}原创 2021-10-17 14:50:20 · 146 阅读 · 0 评论 -
Educational Codeforces Round 46 F. One Occurrence(主席树)
传送门求任意一个区间中只出现一次的数区间问题用主席树维护,对前缀建主席树。主席树需要维护该元素上一次出现的位置,如果[l,r]中元素上一次出现的位置小于l,则说明有解(并且解就是这个元素)所以主席树需要维护区间最小值,顺带维护最小值出现的下标。如果一个元素在区间中出现了很多次:eg:5,6,5,7,5,8则元素5上一次出现的位置会不断被后面新出现的5更新。故答案是正确的。每个版本相较于上一个版本:1.将此位置的值更改为last[i]2.如果这个数之前出现过,则将last[i]这个位置重新原创 2021-09-07 16:53:37 · 119 阅读 · 0 评论 -
HDU4745 Two Rabbits(区间dp)
wsfw 卡在最后的答案统计了,看了别人的博客,觉得很有道理。先破环成链,答案有两种情况:1.在一段区间(最长为n)中的回文子序列:12321。两人站在l,r的位置开始行动2.对于一个长度为n-1的序列来说,str[l-1]==str[r+1],所以有一种情况是两人站在l-1,r+1的位置开始行动。(说白了,l-1,r+1是同一个点,这种情况就是起点相同的情况。)#include <bits/stdc++.h>using namespace std;//-----pre_def--原创 2021-08-23 20:43:01 · 140 阅读 · 0 评论 -
HDU4123 Bob’s Race(树形dp,RMQ,树的直径)
传送门题意一棵n点的树,每一个点都从当前位置走到距离最远的位置的距离dis[i],1~n的连续区间中最大并且走的最远距离差值不超过Q的区间右多大。分析感觉有点不好下手最后的询问是区间最大值减最小值,可以用RMQ实现。那么就需要处理出每个点从当前位置走到距离最远的位置的距离dis数组了。直觉上能dfs预处理出来,类似求树的直径,要注意的点是如何处理从父亲结点下来的长度。这里还是有很多细节的,需要想清楚,先dfs1出儿子结点(只向下)最远的距离,在dfs2和从父亲结点来的比较。但是如果父亲结原创 2021-08-23 18:23:24 · 123 阅读 · 0 评论 -
HDU1815 (二分+2-SAT+建图)
#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<double, double> PDD原创 2021-08-18 21:46:58 · 113 阅读 · 0 评论 -
c++ STL rope小结
rope是stl封装好的可持久平衡树(不支持kth)。基本操作(函数)比较少。下标从0开始。{1,2,5,4}.insert(1,10)=>{1,10,2,5,4}#include<ext/rope>///头文件using namespace __gnu_cxx;rope <int> x;int main(){ x.push_back(x); //在末尾加x x.insert(pos, x); //在pos位置加入x x.erase(pos原创 2021-07-10 20:06:55 · 1679 阅读 · 0 评论 -
2-SAT模板整理
给定 n 个还未赋值的布尔变量 x1∼xn。现在有 m 个条件,每个条件的形式为 “xi 为 0/1 或 xj 为 0/1 至少有一项成立”,例如 “x1 为 1 或 x3 为 0”、“x8 为 0 或 x4 为 0” 等。现在,请你对这 n 个布尔变量进行赋值(0 或 1),使得所有 m 个条件能够成立。输入格式第一行包含两个整数 n,m。接下来 m 行,每行包含四个整数 i,a,j,b,用来描述一个条件,表示 “xi 为 a 或 xj 为 b”。输出格式如果问题有解,则第一行输出 POSS原创 2021-06-01 17:56:51 · 247 阅读 · 1 评论 -
POJ-1733Parity game(并查集+2-SAT)
传送门1.题意小 A 和小 B 在玩一个游戏。首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。然后,小 B 向小 A 提出了 M 个问题。在每个问题中,小 B 指定两个数 l 和 r,小 A 回答 S[l∼r] 中有奇数个 1 还是偶数个 1。机智的小 B 发现小 A 有可能在撒谎。例如,小 A 曾经回答过 S[1∼3] 中有奇数个 1,S[4∼6] 中有偶数个 1,现在又回答 S[1∼6] 中有偶数个 1,显然这是自相矛盾的。请你帮助小 B 检查这 M 个答案,并指出在至原创 2021-05-26 12:30:11 · 131 阅读 · 0 评论 -
点分治模板、例题整理
传送门1.题意求一个树中距离小于等于k的点对的个数。1≤N≤1041≤N≤10^41≤N≤1042.分析点分治算法:树的重心树的重心是指:删除该点后,最大子树(的点数)最小的点。关于重心的结论:删除重心之后,最大子树的点数小于等于总点数/2。于是:我们可以将一个树上问题删去重心点之后分解成若干个子树内部的问题和子树之间的问题。这样可以保证是log级的时间复杂度。(边分治则不行,会被菊花图卡成n)关于本题我们先将重心找出来,然后路径小于等于k的点对可以分成如下:1.两点在同一颗子树中。原创 2021-05-02 20:58:19 · 666 阅读 · 2 评论 -
LUOGU P3586 [POI2015]LOG (splay)
传送门1.题意维护一个长度为 n 的序列,一开始都是 0,支持以下两种操作:1.U k a 将序列中第 k 个数修改为 a。2.Z c s 在这个序列上,每次选出 c 个正数,并将它们都减去 1,询问能否进行 s 次操作。每次询问独立,即每次询问不会对序列进行修改。2.分析操作的次数与 第 k 个数 无关。故只需要动态维护好第k个数的值cnt[k]就行了。当需要进行s次操作时:1.cnt[i]>=s:对结果的贡献为s。(和记为lim)2.cnt[i]<s:对结果的贡献为cnt原创 2021-04-07 20:40:32 · 181 阅读 · 0 评论 -
洛谷P2596 [ZJOI2006]书架(splay)
传送门1.题意第一行有两个整数,分别表示书的个数 n 以及命令条数 m。第二行有 n 个整数,第 i 个整数表示初始时从上向下书第 ii 本书的编号 p_i。接下来 m 行,每行表示一个操作。每行初始时有一个字符串 op。若 op 为 Top,则后有一个整数 s,表示把编号为 s 的书放在最上面。若 op 为 Bottom,则后有一个整数 s,表示把编号为 s 的书放在最下面。若 op 为 Insert,则后有两个整数 s,t,表示若编号为 s 的书上面有 x 本书,则放回这本书时他的上面有原创 2021-04-05 19:34:06 · 174 阅读 · 0 评论 -
P1486 [NOI2004] 郁闷的出纳员(splay模板整理)
传送门花了好长时间#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 1e9;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<double, double>原创 2021-03-21 22:13:23 · 188 阅读 · 2 评论 -
P1110 [ZJOI2007]报表统计(数据结构大杂烩+splay水题)
传送门题意先给定一个初始长度为n的初始数组,要求实现3个操作:1.INSERT i k:在原数列的第 i 个元素后面添加一个新元素 k;如果原数列的第 i 个元素已经添加了若干元素,则添加在这些元素的最后(见样例说明)。2.MIN_GAP:查询相邻两个元素的之间差值(绝对值)的最小值。3.MIN_SORT_GAP:查询所有元素中最接近的两个元素的差值(绝对值)。分析1.第3个操作需要用到平衡树,在每次插入一个数的时候找到其前驱&后继,统计全剧最小值即为答案。2.第2个操作,插入一个数原创 2021-03-22 20:07:17 · 264 阅读 · 3 评论