因为上午没有准备够题目,结果发现写完这道题没题可写了QAQ

又因为这道题范围是100w,我写了发线段树,以为要T,上午就花了一个小时拼命卡常数

结果下午一交居然过了QAQ

我们考虑枚举L,求最大R使得[L,R]是对于当前L最大权值的区间

考虑每个点的影响

如果从L向右他是第一个,那么他会对后面产生a[f[L]]的贡献

如果从L向右他是第二个,那么他会对后面产生-a[f[L]]的贡献

然后我们维护一棵线段树,每次查询最值并且进行更新即可

include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std; typedef long long LL;
const int maxn=1000010;
int n,m,x,y,v,tim;
int f[maxn];
int a[maxn];
int next[maxn],h[maxn];
LL mx[maxn<<2],add[maxn<<2];
LL ans=0,tot=0; inline void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=(num<<3)+(num<<1)+ch-'0',ch=getchar();
}
inline LL Max(LL a,LL b){return a>b?a:b;}
inline void push_down(int o){
int L=(o<<1),R=(L|1);
add[L]+=add[o];mx[L]+=add[o];
add[R]+=add[o];mx[R]+=add[o];
add[o]=0;
}
inline void modify(int o,int L,int R){
if(L>=x&&R<=y){
mx[o]+=v;add[o]+=v;
return;
}
if(add[o]!=0)push_down(o);
int mid=(L+R)>>1;
if(y<=mid)modify(o<<1,L,mid);
else if(x>mid)modify(o<<1|1,mid+1,R);
else modify(o<<1,L,mid),modify(o<<1|1,mid+1,R);
mx[o]=Max(mx[o<<1],mx[o<<1|1]);
}
inline LL ask(int o,int L,int R){
if(L>=x&&R<=y)return mx[o];
if(add[o]!=0)push_down(o);
int mid=(L+R)>>1;
if(y<=mid)return ask(o<<1,L,mid);
else if(x>mid)return ask(o<<1|1,mid+1,R);
else return Max(ask(o<<1,L,mid),ask(o<<1|1,mid+1,R));
}
int main(){
read(n);read(m);y=n;
for(int i=1;i<=n;++i)read(f[i]);
for(int i=1;i<=m;++i)read(a[i]);
for(int i=n;i>=1;--i){
next[i]=h[f[i]];
h[f[i]]=i;
}
for(int i=1;i<=m;++i){
if(h[i]){
x=h[i];v=a[i];
modify(1,1,n);
if(next[h[i]]){
x=next[h[i]];v=-a[i];
modify(1,1,n);
}
}
}
for(int L=1;L<=n;++L){
x=L;
ans=Max(ans,ask(1,1,n)-tot);
tot+=a[f[L]];
int n1=next[L],n2=next[n1];
if(n1){
x=n1;v=(a[f[L]]<<1);
modify(1,1,n);
}
if(n2){
x=n2;v=-a[f[L]];
modify(1,1,n);
}
}printf("%lld\n",ans);
return 0;
}

  

BZOJ 3747 POI2015 Kinoman的更多相关文章

  1. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

  2. BZOJ 3747 POI2015 Kinoman 段树

    标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...

  3. BZOJ 3747: [POI2015]Kinoman 【线段树】

    Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...

  4. 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 830  Solved: 338 Description ...

  5. 3747: [POI2015]Kinoman|线段树

    枚举左区间线段树维护最大值 #include<algorithm> #include<iostream> #include<cstdlib> #include< ...

  6. [BZOJ 3747] [POI 2015] Kinoman【线段树】

    Problem Link : BZOJ 3747 题解:ZYF-ZYF 神犇的题解 解题的大致思路是,当区间的右端点向右移动一格时,只有两个区间的左端点对应的答案发生了变化. 从 f[i] + 1 到 ...

  7. BZOJ3747: [POI2015]Kinoman

    传送门 线段树经典运用. 设$last_i$表示上一个与$i$相同的类型.然后每次更新$[last[i]+1,i]$和$[last[last[i]]+1,last[i]]$的答案就行了. //BZOJ ...

  8. BZOJ3747 POI2015 Kinoman 【线段树】*

    BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...

  9. 【BZOJ3747】[POI2015]Kinoman 线段树

    [BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...

随机推荐

  1. C#编写以管理员身份运行的程序

    using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...

  2. Linux 配置文件

    Linux系统的配置文件,在多用户.多任务环境中,配置文件控制用户权限.系统应用程序.守护进程.服务和其他管理任务.这些任务包括管理用户账号.分配磁盘配额.管理电子邮件和新闻组,以及配置内核参数.以下 ...

  3. poj 1077 Eight(A*)

    经典的八数码问题,用来练习各种搜索=_=.这题我用的A*做的,A*的主要思想就是在广搜的时候加了一个估价函数,用来评估此状态距离最终状态的大概距离.这样就可以省下很多状态不用搜索.对于每个状态设置一个 ...

  4. HTML5之图形变换

    - Transformations scale(0.5,0.5) 缩放 rotate(0.175) 旋转 translate(100,50) 位移 - 代码结构 context.scale(x, y) ...

  5. Centos 6.5 配置nginx服务

    官方网站:http://nginx.org最新版本:1.7.11官方文档:http://nginx.org/en/docs/ 一.安装NGINX查看当前centos版本: #cat /etc/redh ...

  6. SQL做日历

    DECLARE @DATE DATETIME SET @DATE=GETDATE() SELECT SUN -DAY(@DATE),@DATE))=@DATE THEN '*' ELSE '' END ...

  7. C 语言循环之break、continue

    在C 编程的过程中,我们很多时候都会用到循环,但有时需要中途跳出整个循环,或跳过某一次循环,这时就需要用到break或continue,关于二者的使用很多书籍和博文都有很相近的说明,此处不做任何讲解, ...

  8. 【原】Oracle拼接字段

    select FLIGHT_DATE, replace(wm_concat(FLIGHT_NO), ',', '*') FLIGHT_NO from T2001 group by FLIGHT_DAT ...

  9. ajaxFileUpload - Post file and data together

    jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' ...

  10. Linux下面对于VIM编辑器的代码折叠使用与screen

    VIM设置代码折叠 1. 折叠方式 可用选项 'foldmethod' 来设定折叠方式:set fdm=*****.有 6 种方法来选定折叠:          manual           手工 ...