[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$的简单路 ...
随机推荐
- groub by 与 over partition by 的区别
这个逻辑,写的很对.明白了这个意思. over partition by 前面一定要用汇总函数.groub by 就可以不用.本质都是汇总 SELECT a.* ,SUM(a.audit_status ...
- 夜雨惊风 Linux下卸载openjdk,安装jdk
1.查看java版本 1 2 3 4 [root@CFDB2 ~]# java -version openjdk version "1.8.0_171" OpenJDK Runti ...
- iframe父窗口和子窗口的调用方法
iframe 父窗口和子窗口的调用方法父窗口调用子窗口 iframe_name.iframe_document_object.object_attribute = attribute_value 例子 ...
- 应用安全-Web安全-越权漏洞整理
login->register GetPhone->GetPasswd GetPwd->GetPassword 遍历https://xx.com/contacts/new?user_ ...
- [Linux] 027 RPM 包与 源码包的区别
1. 区别 安装之前的区别: 概念上的区别 安装之后的区别: 安装位置不同 2. RPM 包安装位置 安装在默认位置中 RPM 包默认安装路径 明细 /ect 配置文件安装目录 /usr/bin/ 可 ...
- CSS实现背景图片屏幕自适应
在做登陆页面等的首页的时候,经常会遇到需要放一张背景大图的情况,并且需要图片按比例缩放,来适应不同屏幕的大小. html代码如下: <!DOCTYPE html> <html lan ...
- Java数组相关算法一
一.数组反转 1.方法一:创建新数组 int[] arr = {6,29,0,4,3}; int[] arr2 = new int[arr.length]; for (int i = 0; i < ...
- [暑假集训Day3T2]骑士问题
标准的广搜. 采用队列保存形态,如果不会广搜的可以多看看PJ知识点.由于输入多组数据,每次标记数组要清空,每次队列元素也都要清空. 参考代码如下: #include<iostream> # ...
- P2009 跑步
题目传送门 热烈庆祝SZM黄题破80,绿题破30,蓝题破20!!!(紫题还是2,,,,orz%%%) 非常水的一道最短路,小于等于100果断Floyd,要好好读题,别忘记特判,8分钟基本就能做出来啦~ ...
- [fw]Die 為什麼不能用現在完成式?
have PP是表示"從以前到現在"都直在做的事情 Mr. Chen has taught English for 30 years.---表示teach的動作持續了30年,但Mr ...