惨。今天聪哥选了2013 多校10做训练,结果一题都没做出来。这个题目是数据结构,正好是我强项

如果只是插入 删除 光标左右移动,那都小菜,用链表全解决,关键是那个Q k 要求 a1到aq的连续子序列和最大(子序列一定要以a1开头)。

然后我用记录每个节点的当前最大和总体最大,这样只要知道第k个是哪个数就可以了,但由于是用的链表,并不知道第k个是哪个。。一开始试了下暴力去扫,结果TL。。

其实我能想到每个点由前一个点过渡最大值,就离答案不远了,既然我不知道当前节点是第几个数,我就手动加一个量,专门记录数量的增减嘛。。然后用一个数组专门记录第几个数的最大值是多少,也可以用向量咯

哎,当时比赛的时候居然没想到

还有种用双桟的方法写的,Q处理一样的,只是用双桟写比链表要好写一些,因为题目只对光标所在处操作,故光标前弄个桟 光标后弄个桟 即可。

代码里真正查询的是 sum数组和v向量,d和ans是未修改代码残留的,没用,其实用向量还是写复杂了,直接另外用个数组记录第几个数的最大值就行了,遇到k直接输出更方便

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int N = +;
int cnt;
int Q,S,T,cur,n;
vector<int> v;
int sum[N];
struct node
{
int pre,next;
int xi;
int d;
int ans;
} num[N];
void SI()
{
n++;
int x;
scanf("%d",&x);
sum[n]=sum[n-]+x;
node* now=&num[cnt];
//插入操作
now->pre=cur;
now->next=num[cur].next;
num[cur].next=cnt;
num[now->next].pre=cnt;
cur=cnt;
cnt++;
now->xi=x;
now->d=x;
now->ans=x;
if (now->pre!=S){
node* bf=&num[now->pre];
now->d=bf->d+x;
now->ans=now->d;
now->ans=max(now->ans,bf->ans);
}
int r=v.size();
if (now->pre==S){
v.push_back(n);
}
else{
if ((sum[n])>sum[v[r-]]){
v.push_back(n);
}
}
}
void SD()
{
if (cur==S) return;
int r=v.size();
if (n==v[r-]) v.pop_back();
n--;
node* bf=&num[num[cur].pre];
node* af=&num[num[cur].next];
bf->next=num[cur].next;
af->pre=num[cur].pre;
if (num[cur].next!=T){
af->d=bf->d+af->xi;
af->ans=af->d;
af->ans=max(af->ans,bf->ans);
}
cur=num[cur].pre;
}
void SL()
{
if (cur!=S){
int r=v.size();
if (n==v[r-]) v.pop_back();
n--;
cur=num[cur].pre;
}
}
void SR()
{
if (num[cur].next!=T){
cur=num[cur].next;
n++;
int r=v.size();
sum[n]=sum[n-]+num[cur].xi;
if (sum[n]>sum[v[r-]]) v.push_back(n);
}
}
void query()
{
int k;
scanf("%d",&k);
int r=v.size();
if (v[r-]<=k) printf("%d\n",sum[v[r-]]);
else {
int loc=upper_bound(v.begin(),v.end(),k)-v.begin();
printf("%d\n",sum[v[loc-]]);
}
}
void test()
{
cout<<"Test:"<<endl;
cout<<cur<<endl;
for (int i=S;i!=T;i=num[i].next){
cout<<num[i].xi<<" ";
}
cout<<endl;
for (int i=;i<v.size();i++)
cout<<v[i]<<"-"<<sum[v[i]]<<" ";
cout<<endl;
}
int main()
{
char ch[];
while (scanf("%d",&Q)!=EOF)
{
v.clear();
cnt=;
n=;
S=,T=N-;
sum[S]=sum[T]=;
v.push_back(S);
num[S].next=T;
num[S].ans=num[S].d=num[S].xi=;
num[T].ans=num[T].d=num[T].xi=;
num[T].pre=S;
cur=S;
while (Q--){
//test();
scanf("%s",ch);
if (ch[]=='I'){
SI();
}
else
if (ch[]=='D'){
SD();
}
else
if (ch[]=='L'){
SL();
}
else
if (ch[]=='R'){
SR();
}
else{
query();
}
}
}
return ;
}

HDU—4699 Editor 双向链表+子集和的更多相关文章

  1. HDU 4699 Editor(双向链表)

    双向链表直接模拟. 用一个辅助数组maxSum来维护一下前k项中[1,k]的最大和. 因为光标是一格一格的移动,所以每次光标右移的时候动态更新一下即可. 时间复杂度O(n). #include < ...

  2. HDU 4699 - Editor - [对顶栈]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 Problem Description Sample Input8I 2I -1I 1Q 3LD ...

  3. HDU 4699 Editor (2013多校10,1004题)

    Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  4. hdu 4699 Editor 模拟栈

    思路:刚开始用STL中的栈,一直RE……,之后改为手动模拟栈操作,在注意点细节就可以了!!! 代码如下: #include<cstdio> #include<cstring> ...

  5. HDU 4699 Editor 维护栈

    维护两个栈,分别存光标前和光标后的数 再维护前缀和的栈 和 前缀和最大值的栈 注意一下左移,右移,删除到顶了就不操作了 5个操作 I x : 光标处插入x  -----> s1.push(x) ...

  6. HDU 4699 Editor(模拟 对顶栈)

    题目大意: 给定一个整数序列 维护5种操作 次数<1e6 I x: 光标位置插入x 然后光标位于x之后 D: 删除光标前一个数 L: 光标左移 R: 光标右移 Q k: 询问位置k之前的最大前缀 ...

  7. [置顶] hdu 4699 2个栈维护 or 伸展树

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 注意这里的k是在光标之前的, ...

  8. Project Euler 106:Special subset sums: meta-testing 特殊的子集和:元检验

    Special subset sums: meta-testing Let S(A) represent the sum of elements in set A of size n. We shal ...

  9. Project Euler 103:Special subset sums: optimum 特殊的子集和:最优解

    Special subset sums: optimum Let S(A) represent the sum of elements in set A of size n. We shall cal ...

随机推荐

  1. 使用EasyUI中Tree

    easyui里面的加载tree的两种方式 第一种: 使用EasyUI中Tree 符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ , "text":&qu ...

  2. SciPy fftpack(傅里叶变换)

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  3. js学习(三)对象与事件

    JavaScript 对象 1.JavaScript 对象:拥有属性和方法的数据. 2.在 JavaScript中,几乎所有的事物都是对象. 3.定义一个person对象 var person = { ...

  4. P1069 微博转发抽奖

    P1069 微博转发抽奖 转跳点:

  5. MySQL 如何使用 PV 和 PVC?【转】

    本节演示如何为 MySQL 数据库提供持久化存储,步骤为: 创建 PV 和 PVC. 部署 MySQL. 向 MySQL 添加数据. 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到 ...

  6. 有没有比NRF51822更好的智能穿戴蓝牙方案

    现在在智能穿戴领域市场不断的追求低功耗.低成本的蓝牙芯片.蓝牙芯片目前除了Dialog公司研制蓝牙芯片是最求超低功耗的但是对于其它性能上还比较满足不了其它领域的功能,另外NORDIC.TI的蓝牙芯片虽 ...

  7. 页面的html调试

    点击页面按下键盘的F12,或者鼠标右键选择检查(N) 会弹出一个窗口,这个窗口就是调试窗口 如上图所示,第一个图标是标签元素选择器,点击使用后,在页面上移动,会在Elements的区域找到你鼠标选中的 ...

  8. html的适配

    html值得一说的应该就是适配 !!适配是与手机同时存在的 写好一个页面在手机端打开,会发现这个页面显示很小,那是因为设备的视口宽度viewport不等于设备宽度device-width,而页面是根据 ...

  9. Numpy中np.random.randn与np.random.rand的区别,及np.mgrid与np.ogrid的理解

    np.random.randn是基于标准正态分布产生的随机数,np.random.rand是基于均匀分布产生的随机数,其值在[0,1). np.mgrid 与np.ogrid的理解及区别:np.mgr ...

  10. pyhton中matplotlib箱线图的绘制(matplotlib双轴图、箱线图、散点图以及相关系数矩阵图))

    //2019.07.23 1.箱形图,又称为盒式图,一般可以很好地反映出数据分布的特征,也可以进行多项数据之间分布特征的比较,它主要包含五个基础数据:中位数,两个上下分位数以及上下边缘线数据 其中的一 ...