3747: [POI2015]Kinoman

Time Limit: 60 Sec  Memory Limit: 128 MB
Submit: 830  Solved: 338

Description

共有m部电影,编号为1~m,第i部电影的好看值为w[i]。
在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部。
你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。

Input

第一行两个整数n,m(1<=m<=n<=1000000)。
第二行包含n个整数f[1],f[2],…,f[n](1<=f[i]<=m)。
第三行包含m个整数w[1],w[2],…,w[m](1<=w[j]<=1000000)。

Output

输出观看且仅观看过一次的电影的好看值的总和的最大值。

Sample Input

9 4
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。

HINT

Source

鸣谢Jcvb

【分析】

  这题应该挺经典。?

  就是先弄一个next,然后每次求以i结尾的最大值。

  i的值为w,next[i]的值为-w,更前面的next的值为0,线段树维护这个,(好像树状数组也是可以的),然后就好了。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 1000010
 8 #define LL long long
 9
10 // int mymax(int x,int y) {return x>y?x:y;}
11 LL mymax(LL x,LL y) {return x>y?x:y;}
12
13 int a[Maxn],w[Maxn],f[Maxn],ft[Maxn],nt[Maxn];
14
15 struct node
16 {
17     int l,r,lc,rc;
18     LL mx,lazy;
19 }tr[Maxn*2];
20
21 int tot=0;
22 int build(int l,int r)
23 {
24     int x=++tot;
25     tr[x].l=l;tr[x].r=r;
26     tr[x].lazy=tr[x].mx=0;
27     if(l<r)
28     {
29         int mid=(l+r)>>1;
30         tr[x].lc=build(l,mid);
31         tr[x].rc=build(mid+1,r);
32     }
33     else tr[x].lc=tr[x].rc=0;
34     return x;
35 }
36
37 void upd(int x)
38 {
39     tr[x].mx+=tr[x].lazy;
40     if(tr[x].lazy==0||tr[x].l==tr[x].r) {tr[x].lazy=0;return;}
41     int lc=tr[x].lc,rc=tr[x].rc;
42     tr[lc].lazy+=tr[x].lazy;
43     tr[rc].lazy+=tr[x].lazy;
44     tr[x].lazy=0;
45 }
46
47 void change(int x,int l,int r,int y)
48 {
49     if(tr[x].l==l&&tr[x].r==r)
50     {
51         tr[x].lazy+=y;
52         upd(x);
53         return;
54     }
55     upd(x);
56     int mid=(tr[x].l+tr[x].r)>>1;
57     if(r<=mid) change(tr[x].lc,l,r,y);
58     else if(l>mid) change(tr[x].rc,l,r,y);
59     else
60     {
61         change(tr[x].lc,l,mid,y);
62         change(tr[x].rc,mid+1,r,y);
63     }
64     upd(tr[x].lc);upd(tr[x].rc);
65     tr[x].mx=mymax(tr[tr[x].lc].mx,tr[tr[x].rc].mx);
66 }
67
68 int main()
69 {
70     int n,m;
71     scanf("%d%d",&n,&m);
72     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
73     for(int i=1;i<=m;i++) scanf("%d",&w[i]);
74     memset(ft,0,sizeof(ft));
75     for(int i=1;i<=n;i++)
76     {
77         nt[i]=ft[a[i]];
78         ft[a[i]]=i;
79     }
80     build(1,n);
81     LL maxx=0;
82     for(int i=1;i<=n;i++)
83     {
84         change(1,1,i,w[a[i]]);
85         if(nt[i]) change(1,1,nt[i],-2*w[a[i]]);
86         if(nt[nt[i]]) change(1,1,nt[nt[i]],w[a[i]]);
87         maxx=mymax(maxx,tr[1].mx);
88     }
89     printf("%lld\n",maxx);
90     return 0;
91 }

View Code

2017-04-08 10:54:12

转载于:https://www.cnblogs.com/Konjakmoyu/p/6681147.html

【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)相关推荐

  1. BZOJ 3747 POI2015 Kinoman 段树

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

  2. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  3. BZOJ 1901 Dynamic Rankings(线段树+treap)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1901 题意:给出一个数列,两种操作:(1)询问区间第K小值:(2)修改某个位置的值. 思 ...

  4. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

  5. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

  6. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  7. BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

    裸的线段树...因为数组开小了而一直RE..浪费了好多时间.. -------------------------------------------------------------------- ...

  8. [BZOJ 2957]楼房重建(线段树)

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  9. Bzoj 4422: [Cerc2015]Cow Confinement(线段树+扫描线)

    以下内容来自ShallWe's Blog 题目 题目链接 4422: [Cerc2015]Cow Confinement Description 一个10^6行10^6列的网格图,上面有一些牛.花和一 ...

  10. bzoj 2957: 楼房重建(线段树+递归)

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2778  Solved: 1314 [Submit][Status][Disc ...

最新文章

  1. React Native debug debugger
  2. 我如何看Spring5?
  3. 第41讲:Scrapy框架的介绍
  4. ORA-12519: TNS:no appropriate service handler found 解决
  5. 逃跑吧少年服务器临时维护中,逃跑吧少年—逃跑吧少年5月30日更新 主动技能解锁...
  6. 《21天学通HTML+CSS+JavaScript Web开发(第7版)》——1.4 统一资源定位符
  7. 百度地图API实现地理围栏
  8. android 修改listview item view 的方法
  9. static library libs/libvpx/libvpx.a is not portable!
  10. PNG隐写入门赛 WP
  11. linux 如何配置无线网卡驱动,Linux配置无线网卡驱动实现无线上网
  12. vue中组件的父子关系
  13. WEB 主机安全防护(Fail2ban + firewalld)_防止渗透猜解
  14. 热销超极本iFunk翼S到底怎么样?
  15. 2022年3月 python一级 程序题 【买本子和画三角形】
  16. VirusTotal智能搜索
  17. python表示三个数升序_编写程序,输入三个数,然后以升序显示_学小易找答案
  18. 爬虫selenium教程
  19. 计算机审计方法模板,“移花接木”巧用AO2011自制数据采集模版
  20. 系统加速软件 AVG PC Tuneup 2011

热门文章

  1. 计算机cad论文参考文献,Auto CAD在计算机绘制矿图中的应用探索
  2. golang怎么给空结构体赋值
  3. linux下修改ssh默认的连接端口及禁止root远程连接等
  4. 借花献佛!成都java工程师培训
  5. 逆误差函数:torch.erfinv
  6. python【数据结构与算法】Python语法查询大宝剑(全)
  7. Keras【Deep Learning With Python】更优模型探索Keras实现CNN
  8. 大数据druid查询不支持分页_Klin、Druid、ClickHouse核心技术对比
  9. java add offer_图解Java中的5大队列!(干货收藏)
  10. spacevim 添加自动折行