【BZOJ1901】Zju2112 Dynamic Rankings
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
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
6
HINT
20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。
Source
依旧是模板,树状数组套主席树比较神奇,每个树状数组做一颗主席树,感觉树状数组学得不好啊。。。将时间提高到了nlog2n,注意离线的写法。
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int sum[],ls[],rs[],root[],A[],B[],C[],num[],hash[],v[],L[],R[],flag[];
- int n,m,nt,numt,sz,a,b;
- int lowbit(int x){return x&(-x);}
- int find(int x)
- {
- int l=,r=nt,mid;
- while (l<=r)
- {
- mid=(l+r)>>;
- if (hash[mid]<x) l=mid+;
- else r=mid-;
- }
- return l;
- }
- void updata(int l,int r,int x,int &y,int p,int w)
- {
- y=++sz;
- sum[y]=sum[x]+w;
- ls[y]=ls[x]; rs[y]=rs[x];
- if (l==r) return;
- int mid=(l+r)>>;
- if (p<=mid) updata(l,mid,ls[x],ls[y],p,w);
- else updata(mid+,r,rs[x],rs[y],p,w);
- }
- int query(int l,int r,int k)
- {
- if (l==r) return l;
- int suml=,sumr=;
- for (int i=;i<=a;i++) suml+=sum[ls[L[i]]];
- for (int i=;i<=b;i++) sumr+=sum[ls[R[i]]];
- int mid=(l+r)>>;
- if (sumr-suml>=k)
- {
- for (int i=;i<=a;i++) L[i]=ls[L[i]];
- for (int i=;i<=b;i++) R[i]=ls[R[i]];
- return query(l,mid,k);
- }
- else
- {
- for (int i=;i<=a;i++) L[i]=rs[L[i]];
- for (int i=;i<=b;i++) R[i]=rs[R[i]];
- return query(mid+,r,k-(sumr-suml));
- }
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for (int i=;i<=n;i++)
- {
- scanf("%d",&v[i]);
- num[++numt]=v[i];
- }
- for (int i=;i<=m;i++)
- {
- char s[];
- scanf("%s",s);
- scanf("%d%d",&A[i],&B[i]);
- if (s[]=='Q') {scanf("%d",&C[i]);flag[i]=;}
- else num[++numt]=B[i];
- }
- sort(num+,num+numt+);
- hash[++nt]=num[];
- for (int i=;i<=numt;i++)
- if (num[i]!=num[i-])
- hash[++nt]=num[i];
- for (int i=;i<=n;i++)
- {
- int t=find(v[i]);
- for (int j=i;j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,);
- }
- for (int i=;i<=m;i++)
- {
- if (flag[i])
- {
- a=,b=;
- int xx;
- A[i]--;
- for (int j=A[i];j>=;j-=lowbit(j)) L[++a]=root[j];
- for (int j=B[i];j>=;j-=lowbit(j)) R[++b]=root[j];
- xx=query(,nt,C[i]);
- printf("%d\n",hash[xx]);
- }
- else
- {
- int t=find(v[A[i]]);
- for (int j=A[i];j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,-);
- v[A[i]]=B[i];
- t=find(B[i]);
- for (int j=A[i];j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,);
- }
- }
- return ;
- }
【BZOJ1901】Zju2112 Dynamic Rankings的更多相关文章
- 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
[BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...
- 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)
[题意] 给定一个含有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 ...
- 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组
题目描述 给定一个含有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≤ ...
- 【BOZJ 1901】Zju2112 Dynamic Rankings
Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...
- 【bzoj 1901】Zju2112 Dynamic Rankings
Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...
- 【ZOJ】2112 Dynamic Rankings
树状数组套主席树模板题目. /* 2112 */ #include <iostream> #include <sstream> #include <string> ...
- bzoj1901:Zju2112 Dynamic Rankings
思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久 ...
- BZOJ1901:Zju2112 Dynamic Rankings——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序 ...
随机推荐
- HTML+CSS页面滚动效果处理
HTML+CSS代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> ...
- SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer
Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里 ...
- 微软改名部再次大显神威——ASP.NET 5改名ASP.NET Core 1.0
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在计算机科学领域只有两件难事:缓存不可用和命名.--Phil Karlton 今天,S ...
- h264 profile & level
转自:http://blog.csdn.net/sphone89/article/details/17492433 H.264 Profiles H.264有四种profile,每个profile支持 ...
- Java Data Type
官方文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 转载地址:http://blog.csdn.n ...
- Sizeof运算符小结
以下内容援引自<C Primer Plus>中文版第五版Page95 Sizeof运算符以字节为单位返回其操作数的大小.(在C中,1个字节被定义为char类型所占用空间的大小.在过去,1个 ...
- C#中var和dynamic
var与dynamic这两个关键字,只是看起来很相似,仅此而已!var表示“变量的类型是在编译时决定的”,但是dynamic表 示“变量的类型是在运行时决定的”.因此,dynamic与var具有截然不 ...
- 用C#基于WCF创建TCP的Service供Client端调用
本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...
- java中的三种取整函数
舍掉小数取整:Math.floor(3.5)=3 四舍五入取整:Math.rint(3.5)=4 进位取整:Math.ceil(3.1)=4
- 如何通过java代码对kylin进行cube build
通常是用于增量 代码如下: package com.dlht.kylinDemo; import java.io.BufferedReader; import java.io.FileNotFound ...