bzoj 3110 K大数查询 整体二分_u x y r e e k kck-程序员宅基地

技术标签: ===模版===  ===数据结构===  整体二分  

#include<cstdio>
#include<iostream>
#define maxn 50005
#define LL long long
using namespace std;
int n,m;
struct Que{
    int op,l,r,x,id;
    void read()
    {
        scanf("%d%d%d%d",&op,&l,&r,&x);
        if(op==1) x+=n+1;
    }
}q[50005];
Que q1[maxn],q2[maxn];
int ans[maxn];
struct XDS
{
    struct xds
    {
        int l,r,add;
        LL sum;
        bool clear;
    }tree[maxn<<3];
    void build(int x,int l,int r)
    {
        tree[x].l=l;
        tree[x].r=r;
        if(l==r) return ;
        int mid=(l+r)>>1;
        build(x<<1,l,mid);
        build(x<<1|1,mid+1,r);
    }
    void init()
    {
        tree[1].sum=tree[1].add=0;
        tree[1].clear=1;
    }
    int L,R;
    int sz(int x)
    {
   return tree[x].r-tree[x].l+1;}
    void update(int x)
    {tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;}
    void spread(int x)
    {
        if(tree[x].clear)
        {
//          cout<<x<<endl;
            tree[x<<1].sum=tree[x<<1|1].sum=0;
            tree[x<<1].add=tree[x<<1|1].add=0;
            tree[x<<1].clear=tree[x<<1|1].clear=1;
            tree[x].clear=0;
        }
        if(tree[x].add)
        {
            tree[x<<1].add+=tree[x].add;
            tree[x<<1|1].add+=tree[x].add;
            tree[x<<1].sum+=(LL)tree[x].add*sz(x<<1);
            tree[x<<1|1].sum+=(LL)tree[x].add*sz(x<<1|1);
            tree[x].add=0;
        }
    }
    void Add(int x)
    {
        if(tree[x].l>=L&&tree[x].r<=R)
        {
            tree[x].sum+=(LL)sz(x);
            tree[x].add++;
            return ;
        }
        spread(x);
        int mid=(tree[x].l+tree[x].r)>>1;
        if(mid>=L) Add(x<<1);
        if(mid<R)  Add(x<<1|1);
        update(x);
    }
    LL ask(int x)
    {
        spread(x);
        if(tree[x].l>=L&&tree[x].r<=R)
            return tree[x].sum;
        int mid=(tree[x].l+tree[x].r)>>1;
        LL ans=0;
        if(mid>=L) ans+=ask(x<<1);
        if(mid<R)  ans+=ask(x<<1|1);
        return ans;
    }
}TR;
void solve(int H,int T,int l,int r)
{
    if(H>T) return ;
    if(l==r)
    {
        for(int i=H;i<=T;i++)
            if(q[i].op==2)
                ans[q[i].id]=l;
        return ;
    }
    TR.init();
    int H1=0,H2=0;
    int mid=(l+r)>>1;
    for(int i=H;i<=T;i++)
    {
        TR.L=q[i].l;
        TR.R=q[i].r;
        if(q[i].op==1)
        {
            if(q[i].x>mid)
            {
                TR.Add(1);
                q2[++H2]=q[i];
            }
            else q1[++H1]=q[i];
        }
        else
        {
            LL tmp=TR.ask(1);
            if(tmp<(LL)q[i].x)
            {
                q[i].x-=tmp;
                q1[++H1]=q[i];
            }
            else q2[++H2]=q[i];
        }
    }
    for(int i=1;i<=H1;i++) q[H+i-1]=q1[i];
    for(int i=1;i<=H2;i++) q[H+H1+i-1]=q2[i];
    solve(H,H+H1-1,l,mid);
    solve(H+H1,T,mid+1,r);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        q[i].read(),q[i].id=i;
    TR.build(1,1,n);
    solve(1,m,1,2*n+1);
    for(int i=1;i<=m;i++)
        if(ans[i]) printf("%d\n",ans[i]-n-1);
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/loi_a/article/details/53997125

智能推荐

VUE子组件更改父组件数据_vue3子组件修改父组件值-程序员宅基地

文章浏览阅读9.7k次,点赞14次,收藏28次。在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件都没有明显的变更来源。这也是为什么我们推荐以 update:myPropName 的模式触发事件取而代之举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:this.$emit(‘update:title’, newTitle) 然后父组件可以监听那个事件并根据需要更新一个本地的数据 property。_vue3子组件修改父组件值

【Linux精讲系列】——vim详解_linux vim-程序员宅基地

文章浏览阅读3.3k次,点赞44次,收藏50次。首先我们要知道vim是什么?vi是由美国程序员比尔·乌尔曼(Bill Joy)于1976年开发的,最初是为了在Unix系统上进行文本编辑而创建的。它是一款基于模式编辑的文本编辑器,以其高效的键盘快捷键而闻名,可在终端环境下使用。vi 成为Unix系统中的标准文本编辑器,并且在大多数Unix和Linux系统上内置。_linux vim

STM32入门开发: LWIP网络协议栈移植(网卡采用DM9000)_网卡芯片和stm32-程序员宅基地

文章浏览阅读9.6k次,点赞40次,收藏215次。一、环境介绍MCU: STM32F103ZET6代码开发工具: Keil5TCP/IP协议栈: LWIP网卡: DM9000本篇文章主要讲解如何在STM32F103工程里添加移植LWIP协议,最终完成TCP服务器、TCP客户端的通信测试。 网卡采用的是DM9000,工程代码中,采用STM32的FSMC接口来驱动DM900网卡,DM9000是并口网卡,引脚多,但是速度快,也可以采用其他网卡,SPI协议的、UART协议的等。 比如:W5500。 因为主要是讲LWIP协议栈的移植,所以网卡相关_网卡芯片和stm32

非常给力的GitHub仓库(深度学习、计算机视觉、OpenCV、自动驾驶、SLAM、C++/Python学习分享)_opencv github-程序员宅基地

文章浏览阅读975次,点赞5次,收藏11次。仓库地址:仓库拉取:不想拉取可以直接下载压缩包。_opencv github

8种免费商用中文字体_类似阿里汉仪智能黑体-程序员宅基地

文章浏览阅读2.3k次。8种免费商用中文字体 转自https://www.uisdc.com/200-models-free-commercial-fonts 提取连接:https://pan.baidu.com/s/1nLxPRDDS1BTzBtISUfzaAA 提取码: tnxd 一、思源字体系列 大名鼎鼎的思源字体由 Adobe 在线字体库 Typekityu 与谷歌一起合作开发,字库对中(简体/繁体)、日、韩三国汉字进行了全面优化支持,可以说是非常全面了,其实思源不仅是个免费字体,还是一个开源字体,任何用户都可以_类似阿里汉仪智能黑体

AndroidStudio Error:Failed to open zip file. Gradle's dependency cache may be > corrupt_androidstudio error: failed to open zip file. grad-程序员宅基地

文章浏览阅读1.9k次。有时候新导入一个项目,发现有这样一个问题 Error:Failed to open zip file. Gradle’s dependency cache may be > corrupt (this sometimes occurs after a network connection timeout.) href=”syncProject”>Re-download dependencies_androidstudio error: failed to open zip file. gradle's dependency cache may

随便推点

vue2Vue3dialog框的打开和关闭_vue关闭dialog窗口-程序员宅基地

文章浏览阅读354次。_vue关闭dialog窗口

Android开发中图片的放大缩小功能的实现(总结)_android开发分辨率低的图片放大-程序员宅基地

文章浏览阅读1.2w次,点赞9次,收藏32次。先上代码吧,之后再进行补充和代码优化。activity_main.xml的代码如下:&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:ori..._android开发分辨率低的图片放大

linux下编译GCC_什么命令可以查询gcc这个软件包下所含的文件-程序员宅基地

文章浏览阅读485次。分两种情况: 先看这篇转过来的文章,俺老孙懒得写了。 Linux软件安装通用思路 在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种:   1)一种是软件的源代码,您需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。   2)另一种是软件的可执行程序,你只要安装它就可以了。这种软件安装包通常被是一个RPM包(Redhat_什么命令可以查询gcc这个软件包下所含的文件

vue脚手架学习总结,vue参数、基础指令、生命周期函数、组件、插槽(持续更新)_在vue脚手架中新增数据的弹窗怎么写-程序员宅基地

文章浏览阅读7.1k次,点赞138次,收藏272次。vue知识点在html中vue如何使用在script的src属性中引入vue.js文件点击下载vue.js创建一个id为app的div容器在script标签里,添加以下内容new Vue({ el:"#app", //指定模板目标 data:{ //数据内容(以对象形式) msg:"又见面了Vue", newMsg:"我和我的<b>祖国</b>", flag:true, titl_在vue脚手架中新增数据的弹窗怎么写

升级openssh服务_ssh 升级-程序员宅基地

文章浏览阅读427次,点赞9次,收藏8次。更新yum源、安装zlib库、OpenSSL 库。二、安装openssl。查看openssl路径。查看openssl版本。三、openssh安装。查看openssh版本。重启并检查sshd服务。配置 OpenSSL。_ssh 升级

stata陈强:第十五章 短面板_stata研究啤酒税与交通死亡率-程序员宅基地

文章浏览阅读3.1k次,点赞6次,收藏74次。高级计量经济学及stata应用 陈强第十五章 短面板15.13短面板的stata命令及实例第十五章 短面板15.13短面板的stata命令及实例clear all cd "F:\stata经济数据分析"diruse traffic.dta, clear* 1 面板数据的设定* xtset panelvar timevar* encode country, gen(cntry) //假如panelvar是字符串,转换为数字型xtset state year* 显示数据结构* x_stata研究啤酒税与交通死亡率

推荐文章

热门文章

相关标签