BZOJ2482: [Spoj1557] Can you answer these queries II
题解:
从没见过这么XXX的线段树啊。。。
T_T
我们考虑离线做,按1-n一个一个插入,并且维护区间【 j,i】(i为当前插入的数)j<i的最优值。
但这个最优值!!!
我们要保存历史的最优值,以及当前的最优值!!!还有lazy!!!也得分历史和现在!!T_T
怎么搞!!!
inline void update(int k,int z1,int z2)
{
t[k].tag[]=max(t[k].tag[],t[k].tag[]+z2);
t[k].tag[]+=z1;
t[k].mx[]=max(t[k].mx[],t[k].mx[]+z2);
t[k].mx[]+=z1;
t[k].mx[]=max(t[k].mx[],t[k].mx[]);
}
inline void pushdown(int k)
{
if(!t[k].tag[]&&!t[k].tag[])return;
update(k<<,t[k].tag[],t[k].tag[]);
update(k<<|,t[k].tag[],t[k].tag[]);
t[k].tag[]=t[k].tag[]=;
}
就是这么鬼畜,然后剩下的套模板就好了。。。
其实也蛮好理解的。
tag[0]表示从上次pushdown到现在加了多少
tag[1]表示从上次pushdown到现在tag[0]最多达到过多少,因为祖先的操作可能累计了很多次,我们只需要向下传一下最大的。
mx[0]和mx[1]与tag类似。
对拍了一组数据发现RE了,调了1h发现我dtmk写错了!!!说多了都是泪啊T_T
不过#2还是蛮开心的 哈哈~
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 200000+5
#define maxm 100000+5
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,v[maxn],last[maxn],ans[maxn];
struct rec{int l,r,id;}a[maxn];
inline bool cmp(rec x,rec y){return x.r<y.r;}
struct seg{int l,r,mx[],tag[];}t[*maxn];
inline void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;int mid=(l+r)>>;
if(l==r)return;
build(k<<,l,mid);build(k<<|,mid+,r);
}
inline void update(int k,int z1,int z2)
{
t[k].tag[]=max(t[k].tag[],t[k].tag[]+z2);
t[k].tag[]+=z1;
t[k].mx[]=max(t[k].mx[],t[k].mx[]+z2);
t[k].mx[]+=z1;
t[k].mx[]=max(t[k].mx[],t[k].mx[]);
}
inline void pushup(int k)
{
for0(i,)t[k].mx[i]=max(t[k<<].mx[i],t[k<<|].mx[i]);
}
inline void pushdown(int k)
{
if(!t[k].tag[]&&!t[k].tag[])return;
update(k<<,t[k].tag[],t[k].tag[]);
update(k<<|,t[k].tag[],t[k].tag[]);
t[k].tag[]=t[k].tag[]=;
}
inline void add(int k,int x,int y,int z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update(k,z,);return;}
pushdown(k);
if(y<=mid)add(k<<,x,y,z);
else if(x>mid)add(k<<|,x,y,z);
else add(k<<,x,mid,z),add(k<<|,mid+,y,z);
pushup(k);
}
inline int query(int k,int x,int y)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y)return t[k].mx[];
pushdown(k);
if(y<=mid)return query(k<<,x,y);
else if(x>mid)return query(k<<|,x,y);
else return max(query(k<<,x,mid),query(k<<|,mid+,y));
}
#define last(i) last[100000+i]
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();
for1(i,n)v[i]=read();
build(,,n);
m=read();
for1(i,m)a[i].l=read(),a[i].r=read(),a[i].id=i;
sort(a+,a+m+,cmp);
int j=;
for1(i,n)
{
int tmp=last(v[i]);last(v[i])=i;
add(,tmp+,i,v[i]);
while(a[j].r==i)ans[a[j].id]=query(,a[j].l,i),j++;
}
for1(i,m)printf("%d\n",ans[i]);
return ;
}
2482: [Spoj1557] Can you answer these queries II
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 115 Solved: 67
[Submit][Status]
Description
给定n个元素的序列。
给出m个询问:求l[i]~r[i]的最大子段和(可选空子段)。
这个最大子段和有点特殊:一个数字在一段中出现了两次只算一次。
比如:1,2,3,2,2,2出现了3次,但只算一次,于是这个序列的和是1+2+3=6。
Input
第一行一个数n。
第二行n个数,为给定的序列,这些数的绝对值小于等于100000。
第三行一个数m。
接下来m行,每行两个数,l[i],r[i]。
Output
M行,每行一个数,为每个询问的答案。
Sample Input
4 -2 -2 3 -1 -4 2 2 -6
3
1 2
1 5
4 9
Sample Output
5
3
HINT
【数据说明】
30%:1 <= n, m <= 100
100%:1 <= n, m <= 100000
Source
BZOJ2482: [Spoj1557] Can you answer these queries II的更多相关文章
- 【BZOJ2482】[Spoj1557] Can you answer these queries II 线段树
[BZOJ2482][Spoj1557] Can you answer these queries II Description 给定n个元素的序列. 给出m个询问:求l[i]~r[i]的最大子段和( ...
- [SPOJ1557] Can you answer these queries II
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2482 [算法] 线段树维护历史最值 时间复杂度 : O(NlogN) [代码] #i ...
- bzoj 2482: [Spoj GSS2] Can you answer these queries II 线段树
2482: [Spoj1557] Can you answer these queries II Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 145 ...
- SPOJ 1557. Can you answer these queries II 线段树
Can you answer these queries II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://www.spoj.com/pr ...
- spoj gss2 : Can you answer these queries II 离线&&线段树
1557. Can you answer these queries II Problem code: GSS2 Being a completist and a simplist, kid Yang ...
- SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)
GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...
- SPOJ1557 GSS2 Can you answer these queries II 历史最值线段树
传送门 题意:给出一个长度为$N$的数列,$Q$次询问,每一次询问$[l,r]$之间的最大子段和,相同的数只计算一次.所有数字的绝对值$\leq 10^5$ GSS系列中不板子的大火题,单独拿出来写 ...
- SPOJ GSS2 Can you answer these queries II
Time Limit: 1000MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description Being a ...
- GSS2-Can you answer these queries II
---恢复内容开始--- 这道题真的是非常恶心,看题解看了半天才弄懂,而且题解上说的相当简略. 此题大意是询问去掉重复元素的最大子区间和,没有修改操作. 没有修改操作,这样就可以离线处理了. 这道题有 ...
随机推荐
- Wireshark - ICMP 报文分析
1. 测试机器,源 IP 地址为 10.21.28.110,目的 IP 地址为 10.6.0.24. 2. 使用 "ip.addr == 10.6.0.24 and icmp" 过 ...
- Asp.net 同时下载多个文件
整理自网络 下载思路是首先把多个文件进行压缩,然后再下载压缩成的压缩包 引用文件dll:ICSharpCode.SharpZipLib.dll 1. 合成下载文件夹 Protected Sub btn ...
- Taxi Trip Time Winners' Interview: 3rd place, BlueTaxi
Taxi Trip Time Winners' Interview: 3rd place, BlueTaxi This spring, Kaggle hosted two competitions w ...
- spoj 78
数学 组合 隔板法 #include <iostream> #include <cstring> #include <cstdio> #include <s ...
- jsp的常用指令有哪些(编译指令/动作指令整理)
jsp的常用指令有哪些(编译指令/动作指令整理) JSP动作指令 JSP - JSP中的脚本.指令.动作和注释
- 【C++之STL】理解容器(ing)
“容器可容纳一些数据的模板类” “容器是包容其他对象的对象” 两种类型:顺序容器.关联容器 顺序容器 关联容器 访问成员 顺序访问和随机访问 经过优化关键键值访问 ...
- Ubuntu环境下手动配置ElasticSearch0.90.5
1 下载elasticsearch-0.90.5 2 修改配置(可选) 修改内存:(可选) bin/elasticsearch.in.sh中: ES_MIN_MEM ES_MAX_MEM 修改搜索引擎 ...
- My_Plan
离清北夏令营不远了,今天时间也不太多了,貌似并不够我写一道题 所以就先挖个坑制定个计划啦 从5.10到5.20 先制定十天的计划吧 1.考试题的每道题目都要改出来并做总结 2.数位DP练习(十道+总结 ...
- lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点
题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...
- http怎样保持有状态?
HTTP协议的特点 HTTP协议是无状态的协议,发送的请求不记录用户的状态,不记录用户的信息.就相当于它被访问了2次,不知道是哪两人访问的,或者是一个人访问两次. 正是因为HTTP协议的这一特点,用户 ...