题解:P6645 [CCO 2020] Interval Collection

news/2025/3/12 12:22:44/文章来源:https://www.cnblogs.com/kkxacj/p/18717922

前言

我在模拟赛中把单 \(\log\) 实现为了双 \(\log\),即对于每个线段树节点开了四个优先队列,获得了 \(0\) 分超空的好成绩。

思路

我们先把每次操作给出的区间 \(r-1\)

首先分析发现,如果存在不交区间,则优先选不交区间,这样就有 \(0\) 个不合法的。

否则,剩下的区间一定都包含一段区间,我们从中选两个即可。

大体思路如上,接下来是具体实现:

我们对于每个点 \(i\) 开四个优先队列,即两个双堆支持加入删除,分别代表左端点为 \(i\) 时最小右端点和右端点为 \(i\) 时最大左端点,这样对于第二种情况,若所有区间都交与 \(l,r\),则只需要找左端点为 \(l\) 的最小右端点和右端点为 \(r\) 的最大左端点,这样求出的就是最小区间。

否则我们考虑使用线段树,我们对于每个线段树节点记录右端点在这个区间的,最大左端点 \(fl\),和左端点在这个区间的,最小右端点 \(fr\),对于每次合并先令答案为两个儿子的答案,然后在存在的情况下尝试用右儿子的 \(fr\) 减去左儿子的 \(fl\) 加一更新,最后答案就是根节点的 \(ans\)

我们顺便用线段树区间加减求最大值就能知道剩余区间是否全部都交与一段区间,然后分别处理即可。

code

#include<bits/stdc++.h>
#define ls (p<<1)
#define rs ((p<<1)+1)
#define mid ((c[p].l+c[p].r)>>1)
using namespace std;
namespace IO
{template<typename T>void read(T &_x){_x=0;int _f=1;char ch=getchar();while(!isdigit(ch)) _f=(ch=='-'?-1:_f),ch=getchar();while(isdigit(ch)) _x=_x*10+(ch^48),ch=getchar();_x*=_f;}template<typename T,typename... Args>void read(T &_x,Args&...others){Read(_x);Read(others...);}const int BUF=20000000;char buf[BUF],to,stk[32];int plen;#define pc(x) buf[plen++]=x#define flush(); fwrite(buf,1,plen,stdout),plen=0;template<typename T>inline void print(T x){if(!x){pc(48);return;}if(x<0) x=-x,pc('-');for(;x;x/=10) stk[++to]=48+x%10;while(to) pc(stk[to--]);}
}
using namespace IO;
const int N = 1e6+10,M = 1e6+2;
int n,l,r,id,mi,mx,sum,k,x,y;
char ch;
struct w1
{priority_queue<int>p,p1,P,P1;//p:左端点为 i 时最小右端点//p1:相反 
}a[N];
struct w
{int l,r,ans,mx,ad,fl,fr;//shan chu xu yao shuang dui shan chu//p:zuo duan dian wei i,zui xiao you duan dian//p1:zui da zuo duan dian
}c[N<<2];
inline void push(int p)
{c[ls].mx += c[p].ad,c[ls].ad += c[p].ad;c[rs].mx += c[p].ad,c[rs].ad += c[p].ad;c[p].ad = 0;
}
void build(int p,int l,int r)
{c[p].ans = 1e9; c[p].fl = 0,c[p].fr = -1e9; c[p].l = l,c[p].r = r;if(l == r) {a[l].p.push(0),a[l].p1.push(-1e9);return;}build(ls,l,mid),build(rs,mid+1,r);
}
void change_l(int p,int l)
{if(c[p].l == l && c[p].r == l) {if(id == 1) a[l].p1.push(-k);else a[l].P1.push(-k);while(!a[l].P1.empty() && a[l].p1.top() == a[l].P1.top()) a[l].P1.pop(),a[l].p1.pop();//双堆进行删除c[p].fr = a[l].p1.top();return;}if(l <= mid) change_l(ls,l);else change_l(rs,l);c[p].ans = min(c[ls].ans,c[rs].ans);c[p].fl = max(c[ls].fl,c[rs].fl);c[p].fr = max(c[ls].fr,c[rs].fr);//由于我们加了-号,变为取max if(c[ls].fl != 0 && c[rs].fr != -1e9) c[p].ans = min(c[p].ans,-c[rs].fr-c[ls].fl+1);
}
void change_r(int p,int l)
{if(c[p].l == l && c[p].r == l) {if(id == 1) a[l].p.push(k);else a[l].P.push(k);while(!a[l].P.empty() && a[l].p.top() == a[l].P.top()) a[l].P.pop(),a[l].p.pop();c[p].fl = a[l].p.top();return;}if(l <= mid) change_r(ls,l);else change_r(rs,l);c[p].ans = min(c[ls].ans,c[rs].ans);c[p].fl = max(c[ls].fl,c[rs].fl);c[p].fr = max(c[ls].fr,c[rs].fr);//同理 if(c[ls].fl != 0 && c[rs].fr != -1e9) c[p].ans = min(c[p].ans,-c[rs].fr-c[ls].fl+1);
}
void change1(int p)
{if(l <= c[p].l && c[p].r <= r)//区间加/减 {c[p].mx += k,c[p].ad += k;return;}if(c[p].ad != 0) push(p);if(l <= mid) change1(ls);if(mid < r) change1(rs);c[p].mx = max(c[ls].mx,c[rs].mx);
}
int query_l(int p)//找左端点 
{if(c[p].l == c[p].r) return p;if(c[p].ad != 0) push(p);if(c[ls].mx == sum) return query_l(ls);else return query_l(rs);
}
int query_r(int p)//找右端点 
{if(c[p].l == c[p].r) return p;if(c[p].ad != 0) push(p);if(c[rs].mx == sum) return query_r(rs);else return query_r(ls);
}
signed main()
{
//	freopen("stone.in","r",stdin);
//	freopen("stone.out","w",stdout);read(n);build(1,1,M);while(n--){cin >> ch; read(l),read(r); r--;if(ch == 'A'){sum++;id = 1; k = r,change_l(1,l); k = l,change_r(1,r);k = 1,change1(1);}else{sum--;id = 2; k = r,change_l(1,l); k = l,change_r(1,r);k = -1,change1(1);}l = query_l(1);if(c[l].mx != sum) print(c[1].ans),pc('\n');//有不交的 else //全交 {r = query_r(1);l = c[l].l,r = c[r].l; print(-a[l].p1.top()-a[r].p.top()+1),pc('\n');}}flush();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884649.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c_note

c笔记一、变量 1、变量的声明 ​ 变量的声明是给编译器看的,告诉编译器变量的类型以及名字等相关的信息。 格式:数据类型 变量名; 变量的声明显然是一个编译时概念,所以它和程序的运行没有太大的关系。 一个变量具有声明,并不意味着该变量会在运行时期分配内存空间。 2、…

Drasi Sources SDK

什么是Drasi数据源(Source)?Source提供了与系统的连接,Drasi 可以将这些系统视为变化源。source 在 Drasi 中执行三个重要功能:处理源系统生成的更改日志/源,并将这些更改推送到使用该源作为输入的每个连续查询。 将源更改数据转换为一致的属性图数据模型,以便订阅的 Co…

【每日一题】20250216

人生就是这样,不经历鲜血淋漓的疼痛,就不会明白那些曾经让我们厌烦的说教其实是受用一生的信条。【每日一题】(多选)如图所示,在竖直半面内有一半径为 \(R\) 的圆弧轨道.半径 \(OA\) 木平、\(OB\) 竖直,一个质量为 \(m\) 的小球自 \(A\) 的正上方 \(P\) 点由静止开始自由…

数据团队必读:智能数据分析文档(DataV Note)五种高效工作模式

数据项目,无论是数据分析、可视化,还是数据科学和机器学习相关的项目,通常都非常复杂,涉及多个组成部分,比如代码、数据、运行环境、SQL脚本以及分析报告等;与此同时,随着AI时代的到来,数据科学领域正经历重大变革。这对于数据科学团队来说,如何保持高效地工作模式一直…

SU镜像:缩放s

su没有镜像,可用:缩放s 选中要镜像的对象——复制一个——s——找到中间的点——向右拉动——输入 -1

LGP1377 [TJTS 2011] 树的序 学习笔记

LGP1377 [TJTS 2011] 树的序 学习笔记 Luogu Link 题意简述 给一个生成序列 \(p\),简单起见 \(p\) 是一个长为 \(n\) 的排列。按照这样的步骤生成一棵二叉搜索树:往空树中插入 \(p_i\),则 \(p_i\) 成为当前二叉搜索树的根。 往非空树 \(u\) 中插入 \(p_i\),若 \(p_i\) 小于…

vxe-input绑定keyup事件传递的参数

一、VUE3中 Input输入框绑定keyup事件传递的$event 代码一:<script setup>function judgeIsEnterToSerach(event){console.log(event,1111);console.log(event.key,2222);console.log(event.target,230923);console.log(event.target.value,3333);console.log(event.tar…

清华大学推出第二讲 DeepSeek 如何赋能职场应用?从提示语技巧到多场景应用!

前言 清华大学第二讲《DeepSeek如何赋能职场应用》是一份35页的专业文档,详细探讨了DeepSeek在职场中的多场景应用及其赋能作用,从提示语技巧到多场景应用,咱们打工人有福啦!DeepSeek访问地址:https://chat.deepseek.com 清华大学推出的 DeepSeek 从入门到精通(104页)免…

信创

概念 “信创“ (全称“信息技术应用创新”)是国家基于国产芯片和操作系统的PC、服务器、网络设备、存储设备、数据库、中间件等基础设施的技术创新。 信创CPU概览

LGP5854 [LG TPLT] 笛卡尔树 学习笔记

LGP5854 [LG TPLT] 笛卡尔树 学习笔记 Luogu Link 题意简述 给定一个长为 \(n\) 的排列 \(p\),以 \(i\) 为键,\(p_i\) 为值构建 \(p\) 中所有元素的笛卡尔树。 做法解析 定义“右链”为从根开始一直往右儿子走形成的一条链。 因为我们照键从小到大的顺序插入每一个元素,所以…

11.4.3 凸目标的收敛性分析

式\((11.47)\)应该有误,不等号左边还应该有一个项\(-E[||x_T-x^{*}||^2]\),之所以没写估计是因为认为\(x_T\)非常接近\(x^{*}\),所以可以忽略;另外不等号右边的括号打错了,应该是 \[2\underset{t=1}{\overset{T}{\sum}}\eta_tE[R(x_t)]-2S_1R^*-S_2L^2 \],其中\(S_1=\und…

AGC053C 题解

Solution 前面部分略,相信别的题解写得很详细。 本题解集中解释 \(p(d)\) 的计算。 \(p(d)\) 表示对于 \(\forall A_i\),\(B_1\cdots B_{i+d}\) 中有比它大的数。 那么这么考虑,已经加入 \(A_1 \cdots A_{i-1}\)。对于 \(A_i\) ,如果大于 \(\min(A_1 \cdots A_{i-1},B_1 \c…