hdu 4533 威威猫系列故事——晒被子

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4533
 
#include<cstdio>  
#include<algorithm>  
#include<cstring>  
#include<iostream>  
using namespace std;  
struct point{  
    long long x,y;  
        friend bool operator < (const point &a,const point &b){  
            return max(a.x,a.y)<max(b.x,b.y);  
        }  
    };  
    point a[50001];  
    long long suma[50001],sumb[50001],suma_mul[50001],sumb_mul[50001];  
    point b[50001];  
    int find_a(int l,int r,long long t){  
        while(r>=l){  
            int m=(l+r)/2;  
            if(t==max(a[m].x,a[m].y))return m;  
            if(t<max(a[m].x,a[m].y))r=m-1;  
            else l=m+1;  
        }  
        return l;  
    }  
    int find_b(int l,int r,long long t){  
        while(r>=l){  
            int m=(l+r)/2;  
            if(t==max(b[m].x,b[m].y))return m;  
            if(t<max(b[m].x,b[m].y))r=m-1;  
            else l=m+1;  
        }  
        return l;  
    }  
    int main(){  
        int T;  
        scanf("%d",&T);  
        while(T--){  
            memset(suma,0,sizeof(suma));  
            memset(sumb,0,sizeof(sumb));  
            memset(suma_mul,0,sizeof(suma_mul));  
            memset(sumb_mul,0,sizeof(sumb_mul));  
            memset(a,0,sizeof(a));  
            memset(b,0,sizeof(b));  
            int n;  
            scanf("%d",&n);  
            for(int i=1;i<=n;i++){  
                long long x1,y1,x2,y2;  
                scanf("%I64d%I64d%I64d%I64d",&x1,&y1,&x2,&y2);  
                //cin>>x1>>y1>>x2>>y2;  
                a[2*i-1]=(point){x1,y1};  
                a[2*i]=(point){x2,y2};  
                b[2*i-1]=(point){x1,y2};  
                b[2*i]=(point){x2,y1};  
            }  
            sort(a,a+2*n+1);  
            sort(b,b+2*n+1);  
            for(int i=1;i<=2*n;i++){  
                suma[i]=suma[i-1]+a[i].x+a[i].y;  
                sumb[i]=sumb[i-1]+b[i].x+b[i].y;  
                suma_mul[i]=suma_mul[i-1]+a[i].x*a[i].y;  
                sumb_mul[i]=sumb_mul[i-1]+b[i].x*b[i].y;  
            }  
            suma[2*n+1]=suma[2*n];  
            sumb[2*n+1]=sumb[2*n];  
            suma_mul[2*n+1]=suma_mul[2*n];  
            sumb_mul[2*n+1]=sumb_mul[2*n];  
            int q;  
            scanf("%d",&q);  
            while(q--){  
                long long x;  
                scanf("%I64d",&x);  
                long long sum=0;  
                int m=find_a(1,2*n,x);  
                if(m>2*n)m=2*n;  
                if(x<max(a[m].x,a[m].y))m--;  
                sum=m*x*x-x*suma[m]+suma_mul[m];  
                m=find_b(1,2*n,x);  
                if(m>2*n)m=2*n;  
                if(x<max(b[m].x,b[m].y))m--;  
                sum=sum-(m*x*x-x*sumb[m]+sumb_mul[m]);  
                printf("%I64d\n",sum);  
                //cout<<sum<<endl;  
            }  
        }  
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值