POJ - 2104 K-th Number

题目:给你一个n个数的序列,m个询问,每次询问为i,j,k,问区间[i,j]中的数按升序排序后,第k个数是什么

思路:CDQ分治,整体二分答案

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
//0x3f3f3f3f

const int maxn=110050;
struct Query{
    int x,y,k,pos,type;
    Query(int _x,int _y,int _k,int _pos,int _type):x(_x),y(_y),k(_k),pos(_pos),type(_type){}
    Query(){}
}q[maxn],q1[maxn],q2[maxn];
struct BIT{
    int n,b[maxn];
    void init(int _n){
        n=_n;
        mm(b,0);
    }
    void add(int i,int val){
        for(;i<=n;i+=i&(-i))
            b[i]+=val;
    }
    int sum(int i){
        int ret=0;
        for(;i>0;i-=i&(-i))
            ret+=b[i];
        return ret;
    }
}bit;
int arr[maxn],ans[maxn];
void solve(int L,int R,int l,int r){
    if(L>R) return;
    if(l==r){
        for(int i=L;i<=R;i++)
            if(q[i].type==2)
                ans[q[i].pos]=l;
        return;
    }
    int mid=(l+r)>>1;
    int sz1=0,sz2=0;
    for(int i=L;i<=R;i++){
        if(q[i].type==1){
            if(q[i].x<=mid){
                bit.add(q[i].pos,1);
                q1[sz1++]=q[i];
            }
            else
                q2[sz2++]=q[i];
        }
        else{
            int res=bit.sum(q[i].y)-bit.sum(q[i].x-1);
            if(res>=q[i].k) q1[sz1++]=q[i];
            else{
                q[i].k-=res;
                q2[sz2++]=q[i];
            }
        }
    }
    for(int i=0;i<sz1;i++)//清空
        if(q1[i].type==1)
            bit.add(q1[i].pos,-1);

    memcpy(q+L,q1,sz1*sizeof(Query));
    memcpy(q+L+sz1,q2,sz2*sizeof(Query));

    solve(L,L+sz1-1,l,mid);
    solve(L+sz1,R,mid+1,r);
}
int main(){

//    freopen("D:\\input.txt","r",stdin);
//    freopen("D:\\output.txt","w",stdout);
    int n,m,x,y,k;
    while(~scanf("%d%d",&n,&m)){
        bit.init(n);
        int idx=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&arr[i]);
            q[++idx]=Query(arr[i],1,1,i,1);
        }
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&k);
            q[++idx]=Query(x,y,k,i,2);
        }
        solve(1,idx,-INF,INF);
        for(int i=1;i<=m;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}


基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值