随笔分类 -  数据结构--------------------------

摘要:【题意】给定n项工作的截止时间和价值,每项工作需要1单位时间完成,求最大价值。n<=10^5。 【算法】贪心+堆 【题解】 如果是访问到x时将d[x]前的点从价值最大的能加就加是错误的贪心,因为后面的点会占用到前面的,不能保证已选的就是最优的。 正确的贪心:按顺序选择前面所有点,并把价值取负后加入堆 阅读全文
posted @ 2017-08-29 19:46 ONION_CYC 阅读(303) 评论(0) 推荐(0)
摘要:【算法】主席树 【题解】例题,记录和,数字出现超过一半就递归查找。 主席树见【算法】数据结构 #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespace std; int read() 阅读全文
posted @ 2017-08-17 21:46 ONION_CYC 阅读(247) 评论(0) 推荐(0)
摘要:【算法】数学+堆 【题意】给定n个数的排列,每次操作可以取两个数按序排在新序列的头部,求最小字典序。 【题解】 转化为每次找字典序最小的两个数按序排在尾部,则p1和p2的每次选择都必须满足:p1在当前序列的奇数位置,p2在当前序列的偶数位置且位于p1之后。满足条件的情况下每次找最小。 每次找到p1和 阅读全文
posted @ 2017-08-14 06:54 ONION_CYC 阅读(408) 评论(0) 推荐(1)
摘要:【关键字】偏序,数点,树状数组,线段树,扫描线。 因为涉及多种算法,所以整合到一起。 【扫描线】 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 扫描线是一维离线的做法的统称,常用于解决k维偏序问题。 离线:将其中一维的询问排序后按顺序处理,从而实现按时间顺序处理的过程中可以O(1)统计空间上 阅读全文
posted @ 2017-08-12 11:11 ONION_CYC 阅读(1012) 评论(0) 推荐(1)
摘要:【算法】DP+线段树求区间max(二维偏序) 【题解】 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]。 观察j的条件限制显然是二维偏序求最大值,套路化地离散化后一维排序+一维线段树即可解决。 最后在f[i]中找max,所以不用恢复原序。 复杂度O(n 阅读全文
posted @ 2017-08-12 07:02 ONION_CYC 阅读(310) 评论(0) 推荐(0)
摘要:【算法】扫描线:差分+树状数组 【题意】转化模型后:求每个矩形覆盖多少点和每个点被多少矩形覆盖。n<=10^5。 【题解】经典的扫描线问题(二维偏序,二维数点)。 数点问题 将所有询问离线并离散化,然后按从上到下排序。 对于点被覆盖问题: 扫描线从上到下进行,遇到矩阵上边界维护区间加,遇到矩阵下边界 阅读全文
posted @ 2017-08-11 21:28 ONION_CYC 阅读(477) 评论(0) 推荐(0)
摘要:【题意】n个数划分成k段,每段的价值为段内不同数字的数量,求最大总价值 【算法】DP+线段树 【题解】 f[i][j]表示前i个数字划分成j段的最大价值。 f[i][j]=max(f[k][j-1]+value(k+1,j)),j-1<=k<i。 暴力复杂度O(n^3*k),预处理value后复杂度 阅读全文
posted @ 2017-08-10 14:38 ONION_CYC 阅读(231) 评论(0) 推荐(0)
摘要:【题意】给定长度为n的整数序列,求长度为[L,R]的前k大区间和的和。n,k<=500000。 【算法】堆+贪心+RMQ 【题解】考虑暴力是取所有长度为[L,R]的子串的前k大求和,复杂度O(n^2)。 发现左端点相同的区间[l,r]中,最大的区间和就是最大的sum[r](sum是前缀和数组)。 然 阅读全文
posted @ 2017-08-04 12:01 ONION_CYC 阅读(208) 评论(0) 推荐(0)
摘要:【第一题】 题意: 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T。 这里的出现定义为存在一串下标 ,满足 且 。 2≤n≤5000,数据随机。 题解: 很容易想到部分分算法DFS枚举子集。 由于数据随机,n>10时大概率存在,直接输出。 #include<cstdio> #in 阅读全文
posted @ 2017-07-27 17:57 ONION_CYC 阅读(275) 评论(0) 推荐(0)
摘要:【题意】n个数,每个数有附加属性0或1,初始全为1。m个操作,每个操作可以改变一个数字的属性为0或1。对于每次操作后的序列求有多少子序列满足要求:5个数字,中间3个数相等且属性为1,左右两个数小于等于中间三个数且属性任意。n,m<=10^5。 【算法】线段树 【题解】朴素的算法,奇妙的使用>_<! 阅读全文
posted @ 2017-07-16 16:44 ONION_CYC 阅读(437) 评论(0) 推荐(1)
摘要:【算法】贪心+堆 【题意】n个数字的序列,要求选择互不相邻的k个数字使和最大。 【题解】 贪心,就是按一定顺序选取即可最优,不会反悔。 考虑第一个数字选择权值最大的,那么它相邻的两个数字就不能选择,那么我们可以把这三个数字视为一个整体。操作为将pre[pre[x]]和x和suc[suc[x]]连接起 阅读全文
posted @ 2017-06-28 14:17 ONION_CYC 阅读(415) 评论(0) 推荐(1)
摘要:【算法】贪心,一般DP 【题解】 胡策k≤10的环状DP做法: 1.钦定法:先确定第一位(可能和第n位)的状态,然后后面正常做DP,显然正确答案是一定会被记录的,因为从整体上看不会有影响。 2.环的特性:取的段和不取的段数量相等,位置互补。所以1和n的连接处都选或都不选都会有不被包括的情况,一选一不 阅读全文
posted @ 2017-06-27 20:13 ONION_CYC 阅读(484) 评论(0) 推荐(0)
摘要:【算法】Link-Cut Tree+线段树(维护DFS序) 【题解】整整三天……T_T 这篇题解比较资瓷:permui 这道题虽然树形态没有变化,但用lct写的原因在于把题目中的操作一进行了神转化:每条重链表示一种颜色,点到根的颜色数=经过的轻链数+1。 询问一个点的子树所有结点到根的代价和(的平均 阅读全文
posted @ 2017-06-08 23:26 ONION_CYC 阅读(374) 评论(0) 推荐(0)
摘要:【算法】树状数组(区间和) 【题解】记得开long long #include<cstdio> #include<cstring> #include<algorithm> #define lowbit(x) (x&(-x)) using namespace std; const int maxn=5 阅读全文
posted @ 2017-06-01 18:28 ONION_CYC 阅读(168) 评论(0) 推荐(0)
摘要:【算法】splay 【题解】 splay维护序列,用权值(离散化)作为编号。每次找第i小的话直接找对应编号splay即可。 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点pushdown。暴力出奇迹! 如果没有find就直接splay,一定记得更新设置splay为传值调用并且在 阅读全文
posted @ 2017-05-28 22:01 ONION_CYC 阅读(204) 评论(0) 推荐(0)
摘要:【算法】splay 【题解】对于每个结点维护其子树串的hash值,前面为高位,后面为低位。 sum[x]=sum[L]*base[s[R]+1]+A[x]*base[s[R]]+sum[R],其中sum为哈希,base为乘权,A为数值(即字符)。 #include<cstdio> #include< 阅读全文
posted @ 2017-05-28 21:54 ONION_CYC 阅读(238) 评论(0) 推荐(0)
摘要:【算法】splay 【题解】数据结构 感谢Occult的模板>_<:HYSBZ 1500 维修数列 #include<cstdio> #include<cctype> #include<cstring> #include<queue> #include<algorithm> using namesp 阅读全文
posted @ 2017-05-28 19:58 ONION_CYC 阅读(216) 评论(0) 推荐(0)
摘要:【算法】离散化+树状数组(求逆序对) 【题解】经典,原理是统计在i之前插入的且值≤i的个数,然后答案就是i-getsum(i) #include<cstdio> #include<algorithm> #include<cstring> #define lowbit(x) x&(-x) using 阅读全文
posted @ 2017-05-28 18:28 ONION_CYC 阅读(327) 评论(0) 推荐(0)
摘要:【算法】树链剖分+线段树(区间加值,区间求和) 【题解】http://hzwer.com/3891.html 中间不要取模不然相减会出错。 血的教训:线段树修改时标记下传+上传,查询时下传。如果修改时标记不下传,下面的结果就会覆盖上面的标记上传造成的影响。 读入后全部排序(离线处理) 链剖之后按顺序 阅读全文
posted @ 2017-04-23 00:03 ONION_CYC 阅读(188) 评论(0) 推荐(0)
摘要:【算法】(manacher+贪心)||(manacher+DP+树状数组/线段树) 【题解】 manacher求回文串,后得到线段,做一点计算映射回原串线段。 然后问题转化为可重叠区间线段覆盖问题,可以贪心解决。 排序左端点,同一左端点取最长段,然后在此段中找到右端点最靠右的线段,线性更新并累加。 阅读全文
posted @ 2017-04-05 21:19 ONION_CYC 阅读(375) 评论(0) 推荐(0)