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

题意:

给定一个长度为\(n\)的序列,有两种操作:

  • 1:单点修改。
  • 2:查询区间\([L,R]\)范围内所有子集和中没出现的最小正整数。

思路:

对于维护序列的问题大概率是数据结构的题目了,先确定一下题目的性质。

操作2需要我们提取\([l,r]\)范围内的值,这可以用主席树解决,同时需要带修,所以可以用树状数组套主席树完成。

确定是树套树后,考虑怎么维护操作2。

我们考虑一个节点,先看看能不能表示成1,如果这个节点代表的区间一个1都没有,那他的答案为1。

假设答案已经可以构成\([1,x]\)了。

考虑当前节点代表的区间内值为\([1,x+1]\)的数字的和为sum。

那么我们就可以构成\([1,sum]\)这个区间了,如果\(sum==x\),那么答案就是\(x+1\)。

这个过程可以暴力跑,因为他是一个斐波那契数列,不到多少项就到2e5了。

所以我们操作2就相当于是模拟这样一个过程。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
int n, m, len;
ll a[maxn]; inline int lowbit(int x){
return x&(-x);
} ll sum[maxn*80];
int ls[maxn*80];
int rs[maxn*80];
int rt[maxn*80];
int tot; void update_SgT(int &rt, int l, int r, int x, int val)
{
if(!rt) rt = ++tot;
if(l == r)
{
sum[rt] += val;
return;
}
int mid = (l+r)>>1;
if(x <= mid) update_SgT(ls[rt], l, mid, x, val);
else update_SgT(rs[rt], mid+1, r, x, val);
sum[rt] = sum[ls[rt]] + sum[rs[rt]];
} void update_BIT(int pos, int x, int val)
{
for(int i = pos; i <= n; i += lowbit(i))
update_SgT(rt[i], 1, len, x, val);
} int rt1[maxn], rt2[maxn], cnt1, cnt2;
void locate(int l, int r)
{
cnt1 = cnt2 = 0;
for(int i = l-1; i; i -= lowbit(i))
rt1[++cnt1] = rt[i];
for(int i = r; i; i -= lowbit(i))
rt2[++cnt2] = rt[i];
} ll ask(int l, int r, int k)
{
ll ans = 0;
if(r == k)
{
for(int i = 1; i <= cnt1; i++)
ans -= sum[rt1[i]];
for(int i = 1; i<= cnt2; i++)
ans += sum[rt2[i]];
return ans;
} int mid = (l+r)>>1;
if(k <= mid)
{
for(int i = 1; i <= cnt1; i++)
rt1[i] = ls[rt1[i]];
for(int i = 1; i <= cnt2; i++)
rt2[i] = ls[rt2[i]];
return ask(l, mid, k);
}
else
{
for(int i = 1; i <= cnt1; i++)
ans -= sum[ls[rt1[i]]];
for(int i = 1; i <= cnt2; i++)
ans += sum[ls[rt2[i]]]; for(int i = 1; i <= cnt1; i++)
rt1[i] = rs[rt1[i]];
for(int i = 1; i <= cnt2; i++)
rt2[i] = rs[rt2[i]];
return ans + ask(mid+1, r, k);
}
} int main()
{
scanf("%d%d", &n, &m);
len = maxn-10;
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]); for(int i = 1; i <= n; i++)
update_BIT(i, a[i], a[i]); for(int i = 1, op, x, y; i <= m; i++)
{
scanf("%d%d%d", &op, &x, &y);
if(op == 1) //修改操作
{
update_BIT(x, a[x], -a[x]);
a[x] = y;
update_BIT(x, y, y);
}
else
{
ll now = 1;
ll s = 0;
while(true)
{
locate(x, y);
int t = min(now, 200000ll);
ll tmp = ask(1, len, t);
if(tmp == s)
{
printf("%lld\n", now);
break;
}
s = tmp, now = s+1;
}
}
} return 0;
}

2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem的更多相关文章

  1. 【2018 ICPC亚洲区域赛徐州站 A】Rikka with Minimum Spanning Trees(求最小生成树个数与总权值的乘积)

    Hello everyone! I am your old friend Rikka. Welcome to Xuzhou. This is the first problem, which is a ...

  2. ACM-ICPC 2016亚洲区域赛(沈阳站)游记(滚粗记)

    首发于QQ空间和知乎,我在这里也更一下.   前言 以前高中搞竞赛的时候,经常看到神犇出去比赛或者训练之后写游记什么的,感觉萌萌哒.但是由于太弱,就没什么心情好写.现在虽然还是很弱,但是抱着享受的心情 ...

  3. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

  4. 第42届亚洲区域赛青岛站(2017icpc青岛)经验总结以及一些感想

    上一次写这种东西还是天梯赛,当时打完心里也是挺激动的,然后我们队也没有去参加省赛,但是过了一段时间我还是从那里面恢复了出来.因为我当时确实还是很菜的,当时连个暴力都不会,看着自己仅过的那些百度的题目确 ...

  5. 2015年ACM-ICPC亚洲区域赛合肥站网络预选赛H题——The Next (位运算)

    Let L denote the number of 1s in integer D's binary representation. Given two integers S1 and S2, we ...

  6. 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score

    Average Score Time Limit: 2 Seconds      Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...

  7. 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...

  8. 2014年acm亚洲区域赛·鞍山站

    今天北京赛站的比赛也结束了···看了一天的直播之后意识到鞍山站的比赛都过去了一个多月了···这一个月比较萎靡···整天都在睡觉写报告画工图中度过··· 鞍山比哈尔滨还是暖和很多的···就是山上有奇怪的 ...

  9. 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation

    Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation ...

随机推荐

  1. ActiveMQ的安装与配置详情

    (1)ActiveMQ的简介 MQ: (message queue) ,消息队列,也就是用来处理消息的,(处理JMS的).主要用于大型企业内部或与企业之间的传递数据信息. ActiveMQ 是Apac ...

  2. 32位CPU和64位CPU 区别

    操作系统只是硬件和应用软件中间的一个平台. 32位操作系统针对的32位的CPU设计. 64位操作系统针对的64位的CPU设计.操作系统只是硬件和应用软件中间的一个平台. 32位操作系统针对的32位的C ...

  3. HDU - 1698 Just a Hook (线段树---区间修改)

    题意:n个棍子,初始值全为1,给定Q个区间,分别赋值,问n个棍子的总值. 分析:lazy标记主要体现在update上. 当l <= L && R <= r时,该结点的子结点 ...

  4. 配置tomcat、nginx实现反向代理(需操作)

    配置tomcat.nginx实现反向代理现在我想通过nginx访问tomcat 这就要我们去修改nginx的核心配置文件,在其目录下的conf文件夹下的nginx.conf文件,那么首先我们就要了解该 ...

  5. CSS屏幕适配尺寸样式

    /* 大屏幕 :大于等于1200px*/@media (min-width: 1200px) { ... } /*默认*/@media (min-width: 980px){...} /* 平板电脑和 ...

  6. 一百零五、SAP中ALV事件之十七,让ALV表格修改后保存到数据库

    一.我们来到代码界面设置保存按钮的代码 二.i_grid_settings这个属性用来编辑单元格之后,返回给程序编辑后的值 三.我们双击点  'REUSE_ALV_GRID_DISPLAY',来到定义 ...

  7. 036-PHP闭包函数的域限制,与如何向闭包函数传递变量

    <?php // 闭包函数的域限制,与如何向闭包函数传递变量 # 隐藏上面的代码,我们最后再来试下 function demo($ATxt) { $func = function () use ...

  8. linux命令,个人的日记本

    查看所有服务 chkconfig --list service httpd status ps -aux | grep svn

  9. 吴裕雄--天生自然C++语言学习笔记:C++ 模板

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  10. CDC::DrawText详解

    函数原型 int DrawText( HDC hDC,          // 设备描述表句柄 LPCTSTR lpString, // 将要绘制的字符串 int nCount,       // 字 ...