[POI2015]Kinoman
题目大意:
给你一个长度为n的数列f,f中共有m种不同的数,每种数都有一个权值w[i]。
你可以选定一个f中的区间,定义区间的权值为这一区间只出现一次的数的权值和。
问权值最大的区间的权值是多少?
思路:
对于f中的每一个位置i,找到下一个和它相同数字的位置next[i]。
从左到右枚举区间左端点,线段树维护选取每个右端点的最大值。
去除当前左端点对答案的影响时,只需要把i~next[i]-1这一段减去w[f[i]],然后把next[i]~next[next[i]]-1加上w[f[i]]即可。
#include<cstdio>
#include<cctype>
#include<algorithm>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=,M=;
int f[N],w[M],next[N],pos[M];
class SegmentTree {
#define _left <<1
#define _right <<1|1
private:
int64 max[N<<],tag[N<<];
void push_down(const int &p) {
tag[p _left]+=tag[p];
tag[p _right]+=tag[p];
max[p _left]+=tag[p];
max[p _right]+=tag[p];
tag[p]=;
}
void push_up(const int &p) {
max[p]=std::max(max[p _left],max[p _right]);
}
public:
void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const int &x) {
if(b==l&&e==r) {
tag[p]+=x;
max[p]+=x;
return;
}
push_down(p);
const int mid=(b+e)>>;
if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),x);
if(r>mid) modify(p _right,mid+,e,std::max(mid+,l),r,x);
push_up(p);
}
int64 query() const {
return max[];
}
#undef _left
#undef _right
};
SegmentTree t;
int main() {
const int n=getint(),m=getint();
for(register int i=;i<=n;i++) {
f[i]=getint();
}
for(register int i=;i<=m;i++) {
w[i]=getint();
pos[i]=n+;
}
for(register int i=n;i;i--) {
next[i]=pos[f[i]];
pos[f[i]]=i;
}
for(register int i=;i<=m;i++) {
t.modify(,,n,pos[i],next[pos[i]]-,w[i]);
}
int64 ans=;
for(register int i=;i<=n;i++) {
ans=std::max(ans,t.query());
t.modify(,,n,i,next[i]-,-w[f[i]]);
t.modify(,,n,next[i],next[next[i]]-,w[f[i]]);
}
printf("%lld\n",ans);
return ;
}
[POI2015]Kinoman的更多相关文章
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 830 Solved: 338 Description ...
- BZOJ3747 POI2015 Kinoman 【线段树】*
BZOJ3747 POI2015 Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[ ...
- 【BZOJ3747】[POI2015]Kinoman 线段树
[BZOJ3747][POI2015]Kinoman Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第 ...
- BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...
- BZOJ3747: [POI2015]Kinoman
传送门 线段树经典运用. 设$last_i$表示上一个与$i$相同的类型.然后每次更新$[last[i]+1,i]$和$[last[last[i]]+1,last[i]]$的答案就行了. //BZOJ ...
- BZOJ 3747 POI2015 Kinoman
因为上午没有准备够题目,结果发现写完这道题没题可写了QAQ 又因为这道题范围是100w,我写了发线段树,以为要T,上午就花了一个小时拼命卡常数 结果下午一交居然过了QAQ 我们考虑枚举L,求最大R使得 ...
- 【bzoj3747】[POI2015]Kinoman
题解: 水题 从左向右维护以每一个作为右端点的最大值 线段树维护 代码: #include <bits/stdc++.h> using namespace std; #define rin ...
- 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< ...
随机推荐
- (原)UE4 制作执行队列(Action Queue)
队列和树在游戏开发中是比较常见的数据结构,在一定范围能保证执行的顺序. 结合一些设计模式技巧,往往可以做一些神器. 如加载块chunk管理,任务系统(当然也可以使用行为树来做复杂的任务系统). ...
- FreeBSD NTP 简单使用
FreeBSD NTP 简单使用 来源 https://blog.csdn.net/stevexk/article/details/1349506 1.ntptrace xxx.xxx.xxx.xxx ...
- 在Ignite中使用k-最近邻(k-NN)分类算法
在本系列前面的文章中,简单介绍了一下Ignite的线性回归算法,下面会尝试另一个机器学习算法,即k-最近邻(k-NN)分类.该算法基于对象k个最近邻中最常见的类来对对象进行分类,可用于确定类成员的关系 ...
- 看了就学会之React redux入门示例
环境准备 为了方便,这里使用create-react-app搭建react环境 create-react-app mydemo 弹出配置 如果需要自定义react的配置,需要运行下面的命令把配置文件弹 ...
- [bzoj] 2453 维护数列 || 单点修改分块
原题 询问区间有种个颜色,单点修改某个位置. 修改次数<=1000 维护pre[i]为前一个与当前位置颜色一样的位置. 询问时以pre为关键字sort,lower_bound找pre<x的 ...
- node_module删除
https://segmentfault.com/q/1010000002972327 npm install rimraf -g rimraf node_modules
- poj 3648 Wedding 2-SAT问题入门题目
Description Up to thirty couples will attend a wedding feast, at which they will be seated on either ...
- centos 7 服务器网卡做bond
前期环境准备 [root@ /root] alibaba cloud#cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)[root@ ...
- 解方程(NOIP2014)Warning!(前方高能!!)
原题传送门 一看这不是水题嘛. 枚举+乱搞..特别容易.... 然后a[i]取值范围出现了 当当当当~:|a[i]|<=10^10000!!!!! 我去,这是什么鬼.. 高精度? 然后默默算了算 ...
- aiohttp/asyncio测试代理是否可用
#!/usr/bin/env python # encoding: utf-8 from proxyPool.db import RedisClient import asyncio import a ...