P2617 Dynamic Rankings

题目描述

给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\),在\(a[i],a[i+1],a[i+2],\dots,a[j]\)中第\(k\)小的数是多少\((1≤k≤j-i+1)\),并且,你可以改变一些\(a[i]\)的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列\(a\),然后读入一系列的指令,包括询问指令和修改指令。

对于每一个询问指令,你必须输出正确的回答。

输入输出格式

输入格式:

第一行有两个正整数\(n,m\)。分别表示序列的长度和指令的个数

第二行有\(n\)个数,表示\(a[1],a[2],\dots,a[n]\),这些数都小于\(10^9\)。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 \(\tt{Q \ i \ j \ k}\) 或者 \(\tt{C \ i \ t}\)

  • \(\tt{Q\ i\ j\ k}\) (\(i,j,k\)是数字,\(1≤i≤j≤n, 1≤k≤j-i+1\))表示询问指令,询问\(a[i],a[i+1],\dots,a[j]\)中第\(k\)小的数。
  • $\tt{C\ i\ t} $ \((1≤i≤n,0≤t≤10^9)\)表示把\(a[i]\)改变成为\(t\)。

输出格式:

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

说明

\(10\%\)的数据中,\(m,n\le 100\);

\(20\%\)的数据中,\(m,n≤1000\);

\(50\%\)的数据中,\(m,n≤10000\)。

对于所有数据,\(m,n≤100000\)


整体二分即可。

因为刚学,有一点想了一会儿,如何保证操作的顺序?按原顺序读进来就可以了。

常数真小啊


Code:

#include <cstdio>
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=300010;
const int inf=0x3f3f3f3f;
struct node{int op,x,y,k;}q[N],ql[N],qr[N];//类型,值,位置,1 or -1
int n,m,Q,s[N],a[N],ans[N];
void add(int x,int d){while(x<=n)s[x]+=d,x+=x&-x;}
int query(int x){int sum=0;while(x)sum+=s[x],x-=x&-x;return sum;}
void divide(int l,int r,int s,int t)
{
if(s>t) return;
if(l==r){rep(i,s,t)ans[q[i].op]=l;return;}
int lp=0,rp=0,mid=l+r>>1;
rep(i,s,t)
{
if(q[i].op)
{
int c=query(q[i].y)-query(q[i].x-1);
if(c>=q[i].k) ql[++lp]=q[i];
else qr[++rp]=q[i],qr[rp].k-=c;
}
else
{
if(q[i].x<=mid) add(q[i].y,q[i].k),ql[++lp]=q[i];
else qr[++rp]=q[i];
}
}
rep(i,s,t)
if(!q[i].op&&q[i].x<=mid) add(q[i].y,-q[i].k);
rep(i,s,s+lp-1) q[i]=ql[i+1-s];
rep(i,s+lp,t) q[i]=qr[i+1-s-lp];
divide(l,mid,s,s+lp-1),divide(mid+1,r,s+lp,t);
}
int main()
{
scanf("%d%d",&n,&m);
rep(i,1,n) scanf("%d",&q[i].x),q[i].y=i,q[i].k=1,a[i]=q[i].x;
rep(i,1,m)
{
int x,y,k;char op[3];
scanf("%s",op);
if(op[0]=='Q')
{
scanf("%d%d%d",&x,&y,&k);
q[++n]={++Q,x,y,k};
}
else
{
scanf("%d%d",&x,&y);
q[++n]={0,a[x],x,-1};
q[++n]={0,a[x]=y,x,1};
}
}
divide(-inf,inf,1,n);
rep(i,1,Q) printf("%d\n",ans[i]);
return 0;
}

2018.10.31

洛谷 P2617 Dynamic Rankings 解题报告的更多相关文章

  1. 洛谷P2617 Dynamic Rankings (主席树)

    洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...

  2. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  3. 洛谷 P2617 Dynamic Rankings || ZOJ - 2112

    写的让人看不懂,仅留作笔记 静态主席树,相当于前缀和套(可持久化方法构建的)值域线段树. 建树方法:记录前缀和的各位置的线段树的root.先建一个"第0棵线段树",是完整的(不需要 ...

  4. 洛谷$P2617\ Dynamic\ Rankings$ 整体二分

    正解:整体二分 解题报告: 传送门$w$ 阿查询带修区间第$k$小不显然整体二分板子呗,,, 就考虑先按时间戳排序(,,,其实并不需要读入的时候就按着时间戳排的鸭$QwQ$ 每次二分出$mid$先把所 ...

  5. 洛谷P2617 Dynamic Rankings

    带修主席树模板题 主席树的单点修改就是把前缀和(大概)的形式改成用树状数组维护,每个树状数组的元素都套了一个主席树(相当于每个数组的元素root[i]都是主席树,且这个主席树维护了(i - lowbi ...

  6. 洛谷P2617 Dynamic Rankings 主席树 单点修改 区间查询第 K 大

    我们将线段树套在树状数组上,查询前预处理出所有要一起移动的节点编号,并在查询过程中一起将这些节点移到左右子树上. Code: #include<cstdio> #include<cs ...

  7. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

  8. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  9. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

随机推荐

  1. 请求头(request)和响应头(response)

    说一说常见的请求头和相应头都有什么呢? 1)请求(客户端->服务端[request]) GET(请求的方式) /newcoder/hello.html(请求的目标资源) HTTP/1.1(请求采 ...

  2. 「日常训练」Card Game Cheater(HDU-1528)

    题意与分析 题意是这样的:有\(n\)张牌,然后第一行是Adam的牌,第二行是Eve的牌:每两个字符代表一张牌,第一个字符表示牌的点数,第二个表示牌的花色.Adam和Eve每次从自己的牌中选出一张牌进 ...

  3. katalon系列七:Katalon Studio全局变量

    假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ...

  4. 腾讯云API弹性公网IP踩坑

    由于自己管理的云服务器数量比较多,时不时需要更换IP,在管理台上一下下点击,实在浪费时间,于是就想到了通过API调用的方式,将更换IP一系列动作,全部集成到Python代码里面,实现一行命令,完成IP ...

  5. a链接传参的方法

    //获取分案编号 var hrefVal=window.location.href.split("?")[1]; //得到id=楼主 //console.log(hrefVal+& ...

  6. Java学习 · 初识 面向对象深入一

    面向对象深入 1.面向对象三大特征 a) 继承 inheritance 子类可以从父类继承属性和方法 子类可以提供自己的属性方法 b) 封装 encapsulation 对外隐藏某些属性和方法 对外公 ...

  7. java字符转义

    之前对java字符转义这一块稍作了解,在这里理理自己主观浅显的理解 这里会谈谈字符编码的是另一种问题和转义没有关系 以下面代码做分析 System.out.println("a". ...

  8. 基于物品的协同过滤算法(ItemCF)

    最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...

  9. 承压计算:模拟+double

    标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7                         ...

  10. LeetCode 141——环形链表

    1. 题目 2. 解答 2.1 方法 1 定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇. /** * Definition for singly-link ...