HDU-4699 Editor 数据结构维护】的更多相关文章

维护两个栈,分别存光标前和光标后的数 再维护前缀和的栈 和 前缀和最大值的栈 注意一下左移,右移,删除到顶了就不操作了 5个操作 I x : 光标处插入x  -----> s1.push(x) D  : 光标前删除    -----> s1.pop() L  :  光标左移      -----> s2.push(s1.top())   s1.pop() R  :  光标右移      -----> s1.push(s2.top())   s2.pop() Q k : 输出前k个数…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 题意:开始有一个光标,每次有5中操作:1,光标当前位置插入一个数,2,光标当前位置删除一个,3,光标向左移一位,4,光标向右移动一位,5,询问前面的数列的最大前缀和. 由于每次删除的数都是在当前的光标位置,而且询问的前缀和都是在光标前面的位置,因此问题简化了很多,否则要用Splay tree搞了.我们可以直接用一个链表或者两个栈来维护光标以前的最大前缀和,然后直接模拟操作就可以了... //S…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 Problem Description Sample Input8I 2I -1I 1Q 3LDRQ 2 Sample Output23 Hint 题意: 维护一个整数序列的编辑器,有以下五种操作,操作总数不超过 $10^6$. $I \: x$:在当前光标位置之后插入一个整数 $x$,插入后光标移动到 $x$ 之后: $D$:删除光标前的一个整数: $L$:光标左移一格: $R$:光标右移一…
Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 118    Accepted Submission(s): 38 Problem Description   Sample Input 8 I 2 I -1 I 1 Q 3 L D R Q 2   Sample Output 2 3 Hint The following…
双向链表直接模拟. 用一个辅助数组maxSum来维护一下前k项中[1,k]的最大和. 因为光标是一格一格的移动,所以每次光标右移的时候动态更新一下即可. 时间复杂度O(n). #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; ; << ; struct node { int val; node *nex…
题目大意: 给定一个整数序列 维护5种操作 次数<1e6 I x: 光标位置插入x 然后光标位于x之后 D: 删除光标前一个数 L: 光标左移 R: 光标右移 Q k: 询问位置k之前的最大前缀和 选用"对顶栈"的做法 大致示意图如下: 对顶栈stkl, stkr直接通过数组模拟即可实现 以I x的操作为例, 需要: 1)将x插入stkl; 2)更新s数组 当前的前缀和 = 之前的前缀和 + x 3)更新f数组 记录该位置的最大前缀和 故有如下的代码: // tl用于记录左栈的栈…
惨.今天聪哥选了2013 多校10做训练,结果一题都没做出来.这个题目是数据结构,正好是我强项 如果只是插入 删除 光标左右移动,那都小菜,用链表全解决,关键是那个Q k 要求 a1到aq的连续子序列和最大(子序列一定要以a1开头). 然后我用记录每个节点的当前最大和总体最大,这样只要知道第k个是哪个数就可以了,但由于是用的链表,并不知道第k个是哪个..一开始试了下暴力去扫,结果TL.. 其实我能想到每个点由前一个点过渡最大值,就离答案不远了,既然我不知道当前节点是第几个数,我就手动加一个量,专…
思路:刚开始用STL中的栈,一直RE……,之后改为手动模拟栈操作,在注意点细节就可以了!!! 代码如下: #include<cstdio> #include<cstring> #include<algorithm> #define M 1000001 using namespace std; int A[M],B[M],a[M],s[M],cur,x,q,l,r; char c; int main() { while(scanf("%d",&…
hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 注意这里的k是在光标之前的,由于这个条件,所以这题又简单的2个栈维护可以解,如果没有这个条件,那么就要用伸展树了. 栈的解法叉姐的解题报告有,我这里说说伸展树的做法, 1.8MS卡过. 我们用cur表示光标在第几个数的右边,size表示数的总个数. 对于操作L: 没有移到最左边就cur-- 对于操作R: 没有移到最右边就cur…
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀和,即可 [代码] #include<bits/stdc++.h> using namespace std; ; const int INF = 2e9; class mstack { private : int tot; int s[MAXN]; public : inline void cle…
Problem Description   Sample Input 8 I 2 I -1 I 1 Q 3 L D R Q 2   Sample Output 2 3 Hint The following diagram shows the status of sequence after each instruction: 题意:n个操作 5种操作,I x:该光标位置插入x并且光标后移 D :删除光标前的一个数 L :光标左移 R :光标右移 Q k:询问位置k之前的最大前缀和,k不会超过当前…
对顶栈算法. 此题充分说明了cin的不中以及scanf的优越性. 我TM用cin超时了!!!换成scanf就A了!!! #include <cstdio> #include <cstring> #include <iostream> , INF = 0x3f3f3f3f; inline int max(int a, int b) { return a > b ? a : b; } struct DZ { int l[N], r[N], sum[N], large[…
http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转(更新只需更新一个节点的矩阵) 直接贴题解 我们可以把第i层跟第i+1层之间楼梯的通断性构造成一个2*2的通断性矩阵,1表示通,0表示不通.那么从第a层到第b层,就是将a到b-1的通断性矩阵连乘起来,然后将得到的答案矩阵上的每个元素加起来即为方案数.想到矩阵的乘法是满足结合律的,那么我们可以用线段树来…
用两个栈模拟: Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1913    Accepted Submission(s): 591 Problem Description   Sample Input 8 I 2 I -1 I 1 Q 3 L D R Q 2   Sample Output 2 3 Hint The…
Get到了全新O(1)替代部分伸展树功能的姿势 左栈stk1维护当前信息,右栈stk2维护历史删除信息 题目求的是严格的前缀和(且小于当前指针)那就每次左栈新增时再更新前缀和信息就好 即使把题面换成最大子段和也是一样搞法 要是O(1)求1到k的最大/小值?再来多一个维护历史的栈..应该可以吧 /*H E A D*/ stack<int> stk1,stk2; ll sum[maxn],maxsum[maxn]; int main(){ int Q,op,x,k; char str[50]; w…
题目链接 GSS $GSS1$ 对于每个询问$l$, $r$,查询$a_{l}$, $a_{l+1}$, $a_{l+2}$, ..., $a_{r}$这个序列的最大字段和. 建立线段树,每个节点维护四个信息 $c$:当前区间的元素和 $lc$:当前区间左端点开始的最大子序列和 $rc$:当前区间右端点结束的最大子序列和 $ret$:当前区间的答案 于是我们建立线段树的时候预处理出每个节点的四个信息,查询的时候返回一个节点,这个节点的$ret$即为答案. #include <bits/stdc+…
Box \[ Time Limit: 5000 ms \quad Memory Limit: 32768 kB \] 题意 给出 \(n\) 个箱子的包含关系,每次两种操作. 操作 \(1\):把 \(x\) 的箱子及里面的箱子一块挪到 \(y\) 箱子里面去. 操作 \(2\):查询 \(x\) 箱子的最外层的箱子编号. 思路 对于每一大块箱子,可以看成树和子树的包含关系,那么可以根据树的 \(dfs\) 序,把一个箱子所包含的箱子拍成一个区间,这样就变成了很多颗树.为了方便后面的操作,对于每…
Editor Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2818 Accepted Submission(s): 825 Problem Description Sample Input 8 I 2 I -1 I 1 Q 3 L D R Q 2 Sample Output 2 3 Hint The following diagram…
题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑物的凸包,找到一个最小的角度,然后对称一下,再找一个右边的建筑物的最小角度,两个角度加起来就是答案. 将人左边的建筑物从左到右扫描,下面两种情况会出栈: 栈顶元素楼高小于等于当前扫描到的楼高,因此这是一个单调的栈 栈顶两个楼顶所在直线的斜率 小于 栈顶的楼顶和当前楼顶所在直线的斜率(这里的斜率指的是…
思路:已知当前的总长度和为len,当前的伤害为sum,伤害次数为 num.那么对下一个点的伤害值sum=sum+2*len+num: 这个是通过(x+1)^2展开化简就能得到. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #define Maxn 100010 #define LL __int64 #define…
题目链接: https://www.luogu.org/problemnew/show/P1099 https://www.lydsy.com/JudgeOnline/problem.php?id=1999 (加强版) 分析: 首先你需要\(O(N)\)求树的直径的前置技能,其实很简单,先随便找个根找到树上距离它最远的顶点\(S\),然后以\(S\)为根找树上距离\(S\)最远的顶点\(E\),\(S,E\)之间的路径就是树的直径 暴力枚举 按照题目要求说的去做就好了,求出树的直径,然后根据贪心…
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否合法. 题解: 注意细节即可. 代码: #include <bits/stdc++.h> using namespace std; int n; char s[505]; int main () { int T; cin>>T; for ( ; T; --T) { scanf(&quo…
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6155 题解 DP+线代好题.(考场上过多时间刚前两题,没怎么想这题--) 首先列出一个DP式: 设\(dp[i][j]\)表示到第\(i\)位最后一位是\(j\)有多少个本质不同的子序列(最后一位不一定取到第\(i\)位),考虑转移: 假设\(a_i=0\), 那么\(dp[i][0]=2\times dp[i-1][0]+dp[i-1][1]-dp[i-1][0]+1=dp[i-1][0]+dp[…
题意:bc round 74 分析: 参考下普通的用堆维护求字典序最小拓扑序, 用某种数据结构维护入度小于等于k的所有点, 每次找出编号最小的, 并相应的减少k即可. 这个数据结构可以用线段树, 建立一个线段树每个节点[l,r]维护编号从ll到rr的所有节点的最小入度, 查询的时候只需要在线段树上二分, 找到最小的x满足入度小于等于k. 复杂度O((n+m)logn) #include <iostream> #include <cstdio> #include <vector…
HDU 4544 Tags: 数据结构,贪心 Analysis: 将兔子的血量从大到小排序,将箭的杀伤力从大到小排序,对于每一个兔子血量, 将比他大的杀伤力大的剑压入优先队列,优先队列自己重写,让它每次抛出的数为价钱最小. Code: #include <cstdio> #include <queue> #include <algorithm> #include <functional> using namespace std; typedef long l…
不定长数组 维护一个序列 在末尾插入/删除均摊O(1) 任意位置插入O(n) 指定位置查询/修改O(1) 空间O(n) 链表 维护一个序列 定位到第i个位置O(n) 在任意位置(已定位到该位置)插入/删除/修改O(1) 空间O(n) 散列表 维护键-值对应关系或维护键的存在性 1.开放寻址法散列表 若已插入键个数小于表大小的3/4则可以认为查询/修改/插入期望O(1),最坏O(n)若正确选择hash函数一般不会出现 删除只能标记删除 一般所需空间应大于键个数的4/3以保证效率 2.链接法散列表…
 题意:问你有n个长度总和为n的数组 你可以移动数组 但不能移出长度为w的矩形框 问你每一列的最大值是多少? 思路:只有一次询问 我们可以考虑差分来解决 然后对于每一行数组 我们可以用数据结构维护一下区间最大值 #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const double eps = 1e-6; const int N = 1e6+7; typedef long long ll; c…
#1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 实链剖分 先来回顾一下树链剖分,我们可以按照子树大小进行剖分(重链剖分),也可以按照子树高度进行剖分(长链剖分),使得原本的一棵树被分为若干条链,然后可以在链上通过如线段树这样的数据结构维护信息. 那么,存不存在一种剖分方式能够使我们更加得心应手地处理动态树问题?显然剖出的可能会不停变换,于是我们…
CDQ学习资料 day1cdq分治相关 CDQ的IOI论文 1.优化斜率dp 左边对右边影响维护一个凸包解决 需要知识:①凸包②斜率dp 题目:√ HDU3842 Machine Works   HYSBZ 1492 货币兑换Cash 2.三维/多维偏序 cdq降维,剩下用数据结构维护. 需要知识:①LIS②偏序关系③二维线段树/树状数组 题目:陌上花开(此题目前找不到) Pinball Game3D 3.CDQ+FFT/NTT 需要知识:①FFT②NTT 题目:HDU 5730 Shell N…
推荐几个博客:https://www.cnblogs.com/JVxie/p/4854719.html Tarjan离线算法的基本思路及其算法实现 https://blog.csdn.net/shahdza/article/details/7779356 LCA题集 http://www.cnblogs.com/zhouzhendong/p/7256007.html LCA的三种算法介绍 模板(题): 1.(POJ1470)http://poj.org/problem?id=1470 Tarja…