zoukankan      html  css  js  c++  java
  • HDU 3255 Farming

    矩形面积并变形,一层一层的算体积

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<algorithm>
    using namespace std;
    
    const long long maxn=120000+10;
    struct Seg
    {
        long long x;
        long long Y1,Y2;//离散化之后的坐标
        long long flag;
    } s[maxn];
    long long X1[maxn],X2[maxn],Y1[maxn],Y2[maxn],V[maxn];
    long long p[5],pp[5];
    map<long long ,long long>m;
    long long M[maxn];
    long long k;
    long long n,tot,h;
    long long sum,ans;
    
    struct SegTree
    {
        long long len;
        long long cover;
    } segTree[maxn*4];
    
    bool cmp(const Seg&a,const Seg&b)
    {
        return a.x<b.x;
    }
    
    void lsh()
    {
        k=0;
        m.clear();
        for(long long i=1; i<=n; i++)
        {
            if(m[Y1[i]]==0) M[k++]=Y1[i],m[Y1[i]]=1;
            if(m[Y2[i]]==0) M[k++]=Y2[i],m[Y2[i]]=1;
        }
        sort(M,M+k);
        m.clear();
        for(long long i=0; i<k; i++) m[M[i]]=i;
    }
    
    void build(long long l,long long r,long long rt)
    {
        segTree[rt].cover=0;
        segTree[rt].len=0;
        if(l==r) return;
        long long m=(l+r)/2;
        build(l,m,2*rt);
        build(m+1,r,2*rt+1);
    }
    
    void pushUp(long long rt,long long l,long long r)
    {
        if(segTree[rt].cover) segTree[rt].len=M[r]-M[l-1];
        else segTree[rt].len=segTree[2*rt].len+segTree[2*rt+1].len;
    }
    
    void update(long long info,long long L,long long R,long long l,long long r,long long rt)
    {
        if(L<=l&&r<=R)
        {
            segTree[rt].cover=segTree[rt].cover+info;
            pushUp(rt,l,r);
            return;
        }
    
        long long m=(l+r)/2;
        if(L<=m) update(info,L,R,l,m,2*rt);
        if(R>m)  update(info,L,R,m+1,r,2*rt+1);
        pushUp(rt,l,r);
    }
    
    int main()
    {
        long long T,zz=1;
        scanf("%lld",&T);
        while(T--)
        {
            scanf("%lld%lld",&n,&h);
            p[0]=0;
            for(long long i=1;i<=h;i++)
            {
                scanf("%lld",&p[i]);
                pp[i]=p[i];
            }
            sort(pp+1,pp+h+1);
            for(long long i=1; i<=n; i++){
                scanf("%lld%lld%lld%lld%lld",&X1[i],&Y1[i],&X2[i],&Y2[i],&V[i]);
                V[i]=p[V[i]];
            }
    
            lsh();
            long long Ans=0;
            for(long long r=1; r<=h; r++)
            {
                tot=0;
                for(long long i=1; i<=n; i++)
                {
                    if(V[i]>=pp[r])
                    {
                        s[tot].x=X1[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=1,tot++;
                        s[tot].x=X2[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=-1,tot++;
                    }
                }
                sort(s,s+tot,cmp);
                ans=0;
                build(1,k,1);
    
                for(long long i=0; i<tot; i++)
                {
                    sum=segTree[1].len;
                    ans=ans+sum*(s[i].x-s[i-1].x);
                    update(s[i].flag,s[i].Y1+1,s[i].Y2,1,k,1);
                }
                Ans=Ans+ans*(pp[r]-pp[r-1]);
            }
            printf("Case %lld: ",zz++);
            printf("%lld
    ",Ans);
        }
        return 0;
    }
  • 相关阅读:
    Unit01: JDBC原理 、 JDBC基础编程
    JAVA-Unit05: 视图、序列、索引 、 约束
    JAVA-Unit04: SQL(高级查询)
    JAVA-Unit03: SQL(基础查询) 、 SQL(关联查询)
    JAVA-Unit02: Oracle字符串操作 、 Oracle数值操作 、 Oracle日期操作 、 空值操作
    Eclipse快捷键
    JAVA-Unit01: 数据库原理 、 SQL(DDL、DML)
    JAVASE02-Unit012: Unit07: XML语法 、 XML解析
    JAVASE02-Unit011: TCP通信(小程序)
    从《在小吃店遇见凯恩斯》初识经济
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5058054.html
Copyright © 2011-2022 走看看