BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值。现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大
想了很久,甚至神标题,奔说是水的问题……我醉了
枚举左点 对于每个请求留点右键点 树维护最大值
考虑每一个数对答案的贡献 记录一个数组next表示这个位置上的点下一次出现的位置 那么这个点贡献的作用范围就是[i,next[i]-1] 假设没有next就是[i,n]
于是我们先把全部第一个出现的数对答案的贡献增加线段树 然后从左到右扫一遍 每次统计完答案之后把i对答案的贡献去除 然后把next[i]对答案的贡献增加线段树
这常数我也是醉了……速度倒数第二啥的 正解一定不是这种……
此外POI2015是我穿错年代了?
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1001001
using namespace std;
struct Segtree{Segtree *ls,*rs;long long num,mark;void Build_Tree(int x,int y);void Update(int x,int y,int l,int r,long long val);long long Get_Ans(int x,int y,int l,int r);
}*root=new Segtree,mempool[M<<1],*C=mempool;
int n,m;
int a[M],w[M],next[M],last[M];
bool v[M];
long long ans;
void Segtree :: Build_Tree(int x,int y)
{int mid=x+y>>1;num=0;mark=0;if(x==y) return ;ls=C++;rs=C++;ls->Build_Tree(x,mid);rs->Build_Tree(mid+1,y);
}
void Segtree :: Update(int x,int y,int l,int r,long long val)
{int mid=x+y>>1;if(x==l&&y==r){num+=val;mark+=val;return ;}if(mark){ls->num+=mark;rs->num+=mark;ls->mark+=mark;rs->mark+=mark;mark=0;}if(r<=mid) ls->Update(x,mid,l,r,val);else if(l>mid) rs->Update(mid+1,y,l,r,val);else ls->Update(x,mid,l,mid,val),rs->Update(mid+1,y,mid+1,r,val);num=max(ls->num,rs->num);
}
long long Segtree :: Get_Ans(int x,int y,int l,int r)
{int mid=x+y>>1;if(x==l&&y==r)return num;if(mark){ls->num+=mark;rs->num+=mark;ls->mark+=mark;rs->mark+=mark;mark=0;}if(r<=mid) return ls->Get_Ans(x,mid,l,r);if(l> mid) return rs->Get_Ans(mid+1,y,l,r);return max( ls->Get_Ans(x,mid,l,mid) , rs->Get_Ans(mid+1,y,mid+1,r) );
}
int main()
{int i;cin>>n>>m;for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=m;i++)scanf("%d",&w[i]);for(i=1;i<=n;i++){if(last[a[i]])next[last[a[i]]]=i;elsev[i]=1;last[a[i]]=i;}root->Build_Tree(1,n);for(i=1;i<=n;i++)if(v[i])root->Update(1,n,i,next[i]?next[i]-1:n,w[a[i]]);for(i=1;i<=n;i++){ans=max(ans, root->Get_Ans(1,n,i,n) );root->Update(1,n,i,next[i]?next[i]-1:n,-w[a[i]]);if(next[i])root->Update(1,n,next[i],next[next[i]]?next[next[i]]-1:n,w[a[next[i]]]);}cout<<ans<<endl;
}
转载于:https://www.cnblogs.com/yxwkf/p/4605178.html
BZOJ 3747 POI2015 Kinoman 段树相关推荐
- bzoj 3747: [POI2015]Kinoman
(颓废扒题解2333) 给颜色的下一个出现位置记录一下,然后每次只有第一个颜色的出现位置和下一个出现位置之间会产生这种颜色的价值,所以用线段树维护一下区间. 那么现在就只需要把整个的数列从1-> ...
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MB Submit: 830 Solved: 338 Description ...
- 【UVA】11992 - Fast Matrix Operations(段树模板)
主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...
- C++Persistent segment tree持久段树的实现算法(附完整源码)
C++Persistent segment tree持久段树的实现算法 C++Persistent segment tree持久段树的实现算法完整源码(定义,实现,main函数测试) C++Persi ...
- C语言实现段树segment tree(附完整源码)
C语言实现段树segment tree 段树结构体定义 实现以下6个接口 完整实现和main测试源码 段树结构体定义 typedef struct segment_tree {void *root; ...
- 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)...
M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...
- 树的结构 数据结构_段树| 数据结构
树的结构 数据结构 What is a segment tree? 什么是段树? A segment tree is a full binary tree where each node repres ...
- b树范围查找_使用段树查找最大查询范围
b树范围查找 The following question/problem is asked on http://www.spoj.com/problems/GSS1/ 在http://www.spo ...
- BZOJ 1502:月下柠檬树
BZOJ 1502:月下柠檬树 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题目大意:给出一棵由圆台构成的树以及一个平行光源,问 ...
最新文章
- 你应该知道的 volatile 关键字
- google浏览器javascript没反应_浏览器之导航这件小事
- c语言解析json数据
- 【OCR技术系列之八】端到端不定长文本识别CRNN代码实现
- shell脚本执行oracle删除表,shell脚本操作oracle删除表空间、创建表空间、删除用户...
- 32张图带你彻底搞懂事务和锁!
- 竟然被awk生成的随机数给整蒙了,也谈随机数生成种子
- TensorFlow官方教程翻译:导入数据
- Asset Store 下载的package存在什么地方?
- centos中安装配置nginx完成之后主机无法访问
- shell应用之简单计算器
- eclipse中文教程
- maria安装包mysql_mariadb安装
- 苹果手机连wifi很慢-解决方案
- C盘空间不足,UE4的deriveddatacache目录位置修改
- XL4001 典型应用电路
- Kubernetes CSI
- 地平线 J2J3了解笔记
- python中tan怎么表示_Python numpy.tan()用法及代码示例
- STM32F103C8T6+ESP8266WIFI+DHT11模块连接巴法云
热门文章
- ue4移动到一定距离_UE4移动组件详解(一)——移动框架与实现原理
- 基于matlab移位寄存器,基于Matlab产生m序列(DOC X页).doc
- bootstrap file input java,BootStrap-fileinput初识
- 企业服务器上病房床号修改,关于医院病房安放陪护床(共享陪护床)申请报告...
- python找字符串中特殊字符_python – 在字符串中查找特殊符号
- 为了在简历上写掌握【Java中IO流】,做了该篇总结
- sstream和strstream以及fstream
- grid.getSelectionModel的所有操作
- Netty如何解决粘包拆包?(二)
- centos7当中的systemd及systemctl(节选)