• [bzoj4822][Cqoi2017]老C的任务&[bzoj1935][Shoi2007]Tree 园丁的烦恼


    来自FallDream的博客,未经允许,请勿转载,谢谢。

    老 C 是个程序员。    
    最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统。作为经验丰富的程序员,老 C 轻松地完成了系统的大部分功能,并把其中一个功能交给你来实现。由于一个基站的面积相对于整个城市面积来说非常的小,因此每个的基站都可以看作坐标系中的一个点,其位置可以用坐标(x, y)来表示。此外,每个基站还有很多属性,例如高度、功率等。运营商经常会划定一个区域,并查询区域中所有基站的信息。现在你需要实现的功能就是,对于一个给定的矩形区域,回答该区域中(包括区域边界上的)所有基站的功率总和。如果区域中没有任何基站,则回答 0。
    n,m不知道多大 反正不会太大 不会超过500000吧  然后权值和坐标应该是int
     
    因为没有强制在线,所以考虑离线,按照x坐标排序,y坐标离散之后插入线段树。
    询问可以拆成两个,差分一下即可。
    复杂度nlogn
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    #define MN 1000000 
    #define N 524288
    using namespace std;
    inline int read()
    {
        int x = 0 , f = 1; char ch = getchar();
        while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}
        while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
        return x * f;
    }
    ll Ans[MN+5],t[N*2+5];
    int cm=1,n,m,cnt=0,Y[MN+5];
    struct Tree{int x,y,z;}T[MN+5];
    struct ques{int x,l,r,id,ad;}q[MN*2+5];
    bool cmp(ques x,ques y){return x.x<y.x;}
    bool cmp2(Tree x,Tree y){return x.x<y.x;}
    inline void Renew(int x,int ad){for(t[x+=N]+=ad,x>>=1;x;x>>=1)t[x]=t[x<<1]+t[x<<1|1];}
    inline ll Query(int l,int r)
    {
        if(l>r) return 0;ll sum=0;
        for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1)
        {
            if(~l&1) sum+=t[l+1];
            if( r&1) sum+=t[r-1];    
        }
        return sum;
    }
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=n;++i) T[i].x=read(),Y[i]=T[i].y=read(),T[i].z=read();
        sort(Y+1,Y+n+1);
        for(int i=2;i<=n;++i)  if(Y[i]!=Y[i-1]) Y[++cm]=Y[i]; 
        for(int i=1;i<=n;++i) 
            T[i].y=lower_bound(Y+1,Y+cm+1,T[i].y)-Y;
        for(int i=1;i<=m;++i) 
        {
            int X1=read(),Y1=read(),X2=read(),Y2=read();
            Y1=lower_bound(Y+1,Y+cm+1,Y1)-Y;
            Y2=upper_bound(Y+1,Y+cm+1,Y2)-Y-1;
            q[++cnt]=(ques){X1-1,Y1,Y2,i,-1};
            q[++cnt]=(ques){X2,Y1,Y2,i,1};
        }
        sort(q+1,q+cnt+1,cmp);
        sort(T+1,T+n+1,cmp2);
        for(int i=1,j=1;j<=cnt;)
            if(i<=n&&T[i].x<=q[j].x) Renew(T[i].y,T[i].z),++i;
            else Ans[q[j].id]+=q[j].ad*Query(q[j].l,q[j].r),++j;
        for(int i=1;i<=m;++i) printf("%lld
    ",Ans[i]);
        return 0;
    }
  • 相关阅读:
    C#基础知识系列十(集合)
    C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)
    C#基础知识系列八(const和readonly关键字)
    C#基础知识系列七(base、this、new、override、abstract、virtual、static)
    C#基础知识系列六(静态类和静态类成员)
    C#基础知识系列五(构造函数)
    C#基础知识系列四(运算符汇总)
    C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
    C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
    C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
  • 原文地址:https://www.cnblogs.com/FallDream/p/bzoj4822.html
Copyright © 2020-2023  润新知