【题目分析】

整体二分显而易见。

自己YY了一下用树状数组区间修改,区间查询的操作。

又因为一个字母调了一下午。

貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log

懒得写了。

【代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 50005
#define inf 0x3f3f3f3f
#define ll long long 

ll n,m,cnt=0,tot=0;

struct Bit_Tree{
    ll a[maxn],b[maxn];
    void add(ll x,ll y,ll z)
    {
//      cout<<"Add "<<x<<" "<<y<<" "<<z<<endl;
        for (ll i=x;i<=n;i+=i&(-i)) b[i]+=z;
        for (ll i=y+1;i<=n;i+=i&(-i)) b[i]-=z;
        for (ll i=x;i<=n;i+=i&(-i)) a[i]+=(n-x)*z;
        for (ll i=y+1;i<=n;i+=i&(-i)) a[i]-=(n-y-1)*z;
    }
    void init()
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
    }
    ll getsum(ll x)
    {
        ll ret=0,tmp=0;
        for (ll i=x;i;i-=i&(-i)) ret+=a[i],tmp+=b[i];
        return ret-(n-x-1)*tmp;
    }
    ll get(ll x,ll y)
    {
        return getsum(y)-getsum(x-1);
    }
}t;

struct data{
    ll opt,id;
    ll x,y,z;
}q[maxn<<1],q1[maxn<<1],q2[maxn<<1];

ll ans[maxn<<1],tag[maxn<<1];

void solve(ll ql,ll qr,ll l,ll r)
{
//  cout<<"solve"<<ql<<" "<<qr<<" "<<l<<" "<<r<<endl;
//  cout<<"In Que"<<endl;
    if (ql>qr) return;
    if (l==r)
    {
        for (ll i=ql;i<=qr;++i) ans[q[i].id]=l;
        return ;
    }
    ll mid=l+r>>1,p1=0,p2=0,cnt=0;
//    cout<<"Mid is "<<mid<<endl;
    for (ll i=ql;i<=qr;++i)
    {
//      cout<<q[i].opt<<" "<<q[i].x<<" "<<q[i].y<<" "<<q[i].z<<" "<<endl;
        if (q[i].opt==1)
        {
            if (q[i].z<=mid)
            {
                t.add(q[i].x,q[i].y,1);
                cnt+=q[i].y-q[i].x+1;
                q1[++p1]=q[i];
            }
            else q2[++p2]=q[i];
        }
        else
        {
            ll tmp=t.get(q[i].x,q[i].y);
//            cout<<"Tmp is "<<tmp<<endl;
            if (q[i].z<=tmp) q1[++p1]=q[i];
            else q[i].z-=tmp,q2[++p2]=q[i];
        }
    }
    for (ll i=1;i<=p1;++i)
    {
        if (q1[i].opt==1) t.add(q1[i].x,q1[i].y,-1);
        q[ql+i-1]=q1[i];
    }
    for (ll i=1;i<=p2;++i) q[ql+p1+i-1]=q2[i];
    solve(ql,ql+p1-1,l,mid);
    solve(ql+p1,qr,mid+1,r);
}

int main()
{
//  freopen("in.txt","r",stdin);
//  freopen("wa.txt","w",stdout);
    scanf("%lld",&n);
    n=maxn-1;
    scanf("%lld",&m);
    cnt=m;
    for (ll i=1;i<=m;++i)
    {
        scanf("%lld%lld%lld%lld",&q[i].opt,&q[i].x,&q[i].y,&q[i].z);
        q[i].id=i;
        if (q[i].opt==1) t.add(q[i].x,q[i].y,1);
        if (q[i].opt==2)
        {
            tag[i]=1;
            tot=t.get(q[i].x,q[i].y);
            q[i].z=tot-q[i].z+1;
        }
    }
    for (ll i=1;i<=m;++i)
        if (q[i].opt==1)
            t.add(q[i].x,q[i].y,-1);
    solve(1,cnt,-inf,inf);
    for (ll i=1;i<=m;++i)
        if (tag[i])
            printf("%lld\n",ans[i]);
}

  

BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分的更多相关文章

  1. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  2. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...

  3. BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)

    和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...

  4. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

  5. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  6. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  7. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  8. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  9. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

随机推荐

  1. SQL汉字转拼音函数-支持首字母、全拼

    SQL汉字转拼音函数-支持首字母.全拼 FROM :http://my.oschina.net/ind/blog/191659 作者不详 --方法一sqlserver汉字转拼音首字母 --调用方法 s ...

  2. Altium Designer 的entry sheet ,offsheet和port作用(转载)

    1.图纸结构 图纸包括两种结构关系: 一种是层次式图纸,该连接关系是纵向的,也就是某一层次的图纸只能和相邻的上级或下级有关系: 另一种是扁平式图纸,该连接关系是横向的,任何两张图纸之间都可以建立信号连 ...

  3. Jetty+Xfire 嵌入式webService应用实践

    1:使用场景:Mock公安网证件信息校验 2:Jetty嵌入式Server启动方式:由于Jetty9.x(需jdk7.x以上)以后Server启动方式有略微差异,所以分开说明: 2.1 Jetty9. ...

  4. WinForm下增加声音提示

    在WinForm平台下播放声音,一般有两种方式:第一种是调用系统自带声音: [代码] 申明定义: [DllImport("kernel32.dll")] public static ...

  5. soft-margin SVM

    1. soft-margin SVM的形式 其中ξn表示每个点允许的犯错程度(偏离margin有多远),但是犯错是有代价的,也就是目标函数里面要最小化的.c控制对犯错的容忍程度. 2. 推导soft ...

  6. Java对象的深拷贝和浅拷贝、集合的交集并集

    http://blog.csdn.net/lian_1988/article/details/45970927 http://www.cnblogs.com/yxnchinahlj/archive/2 ...

  7. redis lua

    需求是在缓存最近一周内用户所有消息列表,考虑用Redis 存储:为每个存储一个独立Sorted Set,value 为消息体,Score 为MessageId,用以实现增量消息同步. 问题就来了:So ...

  8. maven中classpath路径(转)

    前几天看见一个大神总结classpath文章,觉得特别有用.所以,特此转载(http://my.oschina.net/GivingOnenessDestiny/blog/603505) 各种path ...

  9. iOS CoreData 中 objectID 的不变性

    关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...

  10. DIV+CSS布局

    宽度自适应两列布局 <!DOCTYPE html> <html> <head> <meta charset="gbk"> <t ...