题意

2e5的数组,q个操作

1.将\(a[x]\)改为y

2.求下标l到r内所有的\(a[i]\)通过加法不能构成的最小的值

思路

通过二操作可以知道需要提取l到r内的值及其数量,而提取下标为l到r内的元素是一定要用主席树的

而用树状数组套上主席树即可实现修改操作

剩下需要解决的就是二操作:

首先只有有至少一个1,才能构成1

假设已经可以构成[1,x],设当前区间内值为[1,x+1]的和为sum

那显然我们就能构成[1,sum]了,如果sum==x,那么答案就是x+1

这个过程可以直接暴力,最坏情况下当前区间里的数是{1,2,3,5,8,13...},在第27项就到到2e5了,所以最多跑27次

那么复杂度O(\(27qlog^2n\))

这题其实比较友好,不需要离散化,也不需要优化空间,赞

比赛的时候其实也很可写,可惜

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1 using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;
typedef pair<ll,int> PIL; const db eps = 1e-2;
const int mod = 1e9+7;
const int maxn = 2e5+100;
const int maxm = maxn*150;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); int n,m;
inline int read(){
int num;
char ch;
while((ch=getchar())<'0' || ch>'9');
num=ch-'0';
while((ch=getchar())>='0' && ch<='9'){
num=num*10+ch-'0';
}
return num;
}
struct qst{
int op;
int x,y;
}prb[maxn];
ll a[maxn];
int totn,tot;
int rrot[maxn];
int ls[maxm],rs[maxm];
ll dat[maxm];
int root[maxn];
inline void insert(int &now, int l, int r, int x, int val){
if(!now)now=++tot;
dat[now]+=val;
if(l==r)return;
int mid = (l+r)>>1;
if(x<=mid)insert(ls[now],l,mid,x,val);
else insert(rs[now],mid+1,r,x,val);
}
int totL,totR;
int L[maxn],R[maxn];
inline ll ask(int l, int r, int k){
if(r==k){
ll ans=0;
for(int i = 1; i <= totL; i++)ans-=dat[L[i]];
for(int i = 1; i <= totR; i++)ans+=dat[R[i]];
return ans;
}
int mid=(l+r)>>1;
if(k<=mid){
for(int i = 1; i <= totL; i++)L[i]=ls[L[i]];
for(int i = 1; i <= totR; i++)R[i]=ls[R[i]];
return ask(l,mid,k);
}
else{
ll ans = 0;
for(int i = 1; i <= totL; i++)ans-=dat[ls[L[i]]];
for(int i = 1; i <= totR; i++)ans+=dat[ls[R[i]]]; for(int i = 1; i <= totL; i++)L[i]=rs[L[i]];
for(int i = 1; i <= totR; i++)R[i]=rs[R[i]];
return ans+ask(mid+1,r,k);
}
}
inline int lowbit(int x){return x&-x;}
int main() {
int q;
scanf("%d %d",&n, &q);
for(int i = 1; i <= n; i++){
a[i]=1ll*read();
}
totn=200000;
for(int i = 1; i <= n; i++){
int t = a[i];
for(int j = i; j <= n; j+=lowbit(j)){
insert(root[j],1,totn,t,a[i]);
}
}
for(int i = 1; i <= q; i++){
prb[i].op=read();prb[i].x=read();prb[i].y=read();
if(prb[i].op==1){
ll t = a[prb[i].x];
int tt = prb[i].y;
a[prb[i].x]=prb[i].y;
for(int j = prb[i].x; j<=n; j+=lowbit(j)){
insert(root[j],1,totn,t,-t);
insert(root[j],1,totn,tt,tt);
}
}
else{
prb[i].x--; ll now = 1;
ll sum = 0;
while(1){
totL=totR=0;
for(int j = prb[i].x; j; j-=lowbit(j))L[++totL]=root[j];
for(int j = prb[i].y; j; j-=lowbit(j))R[++totR]=root[j]; int t = min(now,200000ll);
ll tmp = ask(1,totn,t);
if(tmp==sum){
printf("%lld\n",now);
break;
}
sum=tmp;now=sum+1;
}
}
}
return 0;
}

2019icpc徐州现场赛 H Yuuki and a problem (树状数组套主席树)的更多相关文章

  1. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  2. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  3. 13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 2224: Boring Counting Time Limit: 3 Sec   ...

  4. HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Tota ...

  5. 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem

    2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...

  6. 2018徐州网络赛H. Ryuji doesn't want to study

    题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1], ...

  7. 2019icpc徐州网络赛_I_query

    题意 给定一个序列,多次询问区间\([l,r]\)中满足\(min(a[i],a[j])==gcd(a[i],a[j])\)的数对\((i,j)\)数. 分析 其实就是求区间有倍数关系的数对数. 由于 ...

  8. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  9. Trace 2018徐州icpc网络赛 (二分)(树状数组)

    Trace There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx ...

随机推荐

  1. Flutter 不能热加载,热重载按钮灰色,无法点击,flutter doctor 显示NO_PROXY is not set

    一.现象: Flutter 不能热加载 热重载按钮灰色,无法点击. 二.分析原因: 终端 flutter doctor 显示 NO_PROXY is not set 没有设置无代理的端口 终端:flu ...

  2. DevExpress 控件用法笔记(VB)

    1.ChartControl 显示条形图 ChartControl1.Titles.Clear() ChartControl1.Series.Clear() Dim db As DataTable S ...

  3. C#中的结构体和对象区别

    经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字str ...

  4. cogs 364. [HDU 1548] 奇怪的电梯 Dijkstra

    364. [HDU 1548] 奇怪的电梯 ★   输入文件:lift.in   输出文件:lift.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 呵呵,有一天我做了 ...

  5. Django 滑动验证

    极验官网:https://www.geetest.com/ 文档: https://docs.geetest.com/ 查看 行为验证的部署文档

  6. Java入门 - 面向对象 - 01.继承

    原文地址:http://www.work100.net/training/java-inheritance.html 更多教程:光束云 - 免费课程 继承 序号 文内章节 视频 1 概述 2 继承的特 ...

  7. EditPlus 添加 打开文件所在文件夹 功能

    添加自定义工具: Tools -> Configure User Tools... -> Add Tool >> Menu Text: 打开所在的文件夹 Command: ex ...

  8. doT 这个模板 是怎么实现的?

    之前做过一个微信有关的站 模板用 doT 嗯 这个 用起来很 不错. 但是 它是怎么实现的,想过没有? ps:https://github.com/olado/doT 源码总共 140行. 第90行里 ...

  9. Ubuntu16手动安装OpenStack——glance篇--转

    全文转自https://www.voidking.com/dev-ubuntu16-manual-openstack-glance/ 目标 紧接着<Ubuntu16手动安装OpenStack—— ...

  10. 亲测可用!在线购书系统项目分享(Java)

    项目简介 项目来源于:https://gitee.com/suimz_admin/BookShop 一个基于JSP+Servlet+Jdbc的书店系统.涉及技术少,易于理解,适合JavaWeb初学者学 ...