[CSP-S模拟测试]:大新闻(主席树)
题目传送门(内部题20)
输入格式
第一行为两个数$n,m$,意义如题所述。
接下来一行$n$个数,代表一开始$n$条大新闻的$naive$值。
接下来$m$行,每行一个操作,输入格式如下:
读入$1$,代表第一种事件。
读入$2,x$,代表第二种事件。
读入$3,l,r,k$,代表第三种事件。
输出格式
对于每一个第三种事件输出一行整数,代表答案
样例
样例输入:
6 8
2 7 4 3 5 9
3 2 5 3
1
2 4
3 1 4 2
2 6
3 1 7 5
1
3 3 6 4
样例输出:
5
4
6
9
数据范围与提示
样例解释:
初始序列为$2,7,4,3,5,9$。
询问$7,4,3,5$的第$3$小值,答案为$5$。
操作后序列变成$7,4,3,5,9$。
操作后序列变成$4,7,4,3,5,9$。
询问$4,7,4,3$的第$2$小值,答案为$4$。
操作后序列变成$6,4,7,4,3,5,9$。
询问序列$6,4,7,4,3,5,9$的第$5$小值,答案为$6$。
操作后序列变成$4,7,4,3,5,9$。
询问序列$4,3,5,9$的第$4$小值,答案为$9$。
数据范围:
对于$30\%$的数据,满足$1\leqslant n,m\leqslant 2,000$。
对于$50\%$的数据,满足$1\leqslant n,m\leqslant 30,000$。
对于$70\%$的数据,满足$1\leqslant n,m\leqslant 80,000$。
对于$100\%$的数据,满足$1\leqslant n,m\leqslant 2\times 10^5$。
保证数据合法,当没有新闻时不存在删除操作。
保证$1\leqslant naive$值$\leqslant 10^9$,保证$1\leqslant l\leqslant r\leqslant $当前新闻数,$k\leqslant r−l+1$。
题解
观察数据范围和操作,发现是主席树板子题(然而并不会打……)。
不会的先学一下主席树吧。
正解直接用的树上差分,少个$\log$。
时间复杂度:$(n+m)\log^2n$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[200001],root[500000],tot;
int trsum[10000001],lson[10000001],rson[10000001];
void insert(int &x,int pre,int l,int r,int w)
{
x=++tot;
trsum[x]=trsum[pre]+1;
lson[x]=lson[pre];
rson[x]=rson[pre];
if(l==r)return;
int mid=(l+r)>>1;
if(w<=mid)insert(lson[x],lson[pre],l,mid,w);
else insert(rson[x],rson[pre],mid+1,r,w);
}
int ask(int x,int pre,int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)>>1;
if(trsum[lson[x]]-trsum[lson[pre]]>=k)return ask(lson[x],lson[pre],l,mid,k);
else return ask(rson[x],rson[pre],mid+1,r,k-trsum[lson[x]]+trsum[lson[pre]]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=n;i;i--)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
insert(root[i],root[i-1],1,1<<30,a[i]);
while(m--)
{
int opt;
scanf("%d",&opt);
switch(opt)
{
case 1:n--;break;
case 2:
int x;
scanf("%d",&x);
n++;
insert(root[n],root[n-1],1,1<<30,x);
break;
case 3:
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",ask(root[n-l+1],root[n-r],1,1<<30,k));
break;
}
}
return 0;
}
rp++
[CSP-S模拟测试]:大新闻(主席树)的更多相关文章
- [CSP-S模拟测试]:序列(主席树)
题目描述 小$A$把自己之前得到的序列展示给了小$B$,不过这一次,他并不要求小$B$模仿他之前的行为.他给了小$B$一些询问,每个询问都是$l\ r\ x$的形式,要求小$B$数出在序列的第$l$个 ...
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...
- zoj2112 主席树动态第k大 (主席树&&树状数组)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 静态区间第k大(主席树)
POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...
- POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...
- 7.18 NOIP模拟测试5 星际旅行+砍树+超级树
T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...
- [CSP-S模拟测试]:Weed(线段树)
题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...
- [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)
题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...
- [CSP-S模拟测试]:big(Trie树+贪心)
题目描述 你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$.在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时.异或一些数后或是最后),将$x$ ...
随机推荐
- Linux下jdk1.6安装指引
Linux安装JDK步骤1. 先从网上下载jdk(jdk-6u4-linux-x64-rpm.bin) ,推荐SUN的官方网站www.sun.com,下载后放在/home目录中,当然其它地方也行. 进 ...
- Jenkins 官网文档翻译汇总
Jenkins 官网地址 Jenkins 官网文档地址 用户手册 安装 Jenkins 使用 Jenkins 使用凭证 Pipeline 流水线 开始使用 Pipeline 使用 Jenkinsfil ...
- 2019/11/09 TZOJ
1001 Interesting Integers http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail& ...
- Postman初接触
https://www.getpostman.com/docs/postman/launching_postman/installation_and_updates
- luoguP2123 皇后游戏(贪心)
luoguP2123 皇后游戏(贪心) 题目 洛谷题目chuanso 题解 有一篇好题解,我就懒得推式子了,毕竟打到电脑上还是很难的 牛逼题解传送门 code #include<iostream ...
- Linux服务器安全配置小结(转)
众所周知,网络安全是一个非常重要的课题,而服务器是网络安全中最关键的环节.Linux被认为是一个比较安全的Internet服务器,作为一种开放源代码操作系统,一旦Linux系统中发现有安全漏洞,Int ...
- python开发之路-day02
一.数据类型 1 什么是数据? name='sunkedong'#字符串类型 age=24 #整型 date=2017.9#浮点型 dic={'name':'sunkedong','age':16}# ...
- spring(六):spring中AOP的基本使用
AOP:面向切面编程[底层使用动态代理实现],就是在运行期间动态的将某段代码切入到方法的指定位置进行运行的编程方式 基本使用 使用AOP功能需要引入spring的aop以及aspects相关包 < ...
- @Profile使用及SpringBoot获取profile值
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Fmuma/article/details ...
- tensorflow教程:tf.contrib.rnn.DropoutWrapper
tf.contrib.rnn.DropoutWrapper Defined in tensorflow/python/ops/rnn_cell_impl.py. def __init__(self, ...