Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】

流媒体影视爆款预测数据集6000部剧集电影21特征 本数据集模拟流媒体平台影视内容特征,包含6000部剧集、电影与纪录片样本、21个字段,覆盖内容类型、题材、出品国家、上映年份与月份、内容分级、是否平台原创、是否系列续集、改编来源、时长、季数、明星影响力、制作与营销预算、观众评分、社交热度等维度。提供top10_hit分类目标(进入平台榜单前十并保持4周以上)与views_28d_m回归目标(上线28天观看量),结果字段独立分离,便于练习避免目标泄漏。数据干净完整、无缺失值、无需表关联,直接可用于分类、回归、探索性分析,以及发布档期选择、题材与续集表现、单位营销成本观看效率等研究,适合影视行业分析、推荐系统与机器学习教学。说明:本数据为Python生成的合成数据,仅反映生成规则,不含真实节目与个人信息。许可:CC0公有领域,可自由使用与二次分发。 立即下载

传送门:http://codeforces.com/contest/1108/problem/E2

E2. Array and Segments (Hard version)
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The only difference between easy and hard versions is a number of elements in the array.

You are given an array aa consisting of nn integers. The value of the ii-th element of the array is aiai.

You are also given a set of mm segments. The jj-th segment is [lj;rj][lj;rj], where 1≤lj≤rj≤n1≤lj≤rj≤n.

You can choose some subset of the given set of segments and decrease values on each of the chosen segments by one (independently). For example, if the initial array a=[0,0,0,0,0]a=[0,0,0,0,0] and the given segments are [1;3][1;3] and [2;4][2;4] then you can choose both of them and the array will become b=[−1,−2,−2,−1,0]b=[−1,−2,−2,−1,0].

You have to choose some subset of the given segments (each segment can be chosen at most once) in such a way that if you apply this subset of segments to the array aa and obtain the array bb then the value maxi=1nbi−mini=1nbimaxi=1nbi−mini=1nbiwill be maximum possible.

Note that you can choose the empty set.

If there are multiple answers, you can print any.

If you are Python programmer, consider using PyPy instead of Python when you submit your code.

Input

The first line of the input contains two integers nn and mm (1≤n≤105,0≤m≤3001≤n≤105,0≤m≤300) — the length of the array aaand the number of segments, respectively.

The second line of the input contains nn integers a1,a2,…,ana1,a2,…,an (−106≤ai≤106−106≤ai≤106), where aiai is the value of the ii-th element of the array aa.

The next mm lines are contain two integers each. The jj-th of them contains two integers ljlj and rjrj (1≤lj≤rj≤n1≤lj≤rj≤n), where ljlj and rjrj are the ends of the jj-th segment.

Output

In the first line of the output print one integer dd — the maximum possible value maxi=1nbi−mini=1nbimaxi=1nbi−mini=1nbi if bb is the array obtained by applying some subset of the given segments to the array aa.

In the second line of the output print one integer qq (0≤q≤m0≤q≤m) — the number of segments you apply.

In the third line print qq distinct integers c1,c2,…,cqc1,c2,…,cq in any order (1≤ck≤m1≤ck≤m) — indices of segments you apply to the array aa in such a way that the value maxi=1nbi−mini=1nbimaxi=1nbi−mini=1nbi of the obtained array bb is maximum possible.

If there are multiple answers, you can print any.

Examples
input
Copy
5 4
2 -2 3 1 2
1 3
4 5
2 5
1 3
output
Copy
6
2
4 1 
input
Copy
5 4
2 -2 3 1 4
3 5
3 4
2 4
2 5
output
Copy
7
2
3 2 
input
Copy
1 0
1000000
output
Copy
0
0

Note

In the first example the obtained array bb will be [0,−4,1,1,2][0,−4,1,1,2] so the answer is 66.

In the second example the obtained array bb will be [2,−3,1,−1,4][2,−3,1,−1,4] so the answer is 77.

In the third example you cannot do anything so the answer is 00.

 

 

题意概括:

给出一段长度为 N 的初始序列,以及 M 个区间,要求选择若干区间(选择该区间则对该区间的数进行 -1 操作),使得序列中的最大值和最小值的差值最大。

 

解题思路:

选择区间的三种情况:

(1)该区间只包含最后的最小值,则选择该区间会优化最大差值,必选。

(2)该区间包含最后的最小值和最大值,对差值无影响,选不选无所谓。

(3)该区间未包含最后的最小值,有可能会减小最大差值,不可选。

 

但是我们并不知道最后的最小值是哪个?所以需要枚举一遍,假设每个值都有可能成为最后的最小值,最后取最优的解。

既然假设了当前的这位数为会成为最后的最小值,那么根据上面三种区间的选取情况,我们要选择相对应的区间,这样才能达到目前这一位作为最小值的最优解。

 

如果每到一位都暴力一遍所有区间,这样复杂度太大了,我们可以用一个 Left [ k ] 动态链表 和一个 Right [ k ] 动态链表,分别记录以 k 位开始的区间有哪些和以 k 位结束的区间有哪些?

这样更新的时候只需要操作这些与当前位相关的区间即可。

 

这里的区间更新有两种方案:

(1)直接暴力更新

 AC code:

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 #include<set>
 9 #define INF 0x3f3f3f3f
10 #define LL long long
11 using namespace std;
12 const LL MOD = 1e9+7;
13 const int MAXN = 1e5+10;
14 const int MAXM = 333;
15 vector<int>Le[MAXN];
16 vector<int>Ri[MAXN];
17 int num[MAXN];
18 int ans_q[MAXM];
19 int N, M;
20 struct data
21 {
22     int l, r;
23 }q[MAXM];
24 
25 void update(int L, int R, int v)
26 {
27     for(int i = L; i <= R; i++){
28         num[i]+=v;
29     }
30 }
31 
32 int main()
33 {
34     int index;
35     int maxx = -INF, minn = INF;
36     scanf("%d %d", &N, &M);
37     for(int i = 1; i <= N; i++){
38         scanf("%d", &num[i]);
39         maxx = max(maxx, num[i]);
40         if(minn > num[i]){minn = num[i]; index = i;}
41     }
42 
43     for(int i = 1; i <= M; i++){
44         scanf("%d %d", &q[i].l, &q[i].r);
45         Le[q[i].l].push_back(i);
46         Ri[q[i].r+1].push_back(i);
47     }
48 
49     int ans = maxx-minn;
50     int tp;
51     for(int i = 1; i <= N; i++){
52         for(int ed = 0; ed < Ri[i].size(); ed++){
53             tp = Ri[i][ed];
54             update(q[tp].l, q[tp].r, 1);
55         }
56 
57         for(int st = 0; st < Le[i].size(); st++){
58             tp = Le[i][st];
59             update(q[tp].l, q[tp].r, -1);
60         }
61 
62         if(!Le[i].empty() || !Ri[i].empty()){
63             maxx = -INF;minn = INF;
64             for(int i = 1; i <= N; i++){
65                 maxx = max(maxx, num[i]);
66                 minn = min(minn, num[i]);
67             }
68             if(ans < maxx-minn){
69                 ans = maxx-minn;
70                 index = i;
71             }
72         }
73     }
74     if(ans <= -INF){
75         puts("0");
76         puts("0");
77     }
78     else{
79         printf("%d\n", ans);
80         int cnt = 0;
81         for(int i = 1; i <= M; i++){
82             if(q[i].l <= index && q[i].r >= index){
83                 ans_q[++cnt] = i;
84             }
85         }
86         printf("%d\n", cnt);
87         for(int i = 1; i <= cnt; i++){
88             printf("%d ", ans_q[i]);
89         }
90         puts("");
91     }
92     return 0;
93 }

 

 

(2)可持续化线段树的区间更新(即 lazy tag)

  AC code:

  

  1 ////可持久化线段树优化的区间更新
  2 #include <bits/stdc++.h>
  3 #define INF 0x3f3f3f3f
  4 #define LL long long
  5 using namespace std;
  6 const int MAXN = 1e5+10;
  7 const int MAXM = 303;
  8 
  9 int N, M;
 10 int a[MAXN], L[MAXM], R[MAXM], ans[MAXN];
 11 vector<int>add[MAXN], sub[MAXN];
 12 
 13 struct node
 14 {
 15     int l, r;
 16     int maxx, minn, lazy;
 17 }tree[MAXN<<2];
 18 
 19 void push_up(int k)
 20 {
 21     tree[k].maxx = max(tree[k<<1].maxx, tree[k<<1|1].maxx);
 22     tree[k].minn = min(tree[k<<1].minn, tree[k<<1|1].minn);
 23 }
 24 
 25 void push_down(int k)
 26 {
 27     if(tree[k].l != tree[k].r){
 28         tree[k<<1].maxx += tree[k].lazy; tree[k<<1].minn += tree[k].lazy;
 29         tree[k<<1|1].maxx+=tree[k].lazy; tree[k<<1|1].minn+=tree[k].lazy;
 30         tree[k<<1].lazy += tree[k].lazy;
 31         tree[k<<1|1].lazy += tree[k].lazy;
 32     }
 33     tree[k].lazy = 0;
 34 }
 35 
 36 
 37 void build(int k, int l, int r)
 38 {
 39     tree[k].l = l;
 40     tree[k].r = r;
 41     if(l == r){
 42         tree[k].maxx = a[l];
 43         tree[k].minn = a[l];
 44         tree[k].lazy = 0;
 45         return;
 46     }
 47     int mid = (l+r)>>1;
 48     build(k<<1, l, mid);
 49     build(k<<1|1, mid+1, r);
 50     push_up(k);
 51 }
 52 
 53 void update(int k, int l, int r, int x)
 54 {
 55     if(tree[k].lazy) push_down(k);
 56     tree[k].maxx+=x;
 57     tree[k].minn+=x;
 58     if(tree[k].l == l && tree[k].r == r){
 59         tree[k].lazy += x;
 60         return;
 61     }
 62     int mid = (tree[k].l + tree[k].r)>>1;
 63     if(r <= mid){
 64         update(k<<1, l, r, x);
 65     }
 66     else if(l > mid){
 67         update(k<<1|1, l, r, x);
 68     }
 69     else{
 70         update(k<<1, l, mid, x);
 71         update(k<<1|1, mid+1, r, x);
 72     }
 73     push_up(k);
 74 }
 75 
 76 
 77 int query_max(int k, int l, int r)
 78 {
 79     int maxx;
 80     if(tree[k].lazy) push_down(k);
 81     if(tree[k].l == l && tree[k].r == r) return tree[k].maxx;
 82     int mid = (tree[k].l + tree[k].r)>>1;
 83     if(r <= mid) maxx = query_max(k<<1, l, r);
 84     else if(l > mid) maxx = query_max(k<<1|1, l, r);
 85     else{
 86         maxx = max(query_max(k<<1, l, mid), query_max(k<<1|1, mid+1, r));
 87     }
 88     return maxx;
 89 }
 90 
 91 
 92 int query_min(int k, int l, int r)
 93 {
 94     int minn;
 95     if(tree[k].lazy) push_down(k);
 96     if(tree[k].l == l && tree[k].r == r) return tree[k].minn;
 97     int mid = (tree[k].l + tree[k].r)>>1;
 98     if(r <= mid) minn = query_min(k<<1, l, r);
 99     else if(l > mid) minn = query_min(k<<1|1, l, r);
100     else
101         minn = min(query_min(k<<1, l, mid), query_min(k<<1|1, mid+1, r));
102     return minn;
103 }
104 
105 int main()
106 {
107     scanf("%d %d", &N, &M);
108     for(int i = 1; i <= N; i++) scanf("%d", &a[i]);
109 
110     for(int i = 1; i <= M; i++){
111         scanf("%d%d", &L[i], &R[i]);
112 
113         sub[ L[i] ].push_back(i);
114         add[ R[i] ].push_back(i);
115     }
116 
117     build(1, 1, N);
118 
119     int d = -1, p;
120     for(int i = 1; i <= N; i++){
121 
122         for(int j = 0; j < add[i-1].size(); j++){
123             int id = add[i-1][j];
124             update(1, L[id], R[id], 1);
125         }
126 
127         for(int j = 0; j < sub[i].size(); j++){
128             int id = sub[i][j];
129             update(1, L[id], R[id], -1);
130         }
131 
132         int det = query_max(1, 1, N) - query_min(1, 1, N);
133         //printf("det:%d\n", det);
134         if(det > d){
135             d = det;
136             p = i;
137         }
138     }
139 
140     printf("%d\n", d);
141     int t = 0;
142     for(int i = 1; i <= M; i++){
143         if(L[i] <= p && p <= R[i])
144             ans[t++] = i;
145     }
146 
147     printf("%d\n", t);
148     for(int i = 0; i < t; i++){
149         printf("%d ", ans[i]);
150     }
151     puts("");
152 
153     return 0;
154 
155 }

 

AI大模型安全架构落地解决方案.pptx 立即下载

相关推荐

国央企创新负责人如何提升企业创新与技术合作的精准度?.docx

国央企创新负责人如何提升企业创新与技术合作的精准度?

Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 线段树

题目链接:http://codeforces.com/contest/1108/problem/E2s 题意: 给你n个数个m个区间(n<=1e5,m<=300),要你选出一些区间(每个区间最多被选择一次),每个区间里对应的数都减去1,使得n个数中的最大值减去最小值最大。 做法: 看到区间其实能想象的到是线段树,但是这里用了区间的随...

人生如戏 258

科技中介服务机构在协助企业对接科研成果时,如何提升服务响应速度与专业化水平.docx

科技中介服务机构在协助企业对接科研成果时,如何提升服务响应速度与专业化水平

Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version)

题目链接:http://codeforces.com/contest/1108/problem/E2- 题意:给你一个大小为n(1&lt;=n&lt;=1e5) 的数组a,给你m(m&lt;=300)个区间 [l, r],你可以选择m个区间中的任意个区间,每个区间会使a中对应位置的数减一。问如何选择区间让数组a中的最大值和最小值的差值最大。 思路:在选择完区间后,最终结果中的a中显然必然存在最小...

凝望的博客 397

啊算法撒上v的咋撒方式

啊算法撒上v的咋撒方式

科技中介服务机构如何构建更加专业化的技术服务评价体系?.docx

科技中介服务机构如何构建更加专业化的技术服务评价体系?

Array and Segments (Hard version)【Codeforces Round #535 (Div. 3).E2】

题目链接   每次的区间更新都可以去做一个区间全体‘-1’,但是这是可以取也可以不取的,所以,我们可以取搞一个O(N*M*logN)的枚举来找寻最后的答案,就是去遍历每一个节点,把所有在区间内的都直接放进来,然后去找全体区间最大值,最后比较即可。   听闻还有用可持久化线段树做的(就是附近的大佬…… 呜呜呜,膜拜……QAQ)。 #include &lt;iostream&gt; #incl...

既然弱小,就只顾变强就是了 289

高校技术转移办公室人员如何利用智能工具简化技术成果的推介与转化流程?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version)(线段树+思维)

题目链接 思路:这题曾经好像做过,但结果还是不会做。。。 其实观察一下假设,一、最后结果的最大值和最小值都在【li,ri】里,那么最大值减去最小值是同时变化的,二、如果最大值不在【li,ri】里的话,最后的结果也只会增不会减,所有我们枚举每个位置,假设最小值在这个位置,用线段树把以i为左端点的区间进行update,查询一下最大值减一下就行,不过这里要注意以下,查询完以后记得要把以i为右端点的区...

qq_42479630的博客 154

solong 图像处理器 - v3.4 - 吾爱大佬 by 金牌软件 .exe

solong 图像处理器 _ v3.4 _ 吾爱大佬 by 金牌软件 .exe

西门子 S7 PLC 对接 MES 系统:HTTP/JSON 通信实施指南

内容概要:本文介绍了通过IGT-DSER智能网关实现西门子S7-1500 PLC(采用优化访问DB数据块)与MES系统的对接方案。重点阐述了使用S7-PLUS标签方式读取PLC变量标签数据,结合网关边缘处理能力进行数据换算与JSON封装,并通过HTTP/GET或POST方式将数据上传至MES系统的技术路径。文中详细说明了网络配置、变量映射、触发逻辑设置、JSON结构生成、联调验收流程及常见故障排查方法,强调无需修改PLC程序即可完成集成,适用于工业现场快速部署。; 适合人群:自动化工程师、MES实施工程师、工业网络与设备运维人员; 使用场景及目标:①实现西门子S7-1500等支持优化DB的PLC与MES系统高效对接;②在不改动原有PLC程序的前提下完成数据采集与上传;③通过标准化JSON格式与HTTP协议实现与各类业务平台的数据交互;④提升系统集成效率并确保数据传输的准确性与可监控性; 阅读建议:此资源以实际工程案例为基础,建议读者结合IGT-DSER网关参数管理软件操作实践,重点关注标签配置、触发条件设定与JSON字段映射的细节,并在测试环境中验证请求与响应闭环后再投入正式运行。

Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version)补题

题目:E2. Array and Segments (Hard version) 题意 给含有n个元素的数组a,给出m个可供选择的数组段,若选择一个数组段,则该段的数组元素都要减1,选择若干数组段,找出更新之后的的数组a的最大最小元素的最大差值。 题解 线段树,第一遍没有仔细思考,以为只要选择所有包含最小元素的数组段即可,错在了第15个测试数据。在仔细思考之后,发现如果有其他元素包含的数组段都选择之后,可能最后该元素的值会变得更小。 代码1(wa15): #include<iostream> #

qq_45759861的博客 175

PSIM-串联谐振半桥LLC开关电源+PFM变频闭环控制【仿真+计算书+参考文献】

内容概要:本文详细介绍了PSIM-串联谐振半桥LLC开关电源结合PFM变频闭环控制的设计与仿真,系统阐述了LLC谐振变换器的建模方法、软开关实现机制及基于变频控制的闭环调节策略。资源包涵盖完整的PSIM仿真模型、详细的计算书与参考文献,重点展示了在宽负载范围内通过调节开关频率实现高效能运行的技术路径。系统利用串联谐振腔的频率特性,在不同负载条件下实现零电压开通(ZVS)或零电流关断(ZCS),显著降低开关损耗;同时,闭环控制通过反馈输出电压动态调整工作频率,确保输出稳定性和动态响应性能。该设计特别适用于对高效率、高功率密度有严格要求的应用场景。; 适合人群:具备电力电子、电源设计或自动化相关背景的本科高年级学生、研究生及从事开关电源研发的工程师。; 使用场景及目标:①掌握LLC谐振变换器的工作原理及其在PSIM中的建模与仿真方法;②学习PFM(脉冲频率调制)变频控制在开关电源中的闭环实现技术;③应用于高频高效电源系统的设计与优化,如通信电源、新能源变换器、车载充电机等;④为科研项目或毕业设计提供完整的仿真参考、计算依据与技术支持。; 阅读建议:建议读者结合提供的PSIM仿真文件、计算书与参考文献同步操作,深入理解谐振参数设计、变频控制逻辑与闭环反馈的实现细节,重点关注开关频率与增益曲线的关系、谐振元件参数匹配对效率的影响,并通过改变输入电压和负载条件验证系统的稳态与动态性能表现。

图腾柱无桥PFC变换器+平均电流控制+PI电压双闭环前馈控制设计(Simulink仿真实现)

图腾柱无桥PFC变换器+平均电流控制+PI电压双闭环前馈控制设计(Simulink仿真实现)内容概要:本文详细介绍了图腾柱无桥PFC变换器的设计与Simulink仿真实现,重点围绕平均电流控制和PI电压双闭环前馈控制策略展开。通过构建完整的仿真模型,分析了系统在不同工况下的动态响应特性与稳态性能,验证了所设计控制策略的有效性与鲁棒性。文章涵盖了主电路拓扑结构、控制环路设计、关键参数计算及仿真结果分析等内容,为从事电力电子变换器研发的科研人员提供了实用的技术参考与实现路径。; 适合人群:具备电力电子与自动控制理论基础,从事新能源、电源设计或相关领域研究的研发人员及高校研究生。; 使用场景及目标:①掌握图腾柱无桥PFC变换器的工作原理与建模方法;②学习平均电流控制与双闭环前馈控制的实现技巧;③应用于高效率电源系统设计与科研项目仿真验证; 阅读建议:建议结合Simulink仿真模型同步操作,深入理解各控制模块的设计逻辑与参数整定过程,并通过调整工况测试系统性能,强化理论与实践结合能力。

国央企创新负责人在推动技术转化过程中,如何更高效地识别高质量专利并实现价值转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

两相交错并联BuckBoost变换器仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了两相交错并联Buck-Boost变换器的Simulink仿真模型构建与控制策略研究。该变换器采用两相交错并联拓扑结构,有效降低了输入与输出电流纹波,提升了系统效率与功率密度。文中系统阐述了其主电路拓扑、工作原理及基于状态空间平均法的小信号数学建模过程,并据此设计了电压-电流双闭环PI控制器,以实现输出电压的精确调节与优良的动态响应性能。仿真模型在Simulink中完整搭建,涵盖了主功率回路、PWM脉冲生成、驱动逻辑及闭环控制系统,通过设置负载突变等工况验证了控制策略的有效性,结果表明系统响应速度快、抗干扰能力强。此外,文档还探讨了该变换器与LLC谐振变换器、PFC电路等其他电力电子装置的协同仿真应用,凸显其在新能源发电、储能系统及电动汽车等领域的广阔应用前景。; 适合人群:具备电力电子技术基础,熟悉MATLAB/Simulink仿真环境,从事电源设计、新能源系统开发或相关领域研究的研发人员及高校研究生。; 使用场景及目标:①掌握两相交错并联Buck-Boost变换器的工作原理、建模方法与纹波抑制机制;②学习并实践基于状态空间平均法的系统建模与双闭环PI控制器的设计、参数整定技巧;③应用于储能系统、电动汽车车载充电机、光伏逆变器等需要高效、低纹波直流变换的系统仿真与原型开发。; 阅读建议:建议读者结合提供的Simulink模型文件,边操作边深入理解文档中的电路拓扑、控制逻辑与参数设置,重点关注双闭环控制的实现细节、PI参数整定过程及仿真结果分析,有条件者可进一步开展硬件在环(HIL)测试,以深化对理论与实践结合的理解。

上一篇: BZOJ 2818 GCD 【欧拉函数 || 莫比乌斯反演】
下一篇: CF#538(div 2) C. Trailing Loves (or L'oeufs?) 【经典数论 n!的素因子分解】
莜莫oO
博客等级 码龄9年 7粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值