2019icpc徐州现场赛 H Yuuki and a problem (树状数组套主席树)
题意
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 (树状数组套主席树)的更多相关文章
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- 13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 2224: Boring Counting Time Limit: 3 Sec ...
- HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Tota ...
- 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem
2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...
- 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], ...
- 2019icpc徐州网络赛_I_query
题意 给定一个序列,多次询问区间\([l,r]\)中满足\(min(a[i],a[j])==gcd(a[i],a[j])\)的数对\((i,j)\)数. 分析 其实就是求区间有倍数关系的数对数. 由于 ...
- 计蒜客 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 ...
- Trace 2018徐州icpc网络赛 (二分)(树状数组)
Trace There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx ...
随机推荐
- docker+mysql 构建数据库的主从复制
docker+mysql 构建数据库的主从复制 在最近的项目中,决定将项目改造成数据库读写分离的架构,后续会有博文详细讲述我的开发改造,本文主要记录我是如何一步步的构建数据库的主从复制. 为什么使用d ...
- Mac重装操作系统系统
恢复出厂设置 第一种 1.开机 2.commond + R,进入recover模式. 3.选择磁盘工具 4.显示所有设备 5.抹掉硬盘.格式选择 (1):Mac OS 扩展(日志式). (2): Ma ...
- MySQL数据库(五)插入操作
前提要述:参考书籍<MySQL必知必会> <MySQL必知必会>是先讲了查询,但是没有记录就无法查询,所以先将如何添加数据. 表已经知道怎么创建了,随便创两张. 5.1 插入数 ...
- Ceph日常运维管理和排错 -- <7>
Ceph日常运维管理 集群监控管理 集群整体运行状态 [root@cephnode01 ~]# ceph -s cluster: id: 8230a918-a0de-4784-9ab8-cd2a2b8 ...
- Docker系列-第七篇Docker构建SpringBoot应用
1.基于Dockerfile构建SpringBoot镜像 1.1准备工作 将SpringBoot项目通过maven打成jar包 mvn clean package #使用maven打包项目 1.2使用 ...
- Java 第一次课堂测验
周一下午进行了开学来java第一次课堂测验,在课堂上我只完成了其中一部分,现代码修改如下: 先定义 ScoreInformation 类记录学生信息: /** * 信1805-1 * 胡一鸣 * 20 ...
- target 和 currentTarget的区别
target是当前点击的组件,currentTarget是扑捉到事件的组件
- idea 2019.3 最新版破解教程
背景 最近,idea又被整治了,所以一大批激活码都失效了.我之前已经有2018版的永久激活了,所以非常淡定~,也没打算升级版本.但是,最近发现周围的人都在讨论这个问题.于是,我也找到了2019.3最新 ...
- AVR单片机教程——PWM调光
本文隶属于AVR单片机教程系列. PWM 两位数码管的驱动方式是动态扫描,每一位都只有50%的时间是亮的,我们称这个数值为其占空比.让引脚输出高电平点亮LED,占空比就是100%. 在驱动数码管时 ...
- Activiti 启动事件(Start Event)
Activiti 启动事件(Start Event) 作者:Jesai 生活里,没有容易二字,忧伤是一种本能,而微笑是一种能力 版权所有,未经允许,禁止引用.如需引用,请注明出处. 前言: 启动事件是 ...