bzoj3747

经典题,记录每个位置对应数下次出现的位置next[i]

每个位置维护当前左端点下到这个位置的和

随着左端点的右移一位到i+1,对[i+1,next[i]-1] 的影响是-a[i], [next[i],next[next[i]]-1]的影响是a[i]

线段树维护,pascal过不去系列

 1 var lazy,tree:array[0..1000010*4] of int64;
 2     s:array[0..1000010] of int64;
 3     next,last,w,a:array[0..1000010] of longint;
 4     i,n,m:longint;
 5     ans:int64;
 6
 7 function max(a,b:int64):int64;
 8   begin
 9     if a>b then exit(a) else exit(b);
10   end;
11
12 procedure ins(i:longint;z:int64);
13   begin
14     tree[i]:=tree[i]+z;
15     lazy[i]:=lazy[i]+z;
16   end;
17
18 procedure push(i:longint);
19   begin
20     ins(i*2,lazy[i]);
21     ins(i*2+1,lazy[i]);
22     lazy[i]:=0;
23   end;
24
25 procedure add(i,l,r,x,y,z:longint);
26   var m:longint;
27   begin
28     if (x<=l) and (y>=r) then ins(i,z)
29     else begin
30       m:=(l+r) shr 1;
31       if lazy[i]<>0 then push(i);
32       if x<=m then add(i*2,l,m,x,y,z);
33       if y>m then add(i*2+1,m+1,r,x,y,z);
34       tree[i]:=max(tree[i*2],tree[i*2+1]);
35     end;
36   end;
37
38 begin
39
40   readln(n,m);
41   for i:=1 to n do
42     read(a[i]);
43   for i:=1 to m do
44   begin
45     read(w[i]);
46     last[i]:=n+1;
47   end;
48   for i:=n downto 1 do
49   begin
50     if last[a[i]]=n+1 then s[i]:=s[i+1]+w[a[i]]
51     else s[i]:=s[i+1];
52     next[i]:=last[a[i]];
53     last[a[i]]:=i;
54   end;
55   for i:=1 to m do
56     if last[i]>0 then add(1,1,n,last[i],next[last[i]]-1,w[i]);
57
58   for i:=1 to n do
59   begin
60     if s[i]<=ans then break;
61     ans:=max(ans,tree[1]);
62     add(1,1,n,i,next[i]-1,-w[a[i]]);
63     if next[i]<=n then add(1,1,n,next[i],next[next[i]]-1,w[a[i]]);
64   end;
65   writeln(ans);
66 end.

时间: 2024-08-19 10:31:51

bzoj3747的相关文章

【BZOJ3747】[POI2015]Kinoman 线段树

[BZOJ3747][POI2015]Kinoman 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&

【bzoj3747】Kinoman[POI2015](线段树)

题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3747 对于这种题,考虑固定区间的右端点为r,设区间左端点为l能取得的好看值总和为a[l],那么就相当于当r取不同取值时所有al的最大值. 设last[i]表示第i部电影上一次出现的位置,当右端点r右移1位时,因为只有看了一遍的电影能获取好看值,所以能取得f[r]的好看值的al只能是在last[r]~r这个区间.因此每次右移时,last[last[r]]+1~last[r]减去w[f[r

[bzoj3747][POI2015]Kinoman_线段树

Kinoman bzoj-3747 POI-2015 题目大意:有m部电影,第i部电影的好看值为w[i].现在放了n天电影,请你选择一段区间l~r使得l到r之间的好看值总和最大.特别地,如果同一种电影放了两遍及以上,那么这种电影的好看值将不会被获得. 注释:$1\le m \le n \le 10^6$. 想法:和rmq problem类似的,我们处理出每一个位置pos右边第一个和pos上电影种类相同的位置nxt[pos].然后,我从1-n扫一遍,每次讲l+1到nxt[l]-1之间的值加上w[a

Bzoj3747 [POI1015] Kinoman

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]

bzoj3747 [POI2015]Kinoman

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]

【BZOJ-3747】Kinoman 线段树

3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 715  Solved: 294[Submit][Status][Discuss] Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影.如果同一部电影你观看多

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

[题目链接] 看到数据范围以为是O(n)做法,再看看status似乎带了个log?然后去搜题解,没想到是线段树= =. 题解: 设pre[i]表示与i这个位置上的数相等的前一个数的下标. 用线段树维护答案. 枚举右端点,每次加入一个数,那么pre[i] + 1到i这段位置的答案加上这个数的权值,pre[pre[i]] + 1到pre[i]这段位置的答案减去这个数的权值,然后查询[1, i]的最大值即可. 复杂度: 时间复杂度O(nlogn),空间复杂度O(n). RE: 给线段树开了1倍n的空间

【线段树】bzoj3747 [POI2015]Kinoman

题解:http://www.cnblogs.com/zyfzyf/p/4105184.html 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 #define lson rt<<1,l,m 6 #define rson rt<<1|1,m+1,r 7 int Num,CH[12],f,c; 8 inline void R(int

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ