BZOJ 3747: [POI2015]Kinoman 【线段树】
Description
共有m部电影,编号为1~m,第i部电影的好看值为w[i]。
在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部。
你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。
Input
第一行两个整数n,m(1<=m<=n<=1000000)。
第二行包含n个整数f[1],f[2],…,f[n](1<=f[i]<=m)。
第三行包含m个整数w[1],w[2],…,w[m](1<=w[j]<=1000000)。
Output
输出观看且仅观看过一次的电影的好看值的总和的最大值。
Sample Input
9 4
2 3 1 1 4 1 2 4 1
5 3 6 6
Sample Output
15
样例解释:
观看第2,3,4,5,6,7天内放映的电影,其中看且仅看过一次的电影的编号为2,3,4。
思路:很神的题,一直在想O(n)的算法 然后没有结果 然后查了解题想了线段树的思路才想出来了
枚举区间左端点 然后线段树可以维护以这个点为左端点的最大值 然后就可以了
#include<cstdio>
#include<string.h>
#include<algorithm>
#define maxn 1000000
#define ll long long
using namespace std;
int a[maxn],w[maxn],nex[maxn],las[maxn];
ll lazy[maxn*4],tree[maxn*4];
void add(int node,int l,int r,int ql,int qr,ll w)
{
if(ql<=l&&r<=qr){lazy[node]+=w;return;}
int mid=(l+r)>>1;
if(lazy[node]!=0){
tree[node]+=lazy[node];lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];lazy[node]=0;
}
if(ql<=mid)add(node*2,l,mid,ql,qr,w);
if(qr>mid)add(node*2+1,mid+1,r,ql,qr,w);
tree[node]=max(tree[node*2]+lazy[node*2],tree[node*2+1]+lazy[node*2+1]);
}
ll query(int node,int l,int r,int ql,int qr){
ll ans=0;
if(lazy[node]!=0){
tree[node]+=lazy[node];lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];lazy[node]=0;
}
if(ql<=l&&r<=qr)return tree[node];int mid=(l+r)>>1;
if(ql<=mid)ans=max(ans,query(node*2,l,mid,ql,qr));
if(mid<qr)ans=max(ans,query(node*2+1,mid+1,r,ql,qr));
return ans;
}
int main(){
int n,m;ll ans=0;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[n-i+1]);for(int i=1;i<=m;i++)scanf("%d",&w[i]);
for(int i=1;i<=n;i++)nex[i]=las[a[i]],las[a[i]]=i;
for(int i=1;i<=n;i++){
add(1,1,n+1,nex[i]+1,i+1,w[a[i]]);
if(nex[i]!=0)add(1,1,n+1,nex[nex[i]]+1,nex[i]+1,-w[a[i]]);
ans=max(ans,query(1,1,n+1,1,i+1));
}
printf("%lld\n",ans);return 0;
}
BZOJ 3747: [POI2015]Kinoman 【线段树】的更多相关文章
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
- BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...
- 3747: [POI2015]Kinoman|线段树
枚举左区间线段树维护最大值 #include<algorithm> #include<iostream> #include<cstdlib> #include< ...
- 【BZOJ3747】[POI2015]Kinoman 线段树
[BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...
- BZOJ 3747 POI2015 Kinoman
因为上午没有准备够题目,结果发现写完这道题没题可写了QAQ 又因为这道题范围是100w,我写了发线段树,以为要T,上午就花了一个小时拼命卡常数 结果下午一交居然过了QAQ 我们考虑枚举L,求最大R使得 ...
- 【bzoj3747】[POI2015]Kinoman 线段树区间合并
题目描述 一个长度为n的序列,每个数为1~m之一.求一段连续子序列,使得其中之出现过一次的数对应的价值之和最大. 输入 第一行两个整数n,m(1<=m<=n<=1000000). 第 ...
- 【bzoj3747】[POI2015]Kinoman - 线段树(经典)
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- BZOJ3747:[POI2015]Kinoman(线段树)
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 830 Solved: 338 Description ...
随机推荐
- 基于H5+ API手机相册图片压缩上传
// 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照 ...
- c语言中的->代表什么意思
c语言中 ->符号是什么意思? 比如c=a->b a为结构体或联合体的指针,->表示调用其成员
- Easyui combobox如何默认选中第一项???
以下代码可以实现combobox默认选中第一项,在实际开发中我们可能会用到! // 处理combobox默认选中的问题 <input id="user_type" class ...
- 一样的Java,不一样的HDInsight大数据开发体验
大数据的热潮一直居高不下,每个人都在谈.你也许不知道,早些年这个领域可是有个非常「惹眼球」的段子: 1首先开始科普 什么是 HDInsight Azure HDInsight 是 Hortonwork ...
- 学习python报错处理
1.如图所示 原因是因为没有安装火狐浏览器驱动. 解决办法:1.下载火狐浏览器驱动https://github.com/mozilla/geckodriver/releases 2.安装包解压后安装在 ...
- HDU 5469 Antonidas (树形DP,暴力)
题意: 给一棵n节点的树图,每个点都是一个小写字母,要求找到两个点(a,b),从a->b的路径上形成了一个字符串为s.给出s,问是否存在这样的点对. 思路: 考虑一个点,要么从该点出发,要么在该 ...
- Git服务器和Git权限管理应用GITLAB安装方法
首先声明,本文使用的服务器是Centos 6.5,在其他版本的LINUX上运行不保证也是一样的效果. 顺便说下 来波点赞 来波收藏和推荐 有什么问题 我会一直关注评论的 想放一张最终图吧 其中主要涉 ...
- std::ios::sync_with_stdio和tie()——给cin加速
平时在Leetcode上刷题的时候,总能看到有一些题中最快的代码都有这样一段 static const auto init = []() { std::ios::sync_with_stdio(fal ...
- MySQL中常见的锁
一.按读写方式分类 1.读锁又称共享锁,读锁是共享的,读锁之间是互不阻塞. 2.写锁又称排他锁,写锁是排他的,写锁会阻塞其他读锁和写锁 二.按锁的粒度分类 1.表锁是MySQL中最基本的锁策略,该锁的 ...
- Xshell 配色方案 Ubuntu Solarized_Dark isayme
前言 最近在用Ubuntu,发现它的配色方案挺好看的,所以查了下有没有大神做过Xshell的Ubuntu配色方案. 一看,果然还是有大佬做了这个的. 三套配色配置如下: 1. Ubuntu的Solar ...