[CSP-S模拟测试]:序列(主席树)
题目描述
小$A$把自己之前得到的序列展示给了小$B$,不过这一次,他并不要求小$B$模仿他之前的行为。他给了小$B$一些询问,每个询问都是$l\ r\ x$的形式,要求小$B$数出在序列的第$l$个到第$r$个元素中有多少是不小于$x$的。小$B$很快就算出来了。小$A$很不甘心,于是要求动态修改这个序列......这样,他只要求每次修改后求出所有询问答案的和即可。然而小$B$还是很快就算出来了,小$A$很生气,于是把问题抛给了你。
输入格式
由于一些原因,本题采取一定的方式加密了修改操作。
第一行三个整数$n\ m\ q$,分别表示序列长度、询问个数和修改次数。第二行$n$个正整数描述序列。接下来$m$行每行三个数$l\ r\ x$,表示一次询问。最后$q$行每行两个数$p\ v$,表示把$p\text{^}lastans$这个位置上的数修改成$v\text{^}lastans$(其中$lastans$指上次修改之后的答案,初始即为没有修改过的原序列的询问答案,$\text{^}$为异或符号,$C/C++$中为$\text{^}$,$pascal$中为$xor$)。
输出格式
$q+1$行每行一个整数,第一行表示原序列的所有询问答案之和,后面$q$行表示每次修改之后的序列的所有询问答案之和。
样例
样例输入:
4 2 2
1 4 2 3
2 4 3
1 3 2
6 6
2 7
样例输出:
4
3
4
数据范围与提示
对于$20\%$的数据,$n,m,q\leqslant 100$
对于$40\%$的数据,$n,m,q\leqslant 1,000$
对于$100\%$的数据,$n,m,q\leqslant 100,000$,序列中的数(包括修改后的)
均为正数且不超过$n$,保证数据合法。
题解
先来考虑如何优化暴力,我们每改变一个点,这个点只会给包含它的区间做贡献。
那么,我们考虑如何快速求出每一个点对答案的贡献。
考虑主席树,对于每一个点建立一棵主席树,点的编号为$x$,对于询问的$l$,我们将其$x$点点权$+1$;对于询问的$r$,我们将点$r+1$的$x$点$-1$,表示删掉了这个询问。
预处理的过程只需要继承上一个点的树即可。
对于修改,我们可以先计算出来原来的贡献,将其减去;再计算现在的贡献,加上去即可。
时间复杂度:$\Theta((q+n)\log m)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int a[100001];
int root[100001],tr[4000000],ls[4000000],rs[4000000],cnt;
long long ans;
vector<pair<int,int> > question[100001];
void add(int &x,int pre,int l,int r,int w,int k)
{
x=++cnt;
if(l==r)
{
tr[x]=tr[pre]+k;
return;
}
int mid=(l+r)>>1;
if(w<=mid)
{
add(ls[x],ls[pre],l,mid,w,k);
rs[x]=rs[pre];
}
else
{
add(rs[x],rs[pre],mid+1,r,w,k);
ls[x]=ls[pre];
}
tr[x]=tr[ls[x]]+tr[rs[x]];
}
int ask(int x,int l,int r,int L,int R)
{
if(r<L||R<l)return 0;
if(L<=l&&r<=R)return tr[x];
int mid=(l+r)>>1;
return ask(ls[x],l,mid,L,R)+ask(rs[x],mid+1,r,L,R);
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
question[l].push_back(make_pair(x,1));
question[r+1].push_back(make_pair(x,-1));
}
for(int i=1;i<=n;i++)
{
root[i]=root[i-1];
for(int j=0;j<question[i].size();j++)
add(root[i],root[i],0,n,question[i][j].first,question[i][j].second);
ans+=ask(root[i],0,n,0,a[i]);
}
printf("%lld\n",ans);
while(q--)
{
int p,v;scanf("%d%d",&p,&v);
p^=ans;v^=ans;
ans-=ask(root[p],0,n,0,a[p]);
ans+=ask(root[p],0,n,0,v);
a[p]=v;
printf("%lld\n",ans);
}
return 0;
}
rp++
[CSP-S模拟测试]:序列(主席树)的更多相关文章
- dfs序 线段树 dfs序列 主席树
并查集 #include<stdio.h> ]; void sset(int x) { ;i<=x;i++) stt[i]=i; } int ffind(int x) { if(x= ...
- [CSP-S模拟测试]:树(树上上升序列+主席树+线段树)
题目传送门(内部题78) 输入格式 第一行输入两个整数$n,q$,表示节点数和询问数. 第二行输入$n$个整数$w_i$,表示第$i$个点的智商. 第三行至第$n+1$行每行输入两个数$x,y$,表示 ...
- bzoj 3744: Gty的妹子序列 主席树+分块
3744: Gty的妹子序列 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 101 Solved: 34[Submit][Status] Descr ...
- 2018.10.16 NOIP模拟 长者(主席树+hash)
传送门 考试的时候开始sb的以为需要可持久化trietrietrie树,发现建树时空都是O(n2)O(n^2)O(n2)的. 然后发现由于每次只从原来的字符串改一个字符. 因此直接主席树维护区间has ...
- [CSP-S模拟测试]:序列(二分答案+树状数组)
题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...
- 【NOI模拟】谈笑风生(主席树)
题目描述 设 T 为一棵有根树,我们做如下的定义: 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称 “ a 比 b 不知道高明到哪里去了 ” . 设 a 和 b 为 T 中 ...
- [07/18NOIP模拟测试5]超级树
鬼能想到的dp定义:dp[i][j]表示在一棵i级超级树中,有j条路径同时存在且这j条路径没有公共点时,可能的情况数 刚开始我也没看懂,所以举个例子 如一个2级的超级树,父节点为1,左右儿子为2,3 ...
- [CSP-S模拟测试]:序列(构造)
题目描述 给定$N,A,B$,构造一个长度为$N$的排列,使得:$\bullet$排列长度为$N$:$\bullet$最长上升子序列长度为$A$:$\bullet$最长下降子序列长度为$B$.我们有$ ...
- [CSP-S模拟测试]:Walk(树的直径+数学)
题目描述 给定一棵$n$个节点的树,每条边的长度为$1$,同时有一个权值$w$.定义一条路径的权值为路径上所有边的权值的最大公约数.现在对于任意$i\in [1,n]$,求树上所有长度为$i$的简单路 ...
随机推荐
- Oracle系列:触发器、作业、序列、连接
.Net程序员学用Oracle系列(8):触发器.作业.序列.连接 1.触发器 2.作业 2.1.作业调度功能和应用 2.2.通过 DBMS_JOB 来调度作业 3.序列 3.1.创建序列 3.2 ...
- Android深度探索-卷1第七章心得体会
创建LED驱动的设备文件 第一步:使用cdev_init函数初始化cdev 第二步:指定设备号.直接在代码指定或动态分配 第三步:使用cdev_add函数将字符设备添加到内核中的字符设备数组中 第四步 ...
- 5G网络的深度强化学习:联合波束成形,功率控制和干扰协调
摘要:第五代无线通信(5G)支持大幅增加流量和数据速率,并提高语音呼叫的可靠性.在5G无线网络中共同优化波束成形,功率控制和干扰协调以增强最终用户的通信性能是一项重大挑战.在本文中,我们制定波束形成, ...
- python-MySQL数据库--- 基础篇
MySQL数据库基础 数据库系统(database system) 1.数据库系统(database system) 数据库系统是计算机系统中一种专门管理数组资源的系统,数据库存储的是 ...
- python学习第十三天元组创建和操作方法
有人问,有了列表,为什么还要有元组呢,到底元组是什么,元组是不可变的有序的列表,一旦创建不能改变,那些地方用到元组呢,小编知道可以应用到数据库连接. 1,元组的创建 n1 = () 元组用的是小括号 ...
- QImage 如何和 Tensor 相互转换?
torch::Tensor fromQImage(QImage image) { int width = image.width(); int height = image.height(); int ...
- Node.js 中监听 redis key 过期事件
It is in fact possible to listen to the “expired” type keyevent notification using a subscribed clie ...
- MapReduce的序列化机制
MapReduce自己实现了一套序列化机制,通过实现Writable接口, 重写DateInput和DateOutPut方法,实现数据的序列化和反序列化, 相比于JDK自带的序列化,MapReduce ...
- 【linux 进程杀死】批量杀死进程
一次杀死包含 api_antispan 开头的的所有进程 https://blog.csdn.net/u013421629/article/details/83512498
- kafka2.3集群搭建
环境: 3台centos7.4 3台zookeeper3.4.14 1. wget http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.11-2.3 ...