当前位置:网站首页>BZOJ 3747 POI2015 Kinoman 段树
BZOJ 3747 POI2015 Kinoman 段树
2022-07-05 19:53:00 【全栈程序员站长】
大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。
标题效果:有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;
else
v[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://javaforall.cn/117735.html原文链接:https://javaforall.cn
边栏推荐
- What is the core value of testing?
- 司空见惯 - 英雄扫雷鼠
- openh264解码数据流向分析
- [AI framework basic technology] automatic derivation mechanism (autograd)
- [hard core dry goods] which company is better in data analysis? Choose pandas or SQL
- 浅浅的谈一下ThreadLocalInsecureRandom
- CADD课程学习(7)-- 模拟靶点和小分子相互作用 (半柔性对接 AutoDock)
- Go language | 03 array, pointer, slice usage
- Thread pool parameters and reasonable settings
- 【obs】QString的UTF-8中文转换到blog打印 UTF-8 char*
猜你喜欢
大厂面试必备技能,2022Android不死我不倒
Build your own website (16)
Database logic processing function
MMO project learning 1: preheating
深度学习 卷积神经网络(CNN)基础
That's awesome. It's enough to read this article
Fundamentals of deep learning convolutional neural network (CNN)
Apprentissage du projet MMO I: préchauffage
PHP uses ueditor to upload pictures and add watermarks
Millimeter wave radar human body sensor, intelligent perception of static presence, human presence detection application
随机推荐
MMO項目學習一:預熱
The difference between ID selector and class selector
Xaas trap: all things serve (possible) is not what it really needs
[AI framework basic technology] automatic derivation mechanism (autograd)
多分支结构
C#应用程序界面开发基础——窗体控制(5)——分组类控件
深度学习 卷积神经网络(CNN)基础
浮动元素与父级、兄弟盒子的关系
Recommended collection, my Tencent Android interview experience sharing
Thread pool parameters and reasonable settings
测试的核心价值到底是什么?
安卓面试宝典,2022Android面试笔试总结
Analysis of openh264 decoded data flow
Debezium series: parsing the default value character set
【obs】QString的UTF-8中文转换到blog打印 UTF-8 char*
Add data to excel small and medium-sized cases through poi
Go language | 03 array, pointer, slice usage
Gstreamer中的task
安信证券在网上开户安全吗?
【obs】libobs-winrt :CreateDispatcherQueueController