题目链接: H.Yuuki and a problem

题意

单点修改以及查询区间里任意个数加和形成的集合中的mex值。

题解

如何进行操作2可看这篇博客:2021_icpc昆明_M
关键在于主席树要进行单点修改操作

众所周知每建立一颗主席树会新增log(n)个结点,如果我们要更新第i个结点时,那么[i,n]颗主席树都需要被更新,总更新的时间复杂度为O(N*N*logN),很暴力也很费时。


传统主席树每个点管理一个前缀,由于树状数组能快速地修改和获得前缀和,所以我们可以将主席树的每个点维护的范围改为树状数组的范围。

这样每次修改时只需要修改[j+lowbit(j)]等…元素,求前缀和只需求[j-lowbit(j)]等…的和。

这样修改和获取前缀和的复杂度都是logn的,所以每次操作都是(logn)^2的 。


在此推荐一位大佬Coco_T_的博客,也供自己日后复盘学习。

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
using namespace std;
//extern "C"{void *__dso_handle=0;}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define lowbit(x) x&-xconst double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);const int N=200000;
int a[maxn];
struct Tr
{int ls,rs;ll sum;
}tr[maxn*100];
int root[maxn],sz;
int n,q;void insert(int& now,int l,int r,int val,int v)
{if(!now) now=++sz;tr[now].sum+=val;if(l==r) return;int mid=(l+r)>>1;if(v<=mid) insert(tr[now].ls, l, mid, val, v);else insert(tr[now].rs, mid+1, r, val, v);
}ll query(int l,int r,int ql,int qr,int p)
{if(!p) return 0;if(ql<=l && qr>=r) return tr[p].sum;ll ans=0;int mid=(l+r)>>1;if(ql<=mid) ans+=query(l, mid, ql, qr, tr[p].ls);if(qr>mid) ans+=query(mid+1, r, ql, qr, tr[p].rs);return ans;
}void insert(int x,int p,int val)
{for(int i=x;i<=N;i+=lowbit(i)) insert(root[i],1, N, val, p);
}ll query(int l,int r,int L,int R)
{ll ans=0;for(int i=r;i;i-=lowbit(i))ans += query(1, N, L, R, root[i]);for(int i=l-1;i;i-=lowbit(i))ans -= query(1, N, L, R, root[i]);return ans;
}int main()
{scanf("%d%d",&n,&q);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);insert(i, a[i], a[i]);}while (q--) {int op,l,r; scanf("%d%d%d",&op,&l,&r);if(op==1){insert(l, a[l], -a[l]);a[l]=r;insert(l, a[l], a[l]);}else {if(l>r) swap(l, r);ll ans=0;while (true) {ll new_ans=query(l, r, 1, min(ans+1,(ll)N));if(new_ans==ans) break;ans=new_ans;}printf("%lld\n",ans+1);}}
}

[2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)相关推荐

  1. ICPC 徐州 H Yuuki and a problem (树状数组套主席树)

    Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...

  2. 2019 ICPC 徐州网络赛 J.Random Access Iterator

    2019 ICPC 徐州网络赛 J.Random Access Iterator 题目大意:给你n个点和n-1条边(树形结构),保证1为根节点,通过以下方式dfs遍历: 询问dfs到最深节点的概率(有 ...

  3. 2019 ICPC徐州站总结

    退役了 自南京站爆零血崩之后,一直在跟队友调整状态,在徐州站之前状态调整的差不多,比赛预案也重做了一下,但还是打铁,由于一直在想以后的发展方向,这篇总结也就一直拖着没写 徐州站,到了徐州后身体不舒服, ...

  4. 2019 icpc徐州区域网络赛题解09.07

    A题: 链接:https://nanti.jisuanke.com/t/41383 思路:模型是经典常见的斐波拉契博弈模型,套上一个java大数的扩展中国剩余定理即可. 扩展中国剩余定理解出方程,判断 ...

  5. 2019 ICPC World Finals Problem J. Miniature Golf

    2019 ICPC World Finals Problem J. Miniature Golf Solution 设lll为l0l_0l0​时iii的总分为si,l0s_{i,l_0}si,l0​​ ...

  6. 2019 ICPC World Finals Problem B. Beautiful Bridges

    2019 ICPC World Finals Problem B. Beautiful Bridges Solution 太菜了,sbsbsb题调了一个下午. 首先有一个显然的O(n3)O(n^3)O ...

  7. 2019 ICPC 南昌网络赛 H. The Nth Item

    2019 ICPC 南昌网络赛 H. The Nth Item 题目大意:已知一个数列F(n): F(0)=0,F(1)=1 F(n)=3∗F(n−1)+2∗F(n−2),(n≥2) ​ 给你一个操作 ...

  8. The 2019 ICPC Asia-East Continent Final(M、E、H、C)

    The 2019 ICPC Asia-East Continent Final 大部分学习于:The 2019 ICPC Asia-East Continent Final(部分题解) 欠了一屁股的题 ...

  9. 2019 ICPC全国邀请赛(西安)I. Cracking Password(序列检验,BSGS,细节题)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2019 ICPC全国邀请赛(西安)I. Cracking Password Weblink http ...

  10. 2019 ICPC Asia Yinchuan Regional(9 / 13)

    2019 ICPC Asia Yinchuan Regional A - Girls Band Party(分组背包) 每个物品有两个标签,名字,颜色,当名字是设置为奖赏时会对整体加上0.1 的贡献, ...

最新文章

  1. MP4文件格式带数据详解
  2. python实验收获_python实验课代码心得
  3. c++如何将两个if函数合并_设计一个 add 函数
  4. 服务器控件开发之基本概念
  5. mysql 查询时间转换_数据库查询时日期的转换
  6. Rails文件上传file_field报错Encoding::UndefinedConversionError
  7. CentOS 7.1下KVM的安装与配置
  8. c++ loadlibrary 初始化对象_C++构造函数和初始化表
  9. getResource().getColor() 过时
  10. 欧氏距离、巴氏距离、马氏距离的区别是什么
  11. sql in语句优化_优化SQL语句的一般步骤
  12. rgba与16进制互相转换
  13. Go语言实战--学习笔记--runner
  14. 微信群总是有人发广告?我用Python写个机器人消灭他!
  15. SRS RTC NACK源码分析—1
  16. Ensight导入Fluent h5瞬态序列文件
  17. 如何截取视频片段 批量截取片段的方法
  18. 报告:非洲加密货币诈骗活动比例低于世界其他地区
  19. linux虚拟机关se,Centos关闭SELinux和防火墙的关闭
  20. 工具系列————教育邮箱激活Clion

热门文章

  1. Ubuntu下Linux常用命令练习作业题(1)
  2. win7无法连接虚拟磁盘服务器,win7系统电脑打开磁盘管理出现“无法连接虚拟磁盘服务”的解决方法...
  3. SQL Server 2019下载安装教程
  4. 电脑c盘格式化,如何恢复C盘文件?
  5. 牛客网面试提错题集(1)
  6. Linux 命令(244)—— reset 命令
  7. 2022-2028全球与中国防爆照明LED灯市场现状及未来发展趋势
  8. 2021-2027全球与中国外部谷仓门市场现状及未来发展趋势
  9. python并行编程 - GPU篇
  10. 华为笔记本键盘说明图_笔记本电脑的的键盘都表示什么意思