• HDU2665 求区间第K大 主席树


    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=2665

    代码:

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #define fi first
    #define se second
    #define INF 0x3f3f3f3f
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define pqueue priority_queue
    #define NEW(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) ((x)&(-x))
    using namespace std;
    const double pi=4.0*atan(1.0);
    const double e=exp(1.0);
    const int maxn=1e5+6;
    typedef long long LL;
    typedef unsigned long long ULL;
    const LL mod=1e9+7;
    const ULL base=1e7+7;
    struct node{
        int siz,lc,rc;
    }a[maxn*20];
    int s[maxn];
    struct nub{
        int st,num;
        bool operator<(const nub &u)const{
            return num<u.num;
        }
    }u[maxn];
    int tot=0,rt[maxn];
    void Build(int d,int l,int r){
        a[d].siz=0;
        if(l==r){
            return ;
        }
        int m=(l+r)>>1;
        a[d].lc=tot++;a[d].rc=tot++;
        Build(a[d].lc,l,m);
        Build(a[d].rc,m+1,r);
    }
    void updata(int st,int d,int last,int l,int r){
        a[d].siz=a[last].siz+1;
        if(l==r){
            return ;
        }
        int mid=(l+r)>>1;
        if(st<=mid){
            a[d].rc=a[last].rc;
            a[d].lc=tot++;
            updata(st,a[d].lc,a[last].lc,l,mid);
        }
        else if(st>mid){
            a[d].lc=a[last].lc;
            a[d].rc=tot++;
            updata(st,a[d].rc,a[last].rc,mid+1,r);
        }
    }
    int query(int k,int last,int now,int l,int r){
        if(l==r){
            return l;
        }
        int mid=(l+r)>>1;
        if(k<=a[a[now].lc].siz-a[a[last].lc].siz){
            return query(k,a[last].lc,a[now].lc,l,mid);
        }
        else{
            return query(k-(a[a[now].lc].siz-a[a[last].lc].siz),a[last].rc,a[now].rc,mid+1,r);
        }
    }
    int b[maxn];
    int main(){
        int n,m,t;
        scanf("%d",&t);
        while(t--){
            tot=0;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++){
                scanf("%d",&u[i].num);
                u[i].st=i;
            }
            sort(u+1,u+1+n);
            int cnt=1;
            s[cnt]=u[1].num;
            b[u[1].st]=1;
            for(int i=2;i<=n;i++){
                if(u[i].num!=u[i-1].num){
                    cnt++;
                    s[cnt]=u[i].num;
                }
                b[u[i].st]=cnt;
            }
            rt[0]=tot++;
            Build(rt[0],1,cnt);
            for(int i=1;i<=n;i++){
                rt[i]=tot++;
                updata(b[i],rt[i],rt[i-1],1,cnt);
            }
            int l,r,k;
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&l,&r,&k);
                printf("%d
    ",s[query(k,rt[l-1],rt[r],1,cnt)]);
            }
        }
        system("pause");
        return 0;
    }

    HDU1007

    http://acm.hdu.edu.cn/showproblem.php?pid=1007

    方差优化:

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define INF 0x3f3f3f3f
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define pqueue priority_queue
    #define NEW(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) ((x)&(-x))
    const double pi=4.0*atan(1.0);
    const double e=exp(1.0);
    const int maxn=2e5+8;
    typedef long long LL;
    typedef unsigned long long ULL;
    const LL mod=1e9+7;
    const ULL base=1e7+7;
    using namespace std;
    int kdd;
    struct node{
        int id,di;
        double g[2];
        bool operator<(const node &u)const{
           return g[kdd]<u.g[kdd];
        }
    }kdt[maxn<<2],data[maxn];
    bool flag[maxn<<2];
    double dis(node a,node b){
        return (a.g[0]-b.g[0])*(a.g[0]-b.g[0])+(a.g[1]-b.g[1])*(a.g[1]-b.g[1]);
    }
    double fx(int l,int r,int j){
        double as=0.0;
        for(int i=l;i<=r;i++){
            as+=data[i].g[j];
        }
        as/=(double)(r-l+1);
        double f=0.0;
        for(int i=l;i<=r;i++){
            f+=(data[i].g[j]-as)*(data[i].g[j]-as);
        }
        f/=(double)(r-l+1);
        return f;
    }
    void build(int l,int r,int rt){
        if(l>r) return ;
        if(fx(l,r,0)>fx(l,r,1)){
            kdd=0;
        }
        else{
            kdd=1;
        }
        flag[rt]=1;
        int mid=(l+r)>>1;
        nth_element(data+l,data+mid,data+r+1);
        kdt[rt]=data[mid];
        kdt[rt].di=kdd;
        flag[rt<<1]=flag[rt<<1|1]=0;
        if(l<=mid-1){
            build(l,mid,rt<<1);
        }
        if(mid+1<=r){
            build(mid+1,r,rt<<1|1);
        }
    }
    pair<double,node> ans;
    double mi;
    void query(int rt,node p){
        int kd=kdt[rt].di;
        pair<double,node> now={dis(p,kdt[rt]),kdt[rt]};
        int x=rt<<1;
        int y=rt<<1|1;
        if(p.g[kd]>=kdt[rt].g[kd]){
            swap(x,y);
        }
        if(flag[x])
            query(x,p);
        bool ff=0;
        if(ans.fi==-1.0){
            ff=1;
            if(p.id!=kdt[rt].id){
                ans=now;
            }
        }
        else{
            if(p.id!=kdt[rt].id&&(now.fi<ans.fi||now.fi==ans.fi&&now.se.id<ans.se.id)){
                ans=now;
            }
            if((kdt[rt].g[kd]-p.g[kd])*(kdt[rt].g[kd]-p.g[kd])<ans.fi){
                ff=1;
            }
        }
        if(flag[y]&&ff){
            query(y,p);
        }
    }
    int main(){
        int n;
        while(~scanf("%d",&n)&&n!=0){
            for(int i=1;i<=n;i++){
                for(int j=0;j<2;j++){
                    scanf("%lf",&data[i].g[j]);
                }
                data[i].id=i;
            }
            build(1,n,1);
            mi=1000000000.0;
            for(int i=1;i<=n;i++){
                ans.fi=-1.0;
                query(1,data[i]);
                mi=min(mi,sqrt(ans.fi));
            }
            mi/=2.0;
            printf("%.2lf
    ",mi);
        }
    }
  • 相关阅读:
    c++之类模板和函数模板的区别
    c++之模板-类模板
    c++之函数模板的局限性
    c++之普通函数和模板函数的调用规则
    c++之普通函数和模板函数的区别
    c++之函数模板案例
    c++之模板函数-模板
    c++文件操作之二进制文件-读文件
    c++文件操作之二进制文件-写文件
    FFmpeg获取DirectShow设备数据(摄像头,录屏)
  • 原文地址:https://www.cnblogs.com/Profish/p/9964051.html
Copyright © 2020-2023  润新知