zoukankan      html  css  js  c++  java
  • 【POJ2104】-K-th Number(整体二分)

    传送门

    发现整体二分还不算难吧

    就是分治的思想

    在这里插入图片描述

    看一下代码应该会很好理解

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=200005;
    inline int read(){
    	char ch=getchar();
    	int res=0,f=1;
    	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    	while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
    	return res*f;
    }
    struct ask{
    	int l,r,k,pos,op;
    }q[N],q1[N],q2[N];
    int tr[N],ans[N],a[N],n,tot,m,cnt;
    inline int lowbit(int x){
    	return (x&-x);
    }
    inline void add(int pos,int k){
    	for(;pos<=n;pos+=lowbit(pos))tr[pos]+=k;
    }
    inline int query(int pos,int res=0){
    	for(;pos;pos-=lowbit(pos))res+=tr[pos];return res;
    }
    void solve(int l,int r,int st,int des){
    	if(l>r||st>des)return;
    	if(l==r){
    		for(int i=st;i<=des;i++)if(q[i].op)ans[q[i].pos]=l;
    		return;
    	}
    	int mid=(l+r)>>1,cnt1=0,cnt2=0;
    	for(int i=st;i<=des;i++){
    		if(q[i].op){
    			int tmp=query(q[i].r)-query(q[i].l-1);
    			if(tmp>=q[i].k)q1[++cnt1]=q[i];
    			else q[i].k-=tmp,q2[++cnt2]=q[i];
    		}
    		else{
    			if(q[i].l<=mid){
    				q1[++cnt1]=q[i],add(q[i].pos,q[i].r);
    			}
    			else q2[++cnt2]=q[i]; 
    		}
    	}
        for(int i=1;i<=cnt1;i++) if(!q1[i].op) add(q1[i].pos,-q1[i].r);
        for(int i=1;i<=cnt1;i++) q[st+i-1]=q1[i];
        for(int i=1;i<=cnt2;i++) q[st+cnt1+i-1]=q2[i];
        solve(l,mid,st,st+cnt1-1),solve(mid+1,r,st+cnt1,des);
    }
    int main(){
    	n=read(),m=read();
    	for(int i=1;i<=n;++i){
    		a[i]=read();q[++cnt]=(ask){a[i],1,0,i,0};
    	}
    	for(int i=1;i<=m;i++){
    		int l=read(),r=read(),k=read();
    		q[++cnt]=(ask){l,r,k,++tot,1};
    	}
    	solve(-1e9,1e9,1,cnt);
    	for(int i=1;i<=tot;i++)cout<<ans[i]<<'
    ';
    }
    
  • 相关阅读:
    grafana邮箱配置
    grafana集群配置
    CentOS7 配置OOM监控报警
    Mycat使用配置实践
    CentOS7安装JAVA环境
    CentOS7安装MYCAT中间件
    CentOS7安装MySQL5.6
    Mockingbird
    堆的建立与功能实现
    Matlab解决线性规划问题
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366362.html
Copyright © 2011-2022 走看看