尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

P5324 [BJOI2019] 删数

P5324 [BJOI2019] 删数
📅 发布时间:2026/7/25 0:09:21

思路

先考虑不带修改的

序列答案显然与其顺序无关,注意到等于 \(n\) 的数必定被选到,所以还剩 \(n - cnt_n\) 个,然后 \(n - cnt_n\) 被选,重复循环即可。
那我们如何求要修改的个数呢?
其实很显然,你每一步覆盖不到的部分显然需要别的地方重复覆盖的点去补,所以考虑每个值垒成一根柱子,实际上就是将所有柱子向左推以后的未覆盖的点个数。

然后考虑怎么带修改:

  • 对于单点修改,由于只涉及两个值,直接修改掉然后给桶分别加减就行。
  • 对于区间修改,考虑到这玩意实际上等价于限定了一个查询的区间范围,然后全体加减就等价于移动这个查询范围(+1左移,-1右移)
    每次只需要在左移右移的时候删除/加入一下右边的的临界区间覆盖区间即可。
    然后我们需要微调一下单点修改,如果当前修改的值在右端点左侧,那就修改,否则改下桶即可,等到后面右端点到这里再修改就行了

具体维护的话,我们的数据结构需要支持区间加,区间查等于0的个数,所以用线段树维护最小值 \(mn\) ,最小值的数量 \(cnt\) ,区间的答案 \(res\) ,以及懒标记 \(lzy\) 即可。

为了方便维护避免负数情况,我们可以把查询范围左端点的初值赋为1.5e5这样就不会炸了。

Code

// By wnn
#include<bits/stdc++.h>
//#include<ext/pb_ds/assoc_container.hpp>
//#include<ext/pb_ds/priority_queue.hpp>
//#include<ext/pb_ds/exception.hpp>
//#include<ext/pb_ds/hash_policy.hpp>
//#include<ext/pb_ds/list_update_policy.hpp>
//#include<ext/pb_ds/tree_policy.hpp>
//#include<ext/pb_ds/trie_policy.hpp>
//using namespace __gnu_pbds;
using namespace std;#define int long long
namespace OI{namespace Simple_name{#define myfreopen freopen(\".in\", \"r\", stdin),freopen(\".out\", \"w\", stdout)using ll = long long;using db = double;using ull = unsigned long long;using pdd = pair<db, db>;using pii = pair<int, int>;using pll = pair<ll, ll>;#define pq priority_queue#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)#define dep(i,a,b) for(int i=(a),i##_end=(b);i>=i##_end;--i)#define x1 x_1#define y1 y_1#define fir first#define sec second#define pb push_back#define I_love_you ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);}using namespace Simple_name;namespace Val{#define eps 1e-9#define inf32 0x3f3f3f3f#define inf64 0x3f3f3f3f3f3f3f3fll#define mod1 (int)(1e9 + 7)#define mod2 998244353#define PI acos(-1.0)#define db_e (double)(2.71828182845904523536028)}using namespace Val;namespace Function{#define ls(x) (x << 1)#define rs(x) ((x << 1) | 1)#define mid(l, r) ((l + r) >> 1)#define debug(x) cerr<<#x<<\"=\"<<x<<endl#define log(x, y) (log2(y) / log2(x)) // 以x为底y的对数#define WA cerr << \"Wrong Answer\" << endl#define init_inf32(x) memset(x, 0x3f, sizeof(x))#define init_inf64(x) memset(x, 0x3fll, sizeof(x))#define init_0(x) memset(x, 0, sizeof(x))#define Dec(x) fixed << setprecision(x)ll pw(ll x, ll P, ll mod = mod1){ll ret = 1;while(P){if(P & 1) ret = ret * x % mod;x = x * x % mod; P >>= 1;}return ret;}}using namespace Function;
}
using namespace OI;
// Init rnd()
mt19937 rnd(time(0) ^ clock());
// Constants
const int dx[4] = {1, -1, 0, 0};
const int dy[4] = {0, 0, 1, -1};
const int N = 5e5 + 5, V = 1.5e5, MX = V * 3 + 5;int n, m;
int a[N], cnt[N];
int wdl = V + 1;
#define wdr (wdl + n)
class Segment{private:struct Tree{int mn, cnt;int res, lzy;} t[N << 2];#define mn(x) t[x].mn#define cnt(x) t[x].cnt#define res(x) t[x].res#define lzy(x) t[x].lzyvoid up(int x){mn(x) = min(mn(ls(x)), mn(rs(x)));cnt(x) = (mn(ls(x)) == mn(x)) * cnt(ls(x)) + (mn(rs(x)) == mn(x)) * cnt(rs(x));res(x) = res(ls(x)) + res(rs(x));}void push(int x, int val){mn(x) += val;res(x) = (mn(x) == 0) * cnt(x);lzy(x) += val;}void down(int x){if(lzy(x)){push(ls(x), lzy(x));push(rs(x), lzy(x));lzy(x) = 0;}}public:void build(int x = 1, int l = 1, int r = MX){if(l == r){cnt(x) = 1; res(x) = 1;return ;}int mid = mid(l, r);build(ls(x), l, mid);build(rs(x), mid + 1, r);up(x);}void modify(int ql, int qr, int val, int x = 1, int l = 1, int r = MX){if(ql > r || qr < l) return ;if(ql <= l && qr >= r){push(x, val);return ;}down(x); int mid = mid(l, r);modify(ql, qr, val, ls(x), l, mid);modify(ql, qr, val, rs(x), mid + 1, r);up(x);}int query(int ql, int qr, int x = 1, int l = 1, int r = MX){if(ql <= l && qr >= r){return res(x);} down(x);int mid = mid(l, r);if(qr <= mid) return query(ql, qr, ls(x), l, mid);if(ql > mid) return query(ql, qr, rs(x), mid + 1, r);return query(ql, qr, ls(x), l, mid) + query(ql, qr, rs(x), mid + 1, r);}void add(int x, int fu = 1){int New = x - cnt[x] + 1 - (fu == 1);modify(New, New, fu);cnt[x] += fu;}
} T;
void init(){cin >> n >> m;T.build();rep(i, 1, n){cin >> a[i];a[i] += wdl; T.add(a[i], 1);}while(m--){int p, x; cin >> p >> x;if(p != 0){if(a[p] <= wdr) T.add(a[p], -1);else --cnt[a[p]];a[p] = x + wdl;if(a[p] <= wdr) T.add(a[p], 1);else ++cnt[a[p]];}else{// 右边覆盖去除/加入,左边影响不到不用管if(x == 1){if(cnt[wdr]) T.modify(wdr - cnt[wdr] + 1, wdr, -1);--wdl;}else{++wdl;if(cnt[wdr]) T.modify(wdr - cnt[wdr] + 1, wdr, 1);}}cout << T.query(wdl + 1, wdr) << "\n";}
}
void solve(){}signed main(){
//	myfreopen;I_love_you;init();int T = 1;
//	cin >> T;while(T--){solve();}return 0;
}
/*things to check:
* Will it MLE?
* Is array big enough?
* Do you need long long?
* Is inf big enough?
* max or min?
* Yes,No or YES,NO?
* Is there anything extra to output?
* Did you Countershoot?
* Have you measured the limit data?
* More measurements should be cleared!!!
*/

相关新闻

  • AI学术写作助手:提升论文效率与质量的关键技术
  • Zotero文献管理工具:从安装配置到论文引用的完整指南
  • Qwen3.6 Plus技术预览版评测:代码生成与复杂任务规划

最新新闻

  • 5分钟搞定!RTL8852BE Wi-Fi 6驱动安装完全指南
  • AI驱动的数据录入自动化系统设计(从POC到千万级并发的工业级架构拆解)
  • 2026金融行业亚太EMBA中立择校测评
  • 从预算到验光到取镜,2026年广州配眼镜推荐,全环节费用拆解 - 配眼镜新资讯
  • 三步解放双手:用bili2text将B站视频转为可编辑文字稿
  • 猫抓视频嗅探工具:你的网页视频下载专家指南

日新闻

  • 从国家条件到买方清单,深入理解 ABAP CDS 单值过滤器派生
  • 2026 年当下,齐齐哈尔专业的不锈钢闸门批发厂家哪个好,揭秘!这个工业“铁门”如何实现成本翻倍的效率提升? - 行业甄选官
  • 2026阳极氧化加工厂推荐:从设备规模看硬质氧化技术的成熟应用推荐百正机械 - 栗子测评

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号