P3772看电影(线段树+链表)
来源:互联网 发布:域名注册ip查询 编辑:程序博客网 时间:2024/06/06 02:41
问题描述
共有m部电影,编号为1~m,第i部电影的好看值为w[i]。
在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部。
你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。
输入格式
第一行两个整数n,m(1<=m<=n<=1000000)。
第二行包含n个整数f[1],f[2],…,fn。
第三行包含m个整数w[1],w[2],…,wm。
输出格式
输出观看且仅观看过一次的电影的好看值的总和的最大值。
样例输入
9 4
2 3 1 1 4 1 2 4 1
5 3 6 6
样例输出
15
提示
样例解释:
观看第2,3,4,5,6,7天内放映的电影,其中看且仅看过一次的电影的编号为2,3,4。
题解
依次讨论点,考虑其影响范围,为Next[i]+1~i,将此区间加上其观赏值,再将Next[Next[i]]+1~Next[i]减去观赏值,在更新此时的最大值,便是结果。
此操作便等价于讨论所有区间的情况!
代码
#include<stdio.h>#include<algorithm>#include<iostream>#include<cmath>#include<cstring>#include<queue>using namespace std;#define inf 1e9#define pr cout<<#define maxn 1000005struct node{ int a,b,maxx,lazy;};node tree[maxn*8];void bt(int p,int x,int y){ int mid=x+y>>1; tree[p].a=x;tree[p].b=y; if(x==y) return; bt(p<<1,x,mid); bt(p<<1|1,mid+1,y);}void pd(int k){ tree[k<<1].maxx+=tree[k].lazy; tree[k<<1].lazy+=tree[k].lazy; tree[k<<1|1].maxx+=tree[k].lazy; tree[k<<1|1].lazy+=tree[k].lazy; tree[k].lazy=0;}void add(int p,int x,int y,int t){ if(tree[p].lazy) pd(p); if(tree[p].a>=x&&tree[p].b<=y) { tree[p].lazy+=t; tree[p].maxx+=t; return; } int mid=tree[p].a+tree[p].b>>1; if(mid>=x) add(p<<1,x,y,t); if(mid<y) add(p<<1|1,x,y,t); tree[p].maxx=max(tree[p<<1].maxx,tree[p<<1|1].maxx);}int ask(int p,int x,int y){ if(tree[p].lazy) pd(p); if(tree[p].a>=x&&tree[p].b<=y){ return tree[p].maxx; } int lmax=0,rmax=0; int mid=tree[p].a+tree[p].b>>1; if(mid>=x) lmax=ask(p<<1,x,y); if(mid<y) rmax=ask(p<<1|1,x,y); return max(lmax,rmax);}int n,m;int a[maxn],v[maxn];int Next[maxn],Last[maxn],cnt;void insert(int x,int i){ Next[i]=Last[x]; Last[x]=i;}int main(){ int i,j; scanf("%d%d",&n,&m); bt(1,1,n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); insert(a[i],i); } for(i=1;i<=m;i++) { scanf("%d",&v[i]); } int maxx=0; for(i=1;i<=n;i++) { add(1,Next[i]+1,i,v[a[i]]); maxx=max(maxx,ask(1,Next[i]+1,i)); if(Next[i]){ add(1,Next[Next[i]]+1,Next[i],-v[a[i]]); } } cout<<maxx;}
阅读全文
0 0
- P3772看电影(线段树+链表)
- 【题】【线段数】NKOJ3772 看电影
- 看电影
- 看电影
- 看电影
- 看电影
- 看电影
- 我看电影阿凡达(Avatar)
- 看电影学英语(二)
- 外观模式(facade pattern)(看电影)
- 线段树(数组、链表)
- ubuntu 字符界面下看电影(打开framebuffer)
- 组织看电影
- 小时候看电影
- 明天看电影
- 看电影有感
- 看电影(movie)
- 读书看电影
- 百度地图在android中的使用
- jQuery对DOM元素的向下遍历
- 学习网站
- spring框架详解(三)--AOP
- struts2之多个文件上传
- P3772看电影(线段树+链表)
- nifi探索之处理器简介(2)
- #Android学习# 三种Notification的学习
- SVG学习链接
- 【opencv】显示中文汉字
- win10下安装双jdk并自由切换
- 一个Android Socket的例子---自己加了点东西
- UFT自动化-参数化-导到excel提升
- 分享一个学习javaweb服务器的网站 ssm框架