题意:带修改的第K大

#include<cstdio>
#include<iostream>
#include<cstring>
#define N 400010
#define inf 1000000000
using namespace std;
int a[N],ans[N],sum[N],tmp[N],n,m,num,cnt;
struct node{
int x,y,s,k,tp,cur;
};node q[N],q1[N],q2[N];
void modify(int x,int v){
while(x<=n){
sum[x]+=v;
x+=x&(-x);
}
}
int query(int x){
int tot=;
while(x){
tot+=sum[x];
x-=x&(-x);
}
return tot;
}
void solve(int head,int tail,int l,int r){
if(head>tail)return;
if(l==r){
for(int i=head;i<=tail;i++)
if(q[i].tp==)ans[q[i].s]=l;
return;
}
int mid=l+r>>;
for(int i=head;i<=tail;i++){
if(q[i].tp==&&q[i].y<=mid)modify(q[i].x,);
if(q[i].tp==&&q[i].y<=mid)modify(q[i].x,-);
if(q[i].tp==) tmp[i]=query(q[i].y)-query(q[i].x-);
}
for(int i=head;i<=tail;i++){
if(q[i].tp==&&q[i].y<=mid)modify(q[i].x,-);
if(q[i].tp==&&q[i].y<=mid)modify(q[i].x,);
}
int l1=,l2=;
for(int i=head;i<=tail;i++){
if(q[i].tp==){
if(q[i].cur+tmp[i]>=q[i].k) q1[++l1]=q[i];
else q[i].cur+=tmp[i],q2[++l2]=q[i];
}
else {
if(q[i].y<=mid) q1[++l1]=q[i];
else q2[++l2]=q[i];
}
}
for(int i=;i<=l1;i++) q[head+i-]=q1[i];
for(int i=;i<=l2;i++) q[head+l1+i-]=q2[i];
solve(head,head+l1-,l,mid);
solve(head+l1,tail,mid+,r);
}
void work(){
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
q[++num].x=i;q[num].y=a[i];q[num].tp=;q[num].s=;
}
scanf("%d",&m);
for(int i=;i<=m;i++){
int op;scanf("%d",&op);
if(op==){
int x,y;scanf("%d%d",&x,&y);
q[++num].x=x;q[num].y=a[x];q[num].tp=;q[num].s=;
q[++num].x=x;q[num].y=y;q[num].tp=;q[num].s=;
a[x]=y;
}
else {
int x,y,k;scanf("%d%d%d",&x,&y,&k);
q[++num].x=x;q[num].y=y;q[num].k=k;q[num].tp=;q[num].s=++cnt;
}
}
solve(,num,-inf,inf);
for(int i=;i<=cnt;i++)
printf("%d\n",ans[i]);
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(ans,,sizeof(ans));
memset(tmp,,sizeof(tmp));
memset(sum,,sizeof(sum));
memset(q,,sizeof(q));
num=cnt=;
work();
}
return ;
}

Dynamic Rankings(zoj 2112)的更多相关文章

  1. Dynamic Rankings(整体二分)

    Dynamic Rankings(整体二分) 带修区间第k小.\(n,q\le 10^4\). 这次我们旧瓶装新酒,不用带修主席树.我们用整体二分!整体二分是啥东西呢? 二分答案可以解决一次询问的问题 ...

  2. Luogu P2617 Dynamic Rankings(整体二分)

    题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...

  3. [Luogu2617]Dynamic Rankings(整体二分)

    Luogu 动态区间第K大的整体二分解法 之前学主席树的时候就做了这道题(明明是树套树不是主席树啊),码量挺大而且调了我一个晚上.换成整体二分我半个小时就写完了而且一A. 写起来就是爽. 其实原理很简 ...

  4. luogu P2617 Dynamic Rankings(主席树)

    嘟嘟嘟 一句话题意:带修改区间第\(k\)小. 不修改都会,主席树板子.但是有修改就要比较深入的理解主席树了. 众所周知,主席树中以\(i\)为根的线段树维护的是\([1, i]\)这个前缀的权值,因 ...

  5. acwing1782 Dynamic Rankings (整体二分)

    和整体二分的模板相比,多了修改操作. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10,INF=1 ...

  6. Dynamic Rankings(树状数组套权值线段树)

    Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...

  7. POJ 1274 The Perfect Stall || POJ 1469 COURSES(zoj 1140)二分图匹配

    两题二分图匹配的题: 1.一个农民有n头牛和m个畜栏,对于每个畜栏,每头牛有不同喜好,有的想去,有的不想,对于给定的喜好表,你需要求出最大可以满足多少头牛的需求. 2.给你学生数和课程数,以及学生上的 ...

  8. ZOJ 2112 Dynamic Rankings(主席树の动态kth)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings ...

  9. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

随机推荐

  1. 洛谷 P1531 I Hate It

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  2. 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)

    在JavaScript里可以用ES6提供的FunctionGenerator这种黑科技来打印非波拉契数列,具体细节参考我这篇文章. 在ABAP里也有很多种方式实现这个需求. 下面这个report分别用 ...

  3. Session 机制和 Cookie 机制

    Session 机制和 Cookie 机制 HTTP协议是无状态的, 而Cookie和Session都是在无状态的基础上希望实现有状态的效果, 两者是在客户端或者是服务端使用缓存等手段来实现状态的维护 ...

  4. uva12264 Risk

    最小值最大,就二分判断. map[i] = '0'+map[i];这样更方便 每个点拆成i,i’,  S连i,cap为a[i],i’连T,cap为1(保证至少剩一个)或mid. i,i’ ,a[i] ...

  5. 简单的 创建AJax的方法

    // 简单的ajax对象 var myAjax = { // XMLHttpRequest IE7+, Firefox, Chrome, Opera, Safari : ActiveXObject I ...

  6. 爬虫5_python2_使用 Beautiful Soup 解析数据

    使用 Beautiful Soup 解析数据(感谢东哥) 有的小伙伴们对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以很方便地提取出HT ...

  7. valgrind测试程序内存泄漏问题

    1.用wincap将valgrind放入系统任意路径下,解压 2.  登录主机后台在需要测试程序的路径下运行此行命令: /opt/valgrind/bin/valgrind ./itb(例) 3. 跑 ...

  8. end和sep的使用方法

    end: 默认是换行'\n',表示以什么结尾,比如以, | \n 等 方法: 默认end = '\n' a b c 如果end = ' ' a b c sep: 默认是空格' ' 表示两个字符之间用什 ...

  9. null 理解

    值 null 特指对象的值未设置.它是 JavaScript 基本类型 之一. 语法节 null 描述节 值 null 是一个字面量,它不像undefined 是全局对象的一个属性.null 是表示缺 ...

  10. shell脚本,按行读取文件的几种方法。

    第一种方法用while实现按读取文件.[root@localhost wyb]# cat a.txt 第一行 aaaaaa 第二行 bbbbbb 第三行 cccccc 第四行 dddddd 第五行 e ...