【题目分析】

上次用树状数组套主席树做的,这次用整体二分去水。

把所有的查询的结果一起进行二分,思路很好。

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;

#define maxn 100005
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

struct node{
    int x,y,k;
    int id,opt;
    void print() {
        printf("%d %d %d %d %d\n", x, y, k, id, opt);
    }
}now;

int n,m,a[maxn],ans[maxn];
char s[15];
node q[maxn<<1],q1[maxn],q2[maxn];
int cnt=0,bit[maxn<<1],tot=0;

void add(int x,int f)
{
//  printf("add %d %d\n",x,f);
    for (;x<=n;x+=x&-x) bit[x]+=f;
}

int sum(int x)
{
    int ret=0;
//  printf("sum %d ",x);
    for (;x;x-=x&-x) ret+=bit[x];
//  printf("is %d\n",x,ret);
    return ret;
}

void solve(int ql,int qr,int l,int r)
{
//  printf("solve %d %d %d %d\n",ql,qr,l,r);
    if (ql>qr) return ;
    if (l==r)
    {
        for (int i=ql;i<=qr;++i)
            if (q[i].opt==2) ans[q[i].id]=l;
        return;
    }
    int mid=l+r>>1,p1=0,p2=0;
    for (int i=ql;i<=qr;++i)
    {
        if (q[i].opt==1)
        {
            if (q[i].x<=mid)
            {
                add(q[i].id,q[i].y);
                q1[++p1]=q[i];
            }
            else q2[++p2]=q[i];
        }
        else
        {
            int tmp=sum(q[i].y)-sum(q[i].x-1);
//          printf("tmp is %d\n");
            if (q[i].k<=tmp) q1[++p1]=q[i];
            else
            {
//              cout<<q[i].x<<" "<<q[i].y<<"goto r "<<endl;
                q[i].k-=tmp;
                q2[++p2]=q[i];
            }
        }
    }
    for (int i=1;i<=p1;++i)
        if (q1[i].opt==1)
            add(q1[i].id,-q1[i].y);
    for (int i=1;i<=p1;++i) q[ql+i-1]=q1[i];
    for (int i=1;i<=p2;++i) q[ql+p1+i-1]=q2[i];
//  getchar();
    solve(ql,ql+p1-1,l,mid);
    solve(ql+p1,qr,mid+1,r);
}

int main()
{
    n=read();m=read();
    for (int i=1;i<=n;++i)
    {
        a[i]=now.x=read();now.y=1;now.k=inf;
        now.id=i; now.opt=1;
        q[++cnt]=now;
    }
    for (int i=1;i<=m;++i)
    {
        scanf("%s",s);
        if (s[0]=='Q')
        {
            now.x=read();now.y=read();now.k=read();
            now.id=++tot;now.opt=2;
            q[++cnt]=now;
        }
        else
        {
            int xx=read();
            now.x=a[xx];now.y=-1;now.k=inf;now.id=xx;now.opt=1;
            q[++cnt]=now;
            a[xx]=read();
            now.x=a[xx];now.y=1;now.k=inf;now.id=xx;now.opt=1;
            q[++cnt]=now;
        }
    }
//  for (int i=1;i<=cnt;++i) q[i].print();
    solve(1,cnt,0,inf);
    for (int i=1;i<=tot;++i) printf("%d\n",ans[i]);
}

  

BZOJ 1901 Zju2112 Dynamic Rankings ——整体二分的更多相关文章

  1. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  2. Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6471  Solved: 2697[Su ...

  3. BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )

    BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...

  4. BZOJ 1901 Zju2112 Dynamic Rankings

    树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memor ...

  5. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  6. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  7. BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )

    裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...

  8. bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  9. bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】

    整体二分: 对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位 ...

随机推荐

  1. 微信支付官方.net版之坑你没商量

    最近开始弄支付这块,先是支付宝手机网站支付,也是坑了我许久,不过还好,问题不大. 让我们看看微信支付有多少坑 微信商户平台,你们知道么(我前天才知道,别笑我) 登录地址:https://mch.wei ...

  2. Android笔记:菜单

    1.按键调出菜单 public boolean onCreateOptionsMenu(Menu menu) 重写建立菜单方法 public boolean onOptionsItemSelected ...

  3. supersr--图形上下文的注意点

    - (void)test { // 不要自己调用drawRect:方法的原因: // 当系统调用drawRect:方法之前, 会创建一个与当前UIView的layer相关的图形上下文, 这样就可以保证 ...

  4. ios layer 动画-(transform.rotation篇)

    x轴旋转: CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"tra ...

  5. 矿场搭建(codevs 1996)

    题目描述 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使 ...

  6. Genesis不能运行Perl编译后的脚本

    我们经常会遇到Genesis2000中C-shell的脚本不能正常运行的问题,而同样的程序在其它电脑上又可以正常运行,如果你能看看Genesis后台窗口,也就是后面那个黑乎乎的窗口(所谓的小DOS窗口 ...

  7. solrconfig.xml和schema.xml说明

    1.   solrconfig.xml solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置. 1.1.  datadir节点 ...

  8. Linux Shell多命令执行

    有三种: :只是顺序执行,命令之间没有任何关联,不相互影响.如  ls;date;cd /etc/ 如,创建100M的文件. && 命令之间有关系,只有前一条命令正确执行才会执行下面一 ...

  9. 1 Ionic和Hybird应用介绍

    1.Ionic是什么,它和Angular.Cordova有什么关系? Ionic通过整合各种技术和功能使构建Hybird应用更加快速.容易和美观.Ionic生态系统基于Angular和Cordova, ...

  10. EF – 8.多对多关联

    5.6.10 <多对多关联(上)> 时长:9分57秒 难度:难 5.6.11<多对多关联(下)> 时长:8分50秒 难度:难 如果单独地把多对多关联的CRUD拿出来讲,确实比较 ...