Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman
Time Limit: 60 Sec Memory Limit: 128 MB
Submit: 553 Solved: 222
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2 3 1 1 4 1 2 4 1
5 3 6 6
Sample Output
样例解释:
观看第2,3,4,5,6,7天内放映的电影,其中看且仅看过一次的电影的编号为2,3,4。
HINT
Source
题解:
线段树。。。
用last[]记录每个位置的电影的上一个位置。
然后从头到尾依次遍历,每次把 (当前位置的电影的上一个位置,当前位置] 这个区间加上当前电影的好看值。然后把 (当前位置的电影的上上一个位置,当前位置的电影的上一个位置] 这个区间减去当前电影的好看值。每次求区间最大值即可。
这个用线段树维护即可。。。
#include<bits/stdc++.h>
using namespace std;
#define INF 1e9
#define LL long long
struct node
{
int left,right;
LL tag,mx;
}tree[];
int f[],w[],last[],pre[];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
void Build(int k,int l,int r)
{
tree[k].left=l;tree[k].right=r;tree[k].tag=;tree[k].mx=;
if(l==r)return;
int mid=(l+r)/;
Build(k*,l,mid);Build(k*+,mid+,r);
}
void Pushup(int k)
{
tree[k].mx=max(tree[k*].mx,tree[k*+].mx);
}
void Pushdown(int k)
{
if(tree[k].tag!=)
{
tree[k*].tag+=tree[k].tag;
tree[k*+].tag+=tree[k].tag;
tree[k*].mx+=tree[k].tag;
tree[k*+].mx+=tree[k].tag;
tree[k].tag=;
}
}
void Add(int k,int l,int r,int add)
{
if(l<=tree[k].left&&tree[k].right<=r)
{
tree[k].tag+=(LL)add;
tree[k].mx+=(LL)add;
return;
}
Pushdown(k);
int mid=(tree[k].left+tree[k].right)/;
if(r<=mid)Add(k*,l,r,add);
else if(l>mid)Add(k*+,l,r,add);
else {Add(k*,l,mid,add);Add(k*+,mid+,r,add);}
Pushup(k);
}
int main()
{
int n,m,i;
LL ans;
n=read();m=read();
for(i=;i<=n;i++)f[i]=read();
for(i=;i<=m;i++)w[i]=read();
memset(last,,sizeof(last));
memset(pre,,sizeof(pre));
for(i=;i<=n;i++)
{
last[i]=pre[f[i]];
pre[f[i]]=i;
}
Build(,,n);
ans=-INF;
for(i=;i<=n;i++)
{
Add(,last[i]+,i,w[f[i]]);
if(last[i]!=)
{
Add(,last[last[i]]+,last[i],-w[f[i]]);
}
ans=max(ans,tree[].mx);
}
printf("%lld",ans);
return ;
}
Bzoj 3747: [POI2015]Kinoman 线段树的更多相关文章
- BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...
- 3747: [POI2015]Kinoman|线段树
枚举左区间线段树维护最大值 #include<algorithm> #include<iostream> #include<cstdlib> #include< ...
- BZOJ 3747: [POI2015]Kinoman 【线段树】
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- 【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 ...
随机推荐
- (转 部分修改) IOS 手势密码(简单版)
// // Created by wangtouwang on 15/4/7. // Copyright (c) 2015年 wangtouwang. All rights reserved. // ...
- Python没有执行__init__
疑惑 提出问题 前天同事问我一个问题,为什么这个脚本中的没有调用A 的__init__.脚本如下: class A(object): def __init__(self, *args, **kwarg ...
- ConcurrentHashMap中的2的n次方幂上舍入方法
最近看JDK中的concurrentHashMap类的源码,其中有那么一个函数: /** * Returns a power of two table size for the given desir ...
- jquery禁用a标签,jquery禁用按钮click点击
jquery禁用a标签方法1 $(document).ready(function () { $("a").each(function () { var textValue = $ ...
- 你需要了解的z-index世界
本文摘自:飘零雾雨的博客 z-index的重要性 在我看来,z-index 给了我们日常工作中以极大的帮助,我们用它来定义元素的层叠级别(stack level).受益于它,你能做Popup, Dro ...
- 关于DPC和workitem的简单用法
这个随笔是记录我半个月左右的时间,从想法到查资料请教,以及到实践的成果. 我想实现的是,隔定时时间写文件,本以为调用写的函数就可以实现了,结果各种BSOD,IRQL_NOT_LESS_OR_EQUAL ...
- Mongoengine 使用笔记
1.直接将某个document对象导出对应的json数据. #models class Feed(Document): """ @summary: 所有订阅内容 &quo ...
- 版本控制工具git入门
版本控制工具的历史 不说了,放张图 两者的区别:集中式需要一个中心服务器放置最新的文件,需要联网操作.分布式可以再不联网的情况下操作,前提要拥有版本库 git安装 略 github注册 略 如何在g ...
- Xcode报错 - 1
1. xcode在真机调试的时候出现"The identity used to sign the executable is no longer valid" 解析: 是由于.pr ...
- CSS3 calc() 会计算的属性
calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,你可以使用calc()给元素的border.margin.pading.font-size和width等属性设置动态值. ...