BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

1901: Zju2112 Dynamic Rankings
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 6058 Solved: 2521
[Submit][Status][Discuss]

Description
给定一个含有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。

Input
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Output
Sample Input
5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output
3
6

HINT
20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

动态维护区间第K小的模板题...套模板即可A...

代码(及模板):

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 60010
#define M 2500010
int n,q,m,tot;
int a[MAXN],t[MAXN];
int T[MAXN],lc[M],rc[M],c[M];
int S[MAXN];
struct data{int kind;int l,r,k;
}query[10010];void init_hash(int num)
{sort(t,t+num);m=unique(t,t+num)-t;
}int hash(int x)
{return lower_bound(t,t+m,x)-t;
}int build(int l,int r)
{int root=tot++;c[root]=0;if (l!=r){int mid=(l+r)/2;lc[root]=build(l,mid);rc[root]=build(mid+1,r);}return root;
}int insert(int root,int pos,int val)
{int newroot=tot++,tmp=newroot;int l=0,r=m-1;c[newroot]=c[root]+val;while (l<r){int mid=(l+r)>>1;if (pos<=mid){lc[newroot]=tot++; rc[newroot]=rc[root];newroot=lc[newroot]; root=lc[root];r=mid;}else{rc[newroot]=tot++; lc[newroot]=lc[root];newroot=rc[newroot]; root=rc[root];l=mid+1;}c[newroot]=c[root]+val;}return tmp;
}int lowbit(int x){return x&(-x);}int use[MAXN];
void add(int x,int pos,int val)
{while (x<=n){S[x]=insert(S[x],pos,val);x+=lowbit(x);}
}int sum(int x)
{int re=0;while (x>0){re+=c[lc[use[x]]];x-=lowbit(x);}   return re;
}int Query(int L,int R,int k)
{int l_root=T[L-1];int r_root=T[R];int l=0,r=m-1;for (int i=L-1; i; i-=lowbit(i)) use[i]=S[i];for (int i=R; i; i-=lowbit(i)) use[i]=S[i];while (l<r){int mid=(l+r)>>1;int tmp=sum(R)-sum(L-1)+c[lc[r_root]]-c[lc[l_root]];if (tmp>=k){r=mid;for (int i=L-1; i; i-=lowbit(i)) use[i]=lc[use[i]];for (int i=R; i; i-=lowbit(i)) use[i]=lc[use[i]];l_root=lc[l_root];r_root=lc[r_root];}else{l=mid+1;k-=tmp;for (int i=L-1; i; i-=lowbit(i)) use[i]=rc[use[i]];for (int i=R; i; i-=lowbit(i)) use[i]=rc[use[i]];l_root=rc[l_root];r_root=rc[r_root];}}return l;
}void Modify(int x,int p,int d)
{while (x<=n){S[x]=insert(S[x],p,d);x+=lowbit(x);}
}
int main()
{int test;scanf("%d",&test);while (test--){scanf("%d%d",&n,&q);tot=0;m=0;for (int i=1; i<=n; i++){scanf("%d",&a[i]);t[m++]=a[i];}char opt[10];for (int i=0; i<q; i++){scanf("%s",opt);if (opt[0]=='Q'){query[i].kind=0;scanf("%d%d%d",&query[i].l,&query[i].r,&query[i].k);}else{query[i].kind=1;scanf("%d%d",&query[i].l,&query[i].r);t[m++]=query[i].r;}}init_hash(m);T[0]=build(0,m-1);for (int i=1; i<=n; i++)T[i]=insert(T[i-1],hash(a[i]),1);for (int i=1; i<=n; i++)S[i]=T[0];for (int i=0; i<q; i++){if (query[i].kind==0)printf("%d\n",t[Query(query[i].l,query[i].r,query[i].k)]);else{Modify(query[i].l,hash(a[query[i].l]),-1);Modify(query[i].l,hash(query[i].r),1);a[query[i].l]=query[i].r;}}}return 0;
}

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346209.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动荡的 2019:数据和 AI 生态圈

来源&#xff1a;云头条这是数据领域又一个激烈动荡的年头&#xff0c;令人兴奋&#xff0c;但又错综复杂。随着越来越多的人上网&#xff0c;一切继续在加快“数据化”的步伐。这个大趋势的发展势头越来越猛&#xff0c;归因于基础设施、云计算、AI和开源各个领域取得的进步的…

卸载pytorch

1、使用conda卸载Pytorch conda uninstall pytorch conda uninstall libtorch2、使用pip卸载Pytorch pip uninstall torch 如果当初是用conda install 命令安装的pytorch&#xff0c;则用第一种方法&#xff0c;如果是用pip install命令安装的&#xff0c;则用第二种方法。或…

无线通信界的3大天王,谁能驾驭百亿台IoT设备?

来源&#xff1a;物联网智库导 读数量爆发式增长的背后&#xff0c;Wi-Fi、蓝牙、Zigbee三大无线连接技术正上演一场“争霸赛”。本文通过对三项技术的详细对比&#xff0c;以分析三项技术在具体应用场景中的优劣势。根据前瞻产业研究院发布的《2018—2023年中国物联网行业细分…

Python删除文件夹和建立文件夹

import os import shutilif os.path.isdir(dir): #判断文件夹dir是否存在shutil.rmtree(dir, True) #删除文件夹dir os.mkdir(dir) #建立文件夹dir

C++使用流进行输入输出

首先应用 #include <iostream> #include <iomanip> 1.进制读写 int val10;//十进制数 cout<<"输出8进制"<<oct<<val<<endl; cout<<"输出16进制"<<hex<<val<<endl; cout<<"输出10进…

C++学习:两个vector对象拼接

C学习&#xff1a;两个vector对象拼接 方法一&#xff1a;insert() 函数 方法二&#xff1a;重载一下号运算符 方法三&#xff1a;copy()函数 #include <iostream> #include <vector>using namespace std;// 重载一下号运算符 template <typename T> vecto…

TypeError: 'numpy.ndarray' object is not callable

取ndarray的某几个数&#xff0c;若写为&#xff1a; a np.array([0,1,2,3,4,5,6]) index np.array([1,2,3]) b a(index) print(b) 则会报错TypeError: numpy.ndarray object is not callable 正确写法为&#xff1a; a np.array([0,1,2,3,4,5,6]) index np.array([1,…

腾讯张正友:计算机视觉的三生三世

本文转载自&#xff1a;腾讯AI实验室本文将介绍腾讯 AI Lab & Robotics X 主任张正友博士在 CCF-GAIR 2019 大会上所做的报告&#xff0c;讲述计算机视觉研究的历史和未来。7 月 12 日-7 月 14 日&#xff0c;2019 第四届全球人工智能与机器人峰会&#xff08;CCF-GAIR 201…

2016年度,这40项IT技能年薪轻松超过10万美元

众所周知&#xff0c;科技行业聚集了大批高薪职位&#xff0c;但这同样也是一个快速变化的市场。今天的热门技能明天就有可能惨遭淘汰。 求职网站Dice.com最近发布了《2016薪酬调查》&#xff0c; 列举了年薪最高的各种科技技能。 Dice在2015年秋天对16301名IT专业人士进行了调…

TypeError: 'numpy.int64' object is not iterable ,'int' object is not iterable

想用一个list来动态地增加numpy类型数据&#xff0c;如下面的代码所示&#xff0c;发现报错TypeError: numpy.int64 object is not iterable a [] b np.array([1,2,3]) a.extend(b[0]) a.extend(b[1]) a.extend(b[2]) print(a) 于是将numpy数据转为list类型&#xff0c;如…

未来50亿年科学预测

来源&#xff1a;宇宙解码近期未来史现今——公元2500年公元2020年 三维全息电视将进入生活&#xff0c;人们可以通过付费点播观看。公元2025年 氢燃料电池技术将给交通运输领域带来革命&#xff0c;氢燃料电池汽车将开始中批量生产。餐桌上会出现具有肉类营养特征的植物。培养…

div无法触发blur事件解决的方法

默认情况下div无法获取焦点&#xff0c;无法触发focus与blur事件&#xff0c;推測span&#xff0c;a等标签也无法触发焦点事件(input:button。及button标签能够触发) 怎样使div触发blur事件&#xff1a;能够给div加上tabindex属性 在线演示&#xff1a;http://sandbox.runjs.cn…

OpenCV学习笔记(二):3种常用访问图像中像素的方式

OpenCV学习笔记&#xff08;二&#xff09;&#xff1a;3种常用访问图像中像素的方式 #include <opencv2/opencv.hpp>using namespace cv; using namespace std;int main() {//【1】创建原始图并显示Mat srcImage imread("F:/C/2. OPENCV 3.1.0/TEST/11.jpg"…

Detected call of `lr_scheduler.step()` before `optimizer.step()`.

在使用pytorch的指数衰减学习率时&#xff0c;出现报错UserWarning: Detected call of lr_scheduler.step() before optimizer.step(). In PyTorch 1.1.0 and later, you should call them in the opposite order: optimizer.step() before lr_scheduler.step(). Failure to d…

水题 UVA 1586 - Ancient Cipher化学式分子量计算

原题见&#xff1a;http://acm.hust.edu.cn/vjudge/contest/view.action?cid106424#overview 题目要求&#xff0c;根据所给化学量与原子量计算化学式的相对分子质量。。。其实就是怎么对应起来的事。 代码如下&#xff1a; 1 #include <stdio.h>2 //给出一种物质的分子…

【边缘计算】边缘计算元年一文看懂云边协同!九大场景带来新一轮信息革命...

来源&#xff1a;产业智能官2019 年边缘计算备受产业关注&#xff0c;一度引起了资本市场的投资热潮&#xff0c;很多人把 2019 年称作边缘计算的元年。理性来看&#xff0c;造成如此火爆局势难免有一些炒作因素在推波助澜&#xff0c;毕竟边缘计算的概念存世也已多年。当然&am…

OpenCV学习笔记(三):多通道图像分离、混合算子:split(),merge()

OpenCV学习笔记&#xff08;三&#xff09;&#xff1a;多通道图像分离、混合算子&#xff1a;split(),merge() #include <opencv2/opencv.hpp>#define BRG_BLUE_CHANNEL 0 #define BRG_GREEN_CHANNEL 1 #define BRG_RED_CHANNEL 2using namespace cv;int main(int argc…

pytorch两种常用的学习率衰减方法

阶梯式衰减 torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma0.1, last_epoch-1) 每个训练step_size个epoch&#xff0c;lr会自动乘以gamma LR 0.01 optimizer Adam(model.parameters(),lr LR) scheduler torch.optim.lr_scheduler.StepLR(optimizer,step_s…

[转]retina屏下支持0.5px边框的情况

2014-12-31更新&#xff1a;截至到IOS8.1&#xff0c;safari仍不支持supports待safari支持supports, 就可以利用0.5px了&#xff01; 2014-7-25更新&#xff1a;1. 修正dpr 1.5 机器下四角边框的缩放比例&#xff1b;2. 修正右边框&#xff08;rBor&#xff09;的transform-or…

心理所发表关于神经科学研究可信度的评论文章

来源&#xff1a;文章来源&#xff1a;心理研究所 作为人类特有的行为&#xff0c;科学研究是社会文明的重要推动力量之一。近年来&#xff0c;研究的可重复性问题成为科学关注的焦点&#xff0c;从心理科学到临床医学等领域&#xff0c;研究的可重复性成为巨大挑战。生命科学研…