2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem
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的更多相关文章
- 【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 ...
- ACM-ICPC 2016亚洲区域赛(沈阳站)游记(滚粗记)
首发于QQ空间和知乎,我在这里也更一下. 前言 以前高中搞竞赛的时候,经常看到神犇出去比赛或者训练之后写游记什么的,感觉萌萌哒.但是由于太弱,就没什么心情好写.现在虽然还是很弱,但是抱着享受的心情 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站汇总
球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...
- 第42届亚洲区域赛青岛站(2017icpc青岛)经验总结以及一些感想
上一次写这种东西还是天梯赛,当时打完心里也是挺激动的,然后我们队也没有去参加省赛,但是过了一段时间我还是从那里面恢复了出来.因为我当时确实还是很菜的,当时连个暴力都不会,看着自己仅过的那些百度的题目确 ...
- 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 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score
Average Score Time Limit: 2 Seconds Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...
- 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...
- 2014年acm亚洲区域赛·鞍山站
今天北京赛站的比赛也结束了···看了一天的直播之后意识到鞍山站的比赛都过去了一个多月了···这一个月比较萎靡···整天都在睡觉写报告画工图中度过··· 鞍山比哈尔滨还是暖和很多的···就是山上有奇怪的 ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation
Known Notation Time Limit: 2 Seconds Memory Limit: 65536 KB Do you know reverse Polish notation ...
随机推荐
- ActiveMQ的安装与配置详情
(1)ActiveMQ的简介 MQ: (message queue) ,消息队列,也就是用来处理消息的,(处理JMS的).主要用于大型企业内部或与企业之间的传递数据信息. ActiveMQ 是Apac ...
- 32位CPU和64位CPU 区别
操作系统只是硬件和应用软件中间的一个平台. 32位操作系统针对的32位的CPU设计. 64位操作系统针对的64位的CPU设计.操作系统只是硬件和应用软件中间的一个平台. 32位操作系统针对的32位的C ...
- HDU - 1698 Just a Hook (线段树---区间修改)
题意:n个棍子,初始值全为1,给定Q个区间,分别赋值,问n个棍子的总值. 分析:lazy标记主要体现在update上. 当l <= L && R <= r时,该结点的子结点 ...
- 配置tomcat、nginx实现反向代理(需操作)
配置tomcat.nginx实现反向代理现在我想通过nginx访问tomcat 这就要我们去修改nginx的核心配置文件,在其目录下的conf文件夹下的nginx.conf文件,那么首先我们就要了解该 ...
- CSS屏幕适配尺寸样式
/* 大屏幕 :大于等于1200px*/@media (min-width: 1200px) { ... } /*默认*/@media (min-width: 980px){...} /* 平板电脑和 ...
- 一百零五、SAP中ALV事件之十七,让ALV表格修改后保存到数据库
一.我们来到代码界面设置保存按钮的代码 二.i_grid_settings这个属性用来编辑单元格之后,返回给程序编辑后的值 三.我们双击点 'REUSE_ALV_GRID_DISPLAY',来到定义 ...
- 036-PHP闭包函数的域限制,与如何向闭包函数传递变量
<?php // 闭包函数的域限制,与如何向闭包函数传递变量 # 隐藏上面的代码,我们最后再来试下 function demo($ATxt) { $func = function () use ...
- linux命令,个人的日记本
查看所有服务 chkconfig --list service httpd status ps -aux | grep svn
- 吴裕雄--天生自然C++语言学习笔记:C++ 模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...
- CDC::DrawText详解
函数原型 int DrawText( HDC hDC, // 设备描述表句柄 LPCTSTR lpString, // 将要绘制的字符串 int nCount, // 字 ...