题意:

给定一个长度为 nnn 的序列,序列中每个数都不相同,数字范围在 1n1~n1 n 之间,一共有 mmm 次操作。操作 111,(1,pos)(1,pos)(1,pos),令 apos=apos+107a_{pos}=a_{pos}+10^7apos​=apos​+107。操作 222,(2,r,k)(2,r,k)(2,r,k),求出大于等于 kkk 且不等于 a1ara_1~a_ra1​ ar​ 中任意一个数的最小值,强制在线。(1≤n≤105,1≤m≤105)(1\leq n\leq 10^5,1\leq m\leq 10^5)(1≤n≤105,1≤m≤105)


思路:

首先,我们先考虑如果没有修改操作,这道题应该如何考虑。

假如没有修改操作,我们就直接建一颗主席树,然后 a1~ana_1~a_na1​~an​ 的数依次插入主席树中,作为标记节点,然后查询 1~r1~r1~r 中第一个大于等于 kkk 的并且没有被标记的数。这个部分在线段树中的具体操作不难思考,详见代码。

然后我们考虑修改,一个数修改之后就表示这个数不再被标记。因此我们将所有被修改的数放入 setsetset 中,然后最终答案一定由 setsetset 中的值或者主席树中查询到的值取 minminmin 得到。

至此,此题结束。


总结:

反省一下,为什么比赛的时候没有做出来。

比赛时,一直思考的是如果直接从主席树中查到答案,因此写了一发带修改的主席树,然后成功 TLE\text{TLE}TLE。一直想着如何直接做出这道题,不思考如何转换,宛如 zzzzzz。

而正确的思考方式应该是思考最终答案由哪些数组成,一个数被修改之后就意味着这个数重新变成了一个可以成为最终答案的数字。因此两者取 minminmin 即可得到答案。


代码:

#include <bits/stdc++.h>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int inf = 1e8;
const int N = 1e5+100;
const db EPS = 1e-9;
using namespace std;int n,m,a[N],sz,root[N],sum[N*20],ls[N*20],rs[N*20];
set<int> st;void build(int &now,int l,int r){if(!now) now = ++sz;sum[now] = 0;if(l == r) return;int mid = (l+r)>>1;build(ls[now],l,mid);build(rs[now],mid+1,r);
}void insert(int pre,int &now,int l,int r,int pos,int c){if(!now) now = ++sz;if(l == r) {sum[now] += c; return;}int mid = (l+r)>>1;if(pos <= mid) {rs[now] = rs[pre]; insert(ls[pre],ls[now],l,mid,pos,c);}else {ls[now] = ls[pre]; insert(rs[pre],rs[now],mid+1,r,pos,c);}sum[now] = sum[ls[now]]+sum[rs[now]];
}int query(int now,int l,int r,int k){if(sum[now] == r-l+1) return inf;if(l == r){if(!sum[now]) return l;else return inf;}int mid = (l+r)>>1;if(mid < k || sum[ls[now]] >= mid-l+1) return query(rs[now],mid+1,r,k);else{int ans = query(ls[now],l,mid,k);if(ans != inf) return ans;else return query(rs[now],mid+1,r,k);}
}int main()
{int _; scanf("%d",&_);while(_--){sz = 0; st.clear();scanf("%d%d",&n,&m);rep(i,1,n) scanf("%d",&a[i]);build(root[0],1,n+1);rep(i,1,n) insert(root[i-1],root[i],1,n+1,a[i],1);int last_ans = 0;rep(i,1,m){int op; scanf("%d",&op);if(op == 1){int pos; scanf("%d",&pos);pos ^= last_ans;if(a[pos] == inf) continue;else{st.insert(a[pos]);a[pos] = inf;}}else{int r,k; scanf("%d%d",&r,&k);r ^= last_ans; k ^= last_ans;int hp1 = query(root[r],1,n+1,k), hp2 = inf;if(st.size()){set<int>::iterator it = st.lower_bound(k);if(it != st.end()) hp2 = (*it);}printf("%d\n",min(hp1,hp2));last_ans = min(hp1,hp2);}}rep(i,0,sz) ls[i] = rs[i] = sum[i] = 0;rep(i,0,n) root[i] = 0;}return 0;
}

【 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛】1002.array【主席树】相关推荐

  1. 2019中国大学生程序设计竞赛(CCPC)-网络选拔赛-第七题Shuffle Card

    文章目录 1.大赛题目 2.中文翻译 3.代码案例 4.解题思路 4.1代码举例 1.大赛题目 Shuffle Card Time Limit: 2000/1000 MS (Java/Others) ...

  2. 2020年中国大学生程序设计竞赛(CCPC) - 网络选拔赛部分题解

    前言 既培养算法知识,又能学习按摩手法,我们还有专业的算命大师帮你窥察天机. 这还犹豫什么,快来加入我们.前10名还能请大师免费帮你看风水,让你死后也能安心. 我怕不是进了一个人才市场- Expres ...

  3. 2021中国大学生程序设计竞赛(CCPC),烤仔与你不见不散!

    今天也是见到超多学霸的一天呢! 因为,CCPC 的参赛选手们来看烤仔啦!北京航空航天大学.北京交通大学等高校共 95 名总决赛参赛选手在 5 月 28 日来到 Conflux 参观.交流. 由中国大学 ...

  4. 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master

    文章目录 题意: 题解: 代码: 题意: 你在钓鱼,每次钓鱼固定时间为k(必定钓上一条鱼),池塘一共n条鱼,钓上鱼后要煮,每条鱼煮的时间不相同,可以在煮鱼的同时钓鱼,问钓上所有的鱼并煮完需要最短的时间 ...

  5. 2022第8届中国大学生程序设计竞赛CCPC威海站, 签到题7题

    文章目录 E.Python Will be Faster than C++ A.Dunai G.Grade 2 J.Eat, Sleep, Repeat C.Grass D.Sternhalma I. ...

  6. 2019中国大学生程序设计竞赛-女生专场(重现赛)

    题目链接 B:Gcd: 题意: 将1-n这n个数字分成两组,每组至少有一个数字,然后求两组的数的总和的最大公约数. 第一点,要想到分成两组,就是他们两组要够分 第二点,可以通过第一点联想到1–n的总和 ...

  7. 2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题

    文章目录 I.Pudding Store H.Three Integers C.Necklace F.Cactus 补题链接:https://codeforces.com/gym/103415 I.P ...

  8. 2021第7届中国大学生程序设计竞赛CCPC桂林站, 签到题5题

    文章目录 A.Hero Named Magnus I. PTSD G. Occupy the Cities E. Buy and Delete D.Assumption is All You Need ...

  9. 浙江大学计算机学院 英语竞赛 陈星,喜报 | 浙大代表队获得CCPC中国大学生程序设计竞赛冠军...

    浙江大学Wheatfield with Crows队在2019年10月20日下午2时结束的CCPC中国大学生程序设计竞赛厦门赛站中获得冠军,来自复旦大学和清华大学的队伍分获亚军和季军. 本次比赛于20 ...

  10. 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛 1005 Lunch (杭电 6892)

    2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛 1005 Lunch (杭电 6892)(类尼姆博弈) #include<cstdio> #include<iostrea ...

最新文章

  1. Mysql判断工作日函数_MySQL函数查找两个日期之间的工作日数
  2. opencv 运动检测
  3. c语言1000内亲密对数,《C语言程序的设计上机指导》项目五函数及其应用.pptx
  4. python3openpyxl无法打开文件_Python3 处理excel文件(openpyxl库)
  5. apache 官方 Dubbo 文档
  6. 程序员面试金典 - 面试题 17.22. 单词转换(BFS)
  7. php怎么查询数据库,php怎么查询数据库
  8. 设置熄屏_自定义熄屏显示其实很简单
  9. ie6,ie7兼容性总结
  10. 如何用WSUS2.0分发补丁
  11. System.ConfigurationManager类用于对配置文件的读取
  12. 数据挖掘数据的资料分享
  13. 此操作要求使用 IIS 集成管线模式
  14. 测试设计之状态转换图
  15. 加速电脑启动,给电脑瘦身
  16. 【简●解】巴厘岛的雕塑
  17. 美团点评2020校招系统开发方向笔试题(编程题题解)
  18. Python 两个字典如何实现相加?(相同的键,值相加)
  19. 2021《微型计算机原理与接口技术》总复习
  20. 用360检查元素时怎么知道html文件名,360浏览器审查元素怎样用?360浏览器开发工具使用教程...

热门文章

  1. Solr schema编写指导
  2. 电脑故障速查方法集萃
  3. Spring Boot入门(2)-项目属性配置
  4. Deepin在matlab的安装
  5. erp服务器性能测试,浪潮PS-ERP压力测试报告--AMD单路服务器
  6. mac 装python环境下mysql_MAC OS X下安装MySQL-python
  7. linux7mysql集群_linux下mysql集群搭建
  8. u8显示云服务器已离线_u8登录不知道这样的主机
  9. 统计123出现次数_Java字符串03-统计大小写字母出现的次数
  10. linux指定运行so文件,linux – 强制二进制文件使用特定(较新)版本的共享库(.so)...