当前位置: 首页 > news >正文

[模板]区间第k大整体二分

https://blog.csdn.net/wu_tongtong/article/details/78825245

https://www.cnblogs.com/sagitta/p/5982251.html

https://blog.csdn.net/wu_tongtong/article/details/78826023

https://blog.csdn.net/wu_tongtong/article/details/79790268

不带修 POJ2104:

#include<iostream>
#include<cstdio>
#include<cstring>
#define lbt(x) (x&-x)
#define INF 2000000000
using namespace std;
const int maxn=100009;
int n,m,tot;
struct qq{
    int x,y,k,id,type;//0 add,1 query
}q[maxn*2],q1[maxn*2],q2[maxn*2];
int ans[maxn*2];
int t[maxn];
void add(int x,int k){
    while(x<=n){
        t[x]+=k;
        x+=lbt(x);
    }
}
int ask(int x){
    int ans=0;
    while(x){
        ans+=t[x];
        x-=lbt(x);
    }
    return ans;
}
void solve(int l,int r,int L,int R){//值域和询问序列 
    if(l>r || L>R)return;
    if(l==r){
        for(int i=L;i<=R;i++)if(q[i].type)ans[q[i].id]=l;
        return;
    }
    int mid=l+r>>1,cnt1=0,cnt2=0;
    for(int i=L;i<=R;i++)
    if(q[i].type){
        int tmp=ask(q[i].y)-ask(q[i].x-1);
        if(tmp>=q[i].k)q1[++cnt1]=q[i];
        else q[i].k-=tmp,q2[++cnt2]=q[i];
    }
    else{
        if(q[i].x<=mid)add(q[i].id,1),q1[++cnt1]=q[i];
        else q2[++cnt2]=q[i];
    }
    for(int i=1;i<=cnt1;i++)if(!q1[i].type)add(q1[i].id,-1);//清空树状数组 
    for(int i=1;i<=cnt1;i++)q[L+i-1]=q1[i];
    for(int i=1;i<=cnt2;i++)q[L+cnt1+i-1]=q2[i];
    solve(l,mid,L,L+cnt1-1);solve(mid+1,r,L+cnt1,R);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1,x;i<=n;i++){
        scanf("%d",&x);
        q[++tot].x=x;q[tot].id=i;
    }
    for(int i=1;i<=m;i++){
        tot++;
        scanf("%d%d%d",&q[tot].x,&q[tot].y,&q[tot].k);
        q[tot].type=1;q[tot].id=i;
    }
    solve(-INF,INF,1,tot);
    for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

 目前不对:HDU5412

#include<iostream>
#include<cstdio>
#include<cstring>
#define lbt(x) (x&-x)
#define INF 1000000000
using namespace std;
const int maxn=100009;
int n,m,tot,totq,ans[maxn],raw[maxn];
struct node{
    int type,x,y,k,id;//0 add 1 query
}q[maxn*2],q1[maxn*2],q2[maxn*2];
int t[maxn];
void add(int x,int k){
    while(x<=n){
        t[x]+=k;
        x+=lbt(x);
    }
}
int ask(int x){
    int ans=0;
    while(x){
        ans+=t[x];
        x-=lbt(x);
    }
}
void solve(int l,int r,int L,int R){
    if(l>r || L>R)return;
    if(l==r){
        for(int i=L;i<=R;i++)if(q[i].type)ans[q[i].id]=l;
        return;
    }
    int mid=l+r>>1,cnt1=0,cnt2=0;
    for(int i=L;i<=R;i++)
    if(q[i].type){
        int tmp=ask(q[i].y)-ask(q[i].x-1);
        if(tmp>=q[i].k)q1[++cnt1]=q[i];
        else q[i].k-=tmp,q2[++cnt2]=q[i];
    }
    else{
        if(q[i].x<=mid)add(q[i].id,q[i].y),q1[++cnt1]=q[i];
        else q2[++cnt2]=q[i];
    }
    for(int i=1;i<=cnt1;i++)if(!q1[i].type)add(q1[i].id,-q1[i].y);
    for(int i=1;i<=cnt1;i++)q[L+i-1]=q1[i];
    for(int i=1;i<=cnt2;i++)q[L+cnt1+i-1]=q2[i];
    solve(l,mid,L,L+cnt1-1);solve(mid+1,r,L+cnt1,R);
}
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(ans,0,sizeof(ans));
        memset(t,0,sizeof(t));
        tot=0;totq=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&raw[i]);
            q[++tot].x=raw[i];q[tot].y=1;q[tot].id=i;
        }
        scanf("%d",&m);int op;
        for(int i=1,x,y,k;i<=m;i++){
            scanf("%d",&op);
            if(op==1){
                scanf("%d%d",&x,&y);
                q[++tot].x=raw[x];q[tot].y=-1;q[tot].id=x;
                raw[x]=y;//用raw数组记录序列状态 
                q[++tot].x=raw[x];q[tot].y=1;q[tot].id=x;
            }
            else{
                scanf("%d%d%d",&x,&y,&k);
                q[++tot].x=x;q[tot].y=y;q[tot].k=k;q[tot].id=++totq;q[tot].type=1;
            }
        }
        solve(1,INF,1,tot);
        for(int i=1;i<=totq;i++)
        printf("%d\n",ans[i]);
    }
}

 

luogu_P1527矩阵乘法:

树状数组换为二维,把每个点塞入一维数组排序,其他没什么大的区别

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lbt(x) (x&-x)
#define INF 1e9
using namespace std;
const int maxn=509;
const int maxm=60009;
int n,m,ans[maxm];
int t[maxn][maxn];
void add(int x,int y,int k){
    for(;x<=n;x+=lbt(x))
    for(int z=y;z<=n;z+=lbt(z))
    t[x][z]+=k;
}
int ask(int x,int y){
    int ans=0;
    for(;x;x-=lbt(x))
    for(int z=y;z;z-=lbt(z))
    ans+=t[x][z];
    return ans;
}
struct node{
    int xa,ya,xb,yb,k,id;
}q[maxm*2],q1[maxm*2],q2[maxm*2];
int tota,tot;
struct aa{
    int x,y,w;
    bool operator <(const aa&xx)const{
        return w<xx.w;
    }
}a[maxn*maxn];
inline int calc(int xa,int ya,int xb,int yb){
    return ask(xb,yb)-ask(xa-1,yb)-ask(xb,ya-1)+ask(xa-1,ya-1);
}
void solve(int l,int r,int L,int R){
    if(L>R || l>r)return;
    if(l==r){
        for(int i=L;i<=R;i++)ans[q[i].id]=a[l].w;
        return;
    }
    int mid=l+r>>1,cnt1=0,cnt2=0;
    for(int i=l;i<=mid;i++)
    add(a[i].x,a[i].y,1);
    for(int i=L;i<=R;i++){
        int tmp=calc(q[i].xa,q[i].ya,q[i].xb,q[i].yb);
        if(tmp>=q[i].k)q1[++cnt1]=q[i];
        else q[i].k-=tmp,q2[++cnt2]=q[i];
    }
    for(int i=l;i<=mid;i++)
    add(a[i].x,a[i].y,-1);
    for(int i=1;i<=cnt1;i++)q[L+i-1]=q1[i];
    for(int i=1;i<=cnt2;i++)q[L+cnt1+i-1]=q2[i];
    solve(l,mid,L,L+cnt1-1);solve(mid+1,r,L+cnt1,R);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1,x;i<=n;i++)
    for(int j=1;j<=n;j++){
        scanf("%d",&x);
        a[++tota].x=i;a[tota].y=j;a[tota].w=x;
    }
    sort(a+1,a+tota+1);
    for(int i=1;i<=m;i++){
        tot++;
        scanf("%d%d%d%d%d",&q[tot].xa,&q[tot].ya,&q[tot].xb,&q[tot].yb,&q[tot].k);
        q[tot].id=i;
    }
    solve(1,tota,1,tot);
    for(int i=1;i<=tot;i++)printf("%d\n",ans[i]);
}

 

转载于:https://www.cnblogs.com/superminivan/p/11289315.html

相关文章:

  • 使用Docker快速部署Storm环境
  • 谈谈Java多线程
  • jzoj2866. 【集训队互测 2012】Bomb
  • python自动化运维技术读书笔记
  • js同步和异步
  • 并发并行同步异步多线程
  • 猿辅导 2019年 校招提前批笔试
  • RequireJs入门
  • Asp.net页面的生命周期
  • 终于弄好了 homework-09
  • python面向对象
  • leetcode 337. House Robber III
  • Durandal入门
  • js中使用EL表达式总结
  • leetcode 309. Best Time to Buy and Sell Stock with Cooldown
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • C++11: atomic 头文件
  • chrome扩展demo1-小时钟
  • ECS应用管理最佳实践
  • ES6之路之模块详解
  • Java 网络编程(2):UDP 的使用
  • JavaScript 奇技淫巧
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java到底能干嘛?
  • java概述
  • MobX
  • Python连接Oracle
  • Python爬虫--- 1.3 BS4库的解析器
  • session共享问题解决方案
  • Sublime text 3 3103 注册码
  • 闭包--闭包作用之保存(一)
  • 简单数学运算程序(不定期更新)
  • 如何合理的规划jvm性能调优
  • 小李飞刀:SQL题目刷起来!
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 第二十章:异步和文件I/O.(二十三)
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (3)选择元素——(17)练习(Exercises)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (zt)最盛行的警世狂言(爆笑)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计高校学生选课系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)可以带来幸福的一本书
  • ***通过什么方式***网吧
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Framework与.NET Framework SDK有什么不同?