P2617 Dynamic Ranking
时间:2022-05-08
本文章向大家介绍P2617 Dynamic Ranking,主要内容包括题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述
给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。
对于每一个询问指令,你必须输出正确的回答。
输入输出格式
输入格式:
第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。
第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t
- Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。
- C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。
输出格式:
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
输入输出样例
输入样例#1:
5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
输出样例#1:
3
6
说明
20%的数据中,m,n≤100;
40%的数据中,m,n≤1000;
100%的数据中,m,n≤10000。
来源:bzoj1901
本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。
待修改的主席树,
裸的主席树修改很麻烦,
所以我们换一下思路。
用树状数组维护值,主席树只维护位置,
不要忘了离散化
1 #include<cstdio>
2 #include<algorithm>
3 #define lowbit(x) (x)&(-x)
4 using namespace std;
5 const int MAXN=2000001;
6 inline void read(int &n){char c='+';bool flag=0;n=0; while(c<'0'||c>'9') c=='-'?flag=1,c=getchar():c=getchar(); while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();flag==1?n=-n:n=n;}
7 int n,m,a[MAXN],/*原始序列 */di[MAXN],totnum;;
8 int root[MAXN],/* 根节点的编号*/totroot; int qx[MAXN],qxnum,qy[MAXN],qynum;
9 struct caozuo{int a,b,c;}ask[MAXN];
10 struct node{int ls,rs,size;}tree[MAXN];
11 void insert(int &rt,int l,int r,int pre,int pos,int how)
12 {
13 if(!rt) rt=++totroot; tree[rt].size=tree[pre].size+how;tree[rt].ls=tree[pre].ls;tree[rt].rs=tree[pre].rs;
14 if(l==r) return ;
15 int mid=(l+r)>>1;
16 if(pos<=mid) insert(tree[rt].ls,l,mid,tree[pre].ls,pos,how);
17 else insert(tree[rt].rs,mid+1,r,tree[pre].rs,pos,how);
18 }
19 void add(int pos,int how)//how表示是加还是减
20 {
21 int k=lower_bound(di+1,di+totnum+1,a[pos])-di;
22 for(int i=pos;i<=n;i+=lowbit(i)) insert(root[i],1,totnum,root[i],k,how);
23 }
24 int query(int l,int r,int num)
25 {
26 if(l==r) return l;
27 int mid=(l+r)>>1; int sum=0;
28 for(int i=1;i<=qxnum;i++) sum-=tree[tree[qx[i]].ls].size;
29 for(int i=1;i<=qynum;i++) sum+=tree[tree[qy[i]].ls].size;
30 for(int i=1;i<=qxnum;i++) qx[i]=num<=sum?tree[qx[i]].ls:tree[qx[i]].rs;;
31 for(int i=1;i<=qynum;i++) qy[i]=num<=sum?tree[qy[i]].ls:tree[qy[i]].rs;
32 return num<=sum?query(l,mid,num):query(mid+1,r,num-sum);
33 }
34 int main()
35 {
36 read(n);read(m);
37 for(int i=1;i<=n;i++) read(a[i]),di[++totnum]=a[i];
38 for(int i=1;i<=m;i++)
39 {
40 char c[3];scanf("%s",c);
41 read(ask[i].a);read(ask[i].b);
42 if(c[0]=='Q') read(ask[i].c);else di[++totnum]=ask[i].b;
43 }
44 sort(di+1,di+totnum+1);totnum=unique(di+1,di+totnum+1)-di;// 离散化
45 for(int i=1;i<=n;i++) add(i,1);// 把每一个数都加入到树状数组中
46 for(int i=1;i<=m;i++)
47 {
48 if(ask[i].c)
49 {
50 qxnum=qynum=0;
51 for(int j=ask[i].a-1;j;j-=lowbit(j)) qx[++qxnum]=root[j];
52 for(int j=ask[i].b;j;j-=lowbit(j)) qy[++qynum]=root[j];
53 printf("%dn",di[query(1,totnum,ask[i].c)]);
54 }
55 else add(ask[i].a,-1),a[ask[i].a]=ask[i].b,add(ask[i].a,1);
56 }
57 return 0;
58 }
- Hybris 项目工程配置
- 购物车案例【简单版】
- 再学习之MyBatis.
- 用户登陆注册【JDBC版】
- 学习思考之《编程之美》.
- 干货 | 深度剖析服务发现组件Netflix Eureka
- 多线程编程学习一(Java多线程的基础).
- TensorFlow | 自己动手写深度学习模型之全连接神经网络
- 多线程编程学习二(对象及变量的并发访问).
- ASM基本配置问题(r5笔记第89天)
- 如何上手使用 Facebook 的开源平台 Detectron?
- 多线程编程学习三(线程间通信).
- 关于create database语句在10g,11g中的不同(r5笔记第88天)
- Web开发模式【Mode I 和Mode II的介绍、应用案例】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档
- PUMA560机器人工具箱运动控制A:路径规划-运动学
- Android 3分钟带你入门开发测试
- Spring Boot 知识清单(一)SpringApplication
- Linux下的IO监控与分析
- pytorch+Unet图像分割:将图片中的盐体找出来
- html 用浏览器打开中文乱码解决方法
- SQLServer 数据库字符集、版本号sql语句查询语法
- chrome 浏览器自保留端口、安全端口有哪些?chrome不能访问某个端口的环境网址,但是其它的浏览器可以访问原因及解决办法。
- MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法
- MobaXterm工具连接Linux服务器入门使用手册,国产化泰山服务器连接工具使用演示
- Linux 服务器配置信息查询方法,国产化申威服务器配置信息查看演示
- 达梦数据库、oracle数据库如何判断指定表有没有建立索引?对应的表有没有索引查询方法
- Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
- 不支持图形化界面的Linux系统如何显示图像化界面?飞腾服务器显示图像化界面方法,DISPLAY environment variable is undefined问题解决方法