BZOJ_3747_[POI2015]Kinoman_线段树
BZOJ_3747_[POI2015]Kinoman_线段树
Description
Input
Output
Sample Input
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。
预处理出来第$i$天下一次播放$f[i]$的日期$nxt[i]$,类似这道题http://www.cnblogs.com/suika/p/8890570.html
先求出左端点为$1$的情况,即出现第一次$+1$,第二次$-1$.
然后考虑删除掉$i$这个位置对答案的贡献,在$i+1\thicksim nxt[i]$的位置上减一,在$nxt[i]\thicksim nxt[nxt[i]]-1$的位置上加一
每次求出$i\thicksim n$的最大值,可以用线段树维护。
代码:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- #define N 1000050
- #define ls p<<1
- #define rs p<<1|1
- typedef long long ll;
- char nc() {
- static char buf[100000],*p1,*p2;
- return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
- }
- inline int rd() {
- register int x=0;
- register char s=nc();
- while(s<'0'||s>'9')s=nc();
- while(s>='0'&&s<='9')x=(x<<3)+(x<<1)+s-'0',s=nc();
- return x;
- }
- ll t[N<<2],add[N<<2];
- int f[N],w[N],nxt[N],n,m,now[N];
- void pushdown(int p) {
- ll d;
- if(d=add[p]) {
- add[ls]+=d; add[rs]+=d;
- t[ls]+=d; t[rs]+=d;
- add[p]=0;
- }
- }
- /*ll qmx(int l,int r,int x,int y,int p) {
- if(x<=l&&y>=r) return t[p];
- int mid=(l+r)>>11;
- ll re=0;
- pushdown(p);
- if(x<=mid) re=max(re,qmx(l,mid,x,y,ls));
- if(y>mid) re=max(re,qmx(mid+1,r,x,y,rs));
- return re;
- }*/
- void update(int l,int r,int x,int y,ll v,int p) {
- if(x<=l&&y>=r) {
- t[p]+=v; add[p]+=v;
- return ;
- }
- pushdown(p);
- int mid=(l+r)>>1;
- if(x<=mid) update(l,mid,x,y,v,ls);
- if(y>mid) update(mid+1,r,x,y,v,rs);
- t[p]=max(t[ls],t[rs]);
- }
- int main() {
- n=rd(); m=rd();
- register int i;
- for(i=1;i<=n;i++) f[i]=rd();
- for(i=1;i<=m;i++) w[i]=rd();
- for(i=n;i;i--) nxt[i]=now[f[i]],now[f[i]]=i;
- for(i=1;i<=m;i++) {
- if(now[i]) {
- if(!nxt[now[i]]) update(1,n,now[i],n,w[i],1);
- else update(1,n,now[i],nxt[now[i]]-1,w[i],1);
- }
- }
- ll ans=0;
- for(i=1;i<=n;i++) {
- ans=max(ans,t[1]);
- if(nxt[i]) {
- update(1,n,i,nxt[i]-1,-w[f[i]],1);
- if(nxt[nxt[i]]) update(1,n,nxt[i],nxt[nxt[i]]-1,w[f[i]],1);
- else update(1,n,nxt[i],n,w[f[i]],1);
- }else update(1,n,i,n,-w[f[i]],1);
- }
- printf("%lld\n",ans);
- }
BZOJ_3747_[POI2015]Kinoman_线段树的更多相关文章
- [bzoj3747][POI2015]Kinoman_线段树
Kinoman bzoj-3747 POI-2015 题目大意:有m部电影,第i部电影的好看值为w[i].现在放了n天电影,请你选择一段区间l~r使得l到r之间的好看值总和最大.特别地,如果同一种电影 ...
- BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序
BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
- 【BZOJ3747】[POI2015]Kinoman 线段树
[BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- 【bzoj3747】Kinoman[POI2015](线段树)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3747 对于这种题,考虑固定区间的右端点为r,设区间左端点为l能取得的好看值总和为a[l] ...
- 【bzoj3747】[POI2015]Kinoman 线段树区间合并
题目描述 一个长度为n的序列,每个数为1~m之一.求一段连续子序列,使得其中之出现过一次的数对应的价值之和最大. 输入 第一行两个整数n,m(1<=m<=n<=1000000). 第 ...
- 3747: [POI2015]Kinoman|线段树
枚举左区间线段树维护最大值 #include<algorithm> #include<iostream> #include<cstdlib> #include< ...
- 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序
题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...
随机推荐
- OC实现带弹跳动画按钮的界面控制器view
很多应用都有带弹跳动画发布界面,这里用一个 UIViewController 实现这种效果,外界只要 modal出不带动画这个控制器就可以实现 #import "BSPublishVC.h& ...
- 大数据批量导入,解决办法,实践从定时从 sqlserver 批量同步数据到 mySql
c#代码,批量导入数据代码 public class MySql_Target : ZFCommon.DataAccesser.Base.DABase { public MySql_Target() ...
- webpack 4.x 遇到的错误
由于之前重装电脑,很多之前的小Demo 现在都跑不起来.特别是webpack一直在报错. webpack 安装node 全局安装webpack,webpack-cli(一定要全局安装) 项目初始化 w ...
- iframe实现局部刷新和回调(转)
今天做项目遇到一个问题.就是提交表单的时候,要在后台验证用户名是否存在和验证码是否正确. 当验证码或者用户名存在的时候.在后台弹窗提示.可页面原本file里面符合要求的值刷新没了.用户体验不好.因为用 ...
- access窗体主体居中
Private Sub Form_Load()DoCmd.Echo False Dim x, y As IntegerDoCmd.Maximizex = Me.WindowWidthy = Me.Wi ...
- redis分布式锁实践
分布式锁在多实例部署,分布式系统中经常会使用到,这是因为基于jvm的锁无法满足多实例中锁的需求,本篇将讲下redis如何通过Lua脚本实现分布式锁,不同于网上的redission,完全是手动实现的 我 ...
- Day13 CSS的与应用
老师博客:http://www.cnblogs.com/yuanchenqi/articles/6856399.html 1,CSS选择器的应用: CSS规则有两个主要部分构成:选择器,以及一条或多条 ...
- 如何使你的Ajax应用内容可让搜索引擎爬行
This document outlines the steps that are necessary in order to make your AJAX application crawlable ...
- 保证你能看懂的KMP字符串匹配算法
文章转载自一位大牛: 阮一峰原网址http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm ...
- vue.js中的全局组件和局部组件
组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三 ...