枚举左区间线段树维护最大值

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define mod 999911659 //2 3 4679 35617
#define N 5000051
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
long long mx[N],tag[N],ans;
int p[N/5],nxt[N/5],n,m,w[N/5],f[N/5];
void push_down(int x)
{
if(tag[x])
{
int l=x<<1,r=x<<1|1;
tag[l]+=tag[x];
tag[r]+=tag[x];
mx[l]+=tag[x];
mx[r]+=tag[x];
tag[x]=0;
} }
void change(int x,int L,int R,int l,int r,int v)
{
if(l==L&&R==r)
{
mx[x]+=v;
tag[x]+=v;
return;
}
push_down(x);
int mid=L+R>>1;
if(r<=mid)change(x<<1,L,mid,l,r,v);
else if(l>mid)change(x<<1|1,mid+1,R,l,r,v);
else change(x<<1,L,mid,l,mid,v),change(x<<1|1,mid+1,R,mid+1,r,v);
mx[x]=max(mx[x<<1],mx[x<<1|1]);
}
int main()
{
n=sc();m=sc();
for(int i=1;i<=n;i++)f[i]=sc();
for(int i=1;i<=m;i++)w[i]=sc();
for(int i=n;i>=1;i--)nxt[i]=p[f[i]],p[f[i]]=i;
for(int i=1;i<=m;i++)
{
if(!p[i])continue;
int y=nxt[p[i]]? nxt[p[i]]:n+1;
change(1,1,n+1,p[i],y-1,w[i]);
}
for(int i=1;i<=n;i++)
{
ans=max(ans,mx[1]);
int y=nxt[i]?nxt[i]:n+1;
change(1,1,n+1,i,y-1,-w[f[i]]);
if(y!=n+1)
{
int t=nxt[y]?nxt[y]:n+1;
change(1,1,n+1,y,t-1,w[f[i]]);
}
}
cout<<ans;
}

3747: [POI2015]Kinoman|线段树的更多相关文章

  1. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

  2. 【BZOJ3747】[POI2015]Kinoman 线段树

    [BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...

  3. BZOJ 3747 POI2015 Kinoman 段树

    标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...

  4. 【bzoj3747】[POI2015]Kinoman 线段树区间合并

    题目描述 一个长度为n的序列,每个数为1~m之一.求一段连续子序列,使得其中之出现过一次的数对应的价值之和最大. 输入 第一行两个整数n,m(1<=m<=n<=1000000). 第 ...

  5. 【bzoj3747】[POI2015]Kinoman - 线段树(经典)

    Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...

  6. BZOJ3747:[POI2015]Kinoman(线段树)

    Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...

  7. 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 830  Solved: 338 Description ...

  8. 【BZOJ-3747】Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 715  Solved: 294[Submit][Stat ...

  9. BZOJ_3747_[POI2015]Kinoman_线段树

    BZOJ_3747_[POI2015]Kinoman_线段树 Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放 ...

随机推荐

  1. scripts

    Shell Script:================================================================ 示例1:[root@server0 ~]# ...

  2. importlib模块和split的结合使用

    1.给定一个文件结构,在main.py中于运用importlib 导入a.py运行其中的show()方法 ├── clazz │ ├── __init__.py │ ├── a.py │ └── b. ...

  3. Leetcode 525.连续数组

    连续数组 给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组. 示例 1: 输入: [0,1] 输出: 2 说明: [0, 1] 是具有相同数量0和1的最长连续子数组. 示例 2: ...

  4. 利用python爬取58同城简历数据

    利用python爬取58同城简历数据 利用python爬取58同城简历数据 最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用pyth ...

  5. easyui可封装的各种方法

    组件:datagrid 获取选中行(单行) var row = $('#tt').datagrid('getSelected');    if (row){        alert('Item ID ...

  6. poj 3278 catch that cow BFS(基础水)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 61826   Accepted: 19329 ...

  7. redhat linux 7.4关闭透明大页

    每一步: 在GRUB_CMDLINE_LINUX加入选项 transparent_hugepage=never echo 'GRUB_CMDLINE_LINUX="transparent_h ...

  8. Python 字典值相加

    #字典值相加 def union_dic(*objs): _keys = set(sum([obj.keys() for obj in objs],[])) _total = {} for _key ...

  9. 文本文件txt生成excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  10. 现代互联网的TCP拥塞控制(CC)算法评谈

    动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...