博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
"Ray, Pass me the dishes!" UVALive - 3938 (线段树)
阅读量:6145 次
发布时间:2019-06-21

本文共 1337 字,大约阅读时间需要 4 分钟。

题意:给出询问a,b求出a,b区段内的最大子串

思路:

不难想象,一个区段的最大子串要么为其两个子区段的最大子串,要么第一个子串的最大后缀加上第二个子串的最大前缀。因此我们需要维护每一个串的最大前缀,最大后缀,以及最大子串。但是同时需要考虑到,子串的情况会和坐标有关,因此我们不选择直接维护子串的值,而是选择维护串的起始位置和终止位置,再通过前缀和相减来得到串的值的大小。

AC代码:

#include
#include
#include
#define lson(x) x<<1#define rson(x) x<<1|1using namespace std;const int size=500005;typedef pair
Interval;typedef pair
pii;typedef long long LL;LL Sum[size];struct Tree{ int l,r; pii max_sub; int max_perfix; int max_suffix;}tree[size<<2];inline int md(int l,int r){return (l+r)>>1;}inline LL sum(pii x){ return Sum[x.second]-Sum[x.first-1];}pii Inter_compare(pii a,pii b){ LL x=sum(a),y=sum(b); if(x!=y) return x>y?a:b; return a
=tree[k].r) { return tree[k]; } int mid=md(tree[k].l,tree[k].r); if(r<=mid) return query(lson(k),l,r); if(l>mid)return query(rson(k),l,r);//l不能加等于号 return combine(query(lson(k),l,r),query(rson(k),l,r));}int main(){ int n,m; int cnt=0; while(~scanf("%d%d",&n,&m)) { memset(Sum,0,sizeof(Sum)); for(int i=1;i<=n;i++) { int temp; scanf("%d",&temp); Sum[i]=Sum[i-1]+temp; } build(1,1,n); printf("Case %d:\n",++cnt); while(m--) { int l,r; scanf("%d%d",&l,&r); pii ans=query(1,l,r).max_sub; printf("%d %d\n",ans.first,ans.second); } }}

 

转载于:https://www.cnblogs.com/fly-white/p/10092731.html

你可能感兴趣的文章
Office WORD如何取消开始工作右侧栏
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
直播视频流技术名词
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>