(颓废扒题解2333)

给颜色的下一个出现位置记录一下,然后每次只有第一个颜色的出现位置和下一个出现位置之间会产生这种颜色的价值,所以用线段树维护一下区间。

那么现在就只需要把整个的数列从1->n搞一下,然后移动左端点,每次都更新答案就好,每一次移动,当前位置和下一个出现本颜色的出现位置减去,下一个和下下个加上就好,(没下下个就n呗2333,,,都一样)

 1 #include<bits/stdc++.h>
 2 #define N 100005
 3 #define M 10000005
 4 #define LL long long
 5 #define inf 0x3f3f3f3f
 6 using namespace std;
 7 inline int ra()
 8 {
 9     int x=0,f=1; char ch=getchar();
10     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
11     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
12     return x*f;
13 }
14 int n,m;int f[1000005],w[1000005];
15 int last[1000005],next[1000005];
16 LL ans;
17 struct seg{
18     int l,r;
19     LL tag,mx;
20 }t[4000005];
21 void pushdown(int k)
22 {
23     int l=t[k].l,r=t[k].r;
24     if (l==r) return;
25     LL tag=t[k].tag; t[k].tag=0;
26     t[k<<1].tag+=tag; t[k<<1|1].tag+=tag;
27     t[k<<1].mx+=tag; t[k<<1|1].mx+=tag;
28 }
29 void build(int k, int l, int r)
30 {
31     t[k].l=l; t[k].r=r;
32     if (l==r) return;
33     int mid=l+r>>1;
34     build(k<<1,l,mid); build(k<<1|1,mid+1,r);
35 }
36 void add(int k, int x, int y, int val)
37 {
38     if (t[k].tag) pushdown(k);
39     int l=t[k].l,r=t[k].r;
40     if (l==x && y==r)
41     {
42         t[k].tag+=val; t[k].mx+=val;
43         return;
44     }
45     int mid=l+r>>1;
46     if (y<=mid) add(k<<1,x,y,val);
47     else if (x>mid) add(k<<1|1,x,y,val);
48     else add(k<<1,x,mid,val),add(k<<1|1,mid+1,y,val);
49     t[k].mx=max(t[k<<1].mx,t[k<<1|1].mx);
50 }
51 int main()
52 {
53     n=ra(); m=ra();
54     for (int i=1; i<=n; i++) f[i]=ra();
55     for (int i=1; i<=m; i++) w[i]=ra();
56     for (int i=n; i>=1; i--) next[i]=last[f[i]],last[f[i]]=i;
57     build(1,1,n);
58     for (int i=1; i<=m; i++)
59         if (last[i])
60         {
61             if (!next[last[i]]) add(1,last[i],n,w[i]);
62             else add(1,last[i],next[last[i]]-1,w[i]);
63         }
64     for (int i=1; i<=n; i++)
65     {
66         ans=max(ans,t[1].mx);
67         int t=next[i];
68         if (t)
69         {
70             add(1,i,t-1,-w[f[i]]);
71             if (next[t]) add(1,t,next[t]-1,w[f[i]]);
72             else add(1,t,n,w[f[i]]);
73         }
74         else add(1,i,n,-w[f[i]]);
75     }
76     cout<<ans;
77     return 0;
78 }

转载于:https://www.cnblogs.com/ccd2333/p/6426361.html

bzoj 3747: [POI2015]Kinoman相关推荐

  1. BZOJ 3747 POI2015 Kinoman 段树

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

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

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

  3. bzoj 3750: [POI2015]Pieczęć(模拟)

    3750: [POI2015]Pieczęć Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 309  Solved: 171 [Submit][Sta ...

  4. bzoj 3749: [POI2015]Łasuchy

    3749: [POI2015]Łasuchy Time Limit: 10 Sec  Memory Limit: 64 MBSec  Special Judge Submit: 355  Solved ...

  5. [Luogu P3597] [BZOJ 4386] [POI2015]WYC

    洛谷传送门 BZOJ传送门 题目描述 给定一张nnn个点mmm条边的带权有向图,每条边的边权只可能是111,222,333中的一种.将所有可能的路径按路径长度排序,请输出第kkk小的路径的长度,注意路 ...

  6. @bzoj - 4384@ [POI2015] Trzy wieże

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个长度为 n 的仅包含'B'.'C'.'S'三种字符的字符 ...

  7. BZOJ3747: [POI2015]Kinoman

    [传送门:BZOJ3747] 简要题意: 共有m部电影,编号为1到m,第i部电影的好看值为w[i]. 在n天之中(从1到n编号)每天会放映一部电影,第i天放映的是第f[i]部 你可以选择l,r(1&l ...

  8. bzoj3747 [POI2015]Kinoman

    线段树,记录next[i]下一部与当前电影一样的位置,然后枚举区间左端点i,询问线段树最大值后删除i到next[i-1]这段区间的观影值,且增加next[i]到next[next[i]]-1这段区间的 ...

  9. BZOJ #3746: [POI2015]Czarnoksiężnicy okrągłego stołu 动态规划

    转载请注明出处:http://www.cnblogs.com/TSHugh/p/8823423.html 读完题就会发现p=0.1的情况以及n=1.2的情况都可以直接判掉,而p=2的时候也可以直接构造 ...

最新文章

  1. 老码农绝密:使用 TS(TypeScript) 的 10 大理由
  2. ASP.NET 学习历程
  3. 10分钟弄懂深度学习:卷积与特征提取
  4. 已解决:虚拟机无法获取所有权
  5. wxWidgets:使用 wxWidgets 的示例控制台(与 GUI 相对)程序
  6. mysql 工具_最全Mysql运维工具Percona Toolkit使用案例
  7. 【儿童成长心理学】第一章 引言
  8. scala中命名参数函数_Scala中带有命名参数的函数
  9. lpr命令linux下未找到,linux – LPR命令无法识别CUPS打印机
  10. ActiveMQ学习(三)——MQ的通讯模式
  11. 算法:POJ1007 DNA sorting
  12. RStudio 的使用
  13. Exchange 2007 474 问题解决方法
  14. C语言程序设计实验报告——实验一
  15. Java回调函数实例
  16. LOJ 6437 [PKUSC 2018] PKUSC
  17. 流量卡之家:物联网僵尸网络和DDoS攻击:构建网络风险防火墙
  18. linux 机房安全管理,提示尊敬的用户您好:您访问的网站被机房安全管理系统拦截怎么办?...
  19. 程序提示:control reaches end of non-void function [-Wreturn-type]
  20. APMServ中Apache启动失败解决方法大全

热门文章

  1. 计算机及其系统的泄密渠道之三
  2. 如何做一份出色的竞品分析?(一)
  3. 不要把时间画在抽奖上。。。去学习吧。。。
  4. 我感觉ae比较难用,就是做这种画中画的视频,final cut pro真香
  5. 什么是神经网络在object detection的应用?cascade classifier,卷积神经网络,迁移学习
  6. 《守望先锋》阵亡镜头、全场最佳和亮眼表现是如何设计
  7. Linux+DDoS deflate 预防DDoS
  8. JS 原型链 prototypt 和隐式原型 _proto_
  9. Django - app
  10. AIX Study之--AIX网卡配置管理(ent0、en0、et0)