题目传送门(内部题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++

最新文章

  1. angularjs 新窗口打开
  2. python异常处理
  3. androi手机解锁引导程序
  4. FP-tree推荐算法
  5. Chrome Crx 插件下载
  6. BeX5平台简明部署过程
  7. 解决ehcache的UpdateChecker问题
  8. HDU-4089 Activation
  9. PHP安全编程:HTTP请求欺骗(转)
  10. 有空可以对C#尝一下鲜,WCF看上去很诱人(跨进程、跨机器、跨子网,跨企业网乃至跨Internet的分布式服务)
  11. 【LINUX】主进程、父进程、子进程、守护进程的概念
  12. oracle-获取数据库中所有表的注释 comments
  13. Go语言核心之美-必读
  14. nodejs 开发企业微信第三方应用入门教程
  15. mysql修改字符集
  16. [Day19]Collection接口中的子类(List集合、Set集合)
  17. NEST.net Client
  18. HDFS简单编程实例:文件合并
  19. Sass::SyntaxError related to active_admin/mixins
  20. Linux后台日志定时清理脚本

热门文章

  1. 交换机vlan配置
  2. NYOJ 654喜欢玩warcraft的ltl(01背包/常数级优化)
  3. onblur和onkeyup事件
  4. Filter 和Listener
  5. JavaScript.convertArray
  6. Waiter.js
  7. Mybatis开发中前端控制器注解@Controller 引用的类错误
  8. BZOJ 3703: 昊昊的壮举之造福社会
  9. 构建自己的AngularJS,第一部分:作用域和digest 转摘:http://www.ituring.com.cn/article/39865
  10. 【学习总结】Python-3-字符串函数split()的妙用