Bzoj3747 [POI1015] Kinoman
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。
Bzoj权限题。只过了样例,尚未评测。
题面搬运自神犇hzwer博客。
线段树维护区间最值,枚举区间起点,不断把起点前面的电影贡献值删去,再把当前电影“从当前直到它下次出现之前”的区间都新加上当前电影的贡献值,不断更新最大答案。
刚开始按区间加法写的,所以变量用了sum,写到一半发现只搞区间最大值就好,然而懒得改变量名了……
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define LL long long
using namespace std;
const int mxn=;
int n,m;
int f[mxn],w[mxn];
int next[mxn],last[mxn];
int cnt[mxn];
struct node{
LL sum;//变量名是sum,实际是存区间最大值
LL tag;
}t[mxn<<];
void Build(int l,int r,int rt){//init //实际并没有用到
if(l==r){
t[rt].sum=t[rt].tag=;
return;
}
int mid=(l+r)>>;
Build(ls);Build(rs);
return;
}
void pushdown(int l,int r,int rt){
if(l==r)return;
if(t[rt].tag){
int mid=(l+r)>>;
t[rt<<].tag+=t[rt].tag;
t[rt<<|].tag+=t[rt].tag;
t[rt<<].sum+=t[rt].tag;
t[rt<<|].sum+=t[rt].tag;
t[rt].tag=;
}
}
void add(int L,int R,int v,int l,int r,int rt){
if(t[rt].tag)pushdown(l,r,rt);
if(L<=l && r<=R){
t[rt].tag+=v;
t[rt].sum+=v;
return;
}
int mid=(l+r)>>;
if(L<=mid)add(L,R,v,ls);
if(R>mid)add(L,R,v,rs);
t[rt].sum=max(t[rt<<].sum,t[rt<<|].sum);
return;
}
void read(){
scanf("%d%d",&n,&m);
int i,j;
for(i=;i<=n;i++)scanf("%d",&f[i]);
for(i=;i<=m;i++)scanf("%d",&w[i]);
return;
}
int main(){
read();
int i,j;
for(i=n;i;i--){
next[i]=last[f[i]];
last[f[i]]=i;
}
for(i=;i<=m;i++){
if(last[i]){
if(!next[last[i]])add(last[i],n,w[i],,n,);
else add(last[i],next[last[i]]-,w[i],,n,);
}
}
LL ans=;
for(i=;i<=n;i++){
ans=max(ans,t[].sum);
int tmp=next[i];
if(tmp){
add(i,tmp-,-w[f[i]],,n,);
if(next[tmp])add(tmp,next[tmp]-,w[f[i]],,n,);
else add(tmp,n,w[f[i]],,n,);//如果之后没有相同电影了,从next[i]到n的区间都加值
}
else add(i,n,-w[f[i]],,n,);//删除上一个区间的值
}
printf("%lld",ans);
return ;
}
Bzoj3747 [POI1015] Kinoman的更多相关文章
- BZOJ3747 POI2015 Kinoman 【线段树】*
BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...
- 【BZOJ-3747】Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 715 Solved: 294[Submit][Stat ...
- 【bzoj3747】Kinoman[POI2015](线段树)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3747 对于这种题,考虑固定区间的右端点为r,设区间左端点为l能取得的好看值总和为a[l] ...
- BZOJ3747: [POI2015]Kinoman
传送门 线段树经典运用. 设$last_i$表示上一个与$i$相同的类型.然后每次更新$[last[i]+1,i]$和$[last[last[i]]+1,last[i]]$的答案就行了. //BZOJ ...
- 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)
传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...
- BZOJ3747:[POI2015]Kinoman(线段树)
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- 【线段树】bzoj3747 [POI2015]Kinoman
题解:http://www.cnblogs.com/zyfzyf/p/4105184.html 一.下传标记写法 #include<cstdio> #include<algorith ...
- POI2015题解
POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...
- 【BZOJ3747】[POI2015]Kinoman 线段树
[BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...
随机推荐
- css实现页面文字不换行、自动换行、强制换行
强制不换行 div{ white-space:nowrap; } 自动换行 div{ word-wrap: break-word; word-break: normal; } 强制英文单词断行 div ...
- vue 报错unknown custom element解决方法
原因: 没有引入相关组件导致的 解决办法: 如果组件是按需引入的必须引入你当前用到的组件,否则会报错
- 编译-LAMP基于fastcgi
前言 最近没更新新篇幅了,今天就来点干活,过多的也不说了下面着手干!干!干! 准备环境 centos7.5 apr-1.6.3.tar.gz apr-util-1.6.1.tar.gz h ...
- python入门:输出1-100之内的所有奇数和偶数(自写)
#!/urs/bin/env python # -*- coding:utf-8 -*- #输出1-100之内的所有奇数和偶数(自写) """ 给x赋值等于1,wehil ...
- 在VUE中,关于CKEditor使用
官方文档 语言配置 代码如下 ClassicEditor .create( document.querySelector( '#editor' ), { language: 'de' // 配置语言 ...
- Golang map并发 读写锁
golang并发 一:只有写操作 var ( count int l = sync.Mutex{} m = make(map[int]int) ) //全局变量并发写 导致计数错误 func vari ...
- python3.6 取整除法
python3.6 中取整除法运算逻辑如下: d 非零,那么商 q 满足这样的关系: a = qd + r ,且0 ≤ r n1=7//3 #7 = 3*2 +1 n2=-6.1//3 #-7 = 3 ...
- 字符串:HDU5371-Hotaru's problem(manacher 的应用)
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pr ...
- joyoi tyvj1313 [NOIP2010初赛]烽火传递
单调队列优化dp #include <iostream> #include <cstdio> using namespace std; int dp[1000005], n, ...
- 用PHP写的一个简单的分页类 2.0版
<?php /* 分页类 用于实现对多条数据分页显示 version:2.0 //基于1.0 数据库查询用mysqli实现 author:Knight E-Mail:S.Knight.Work@ ...