zoukankan      html  css  js  c++  java
  • zoj 3540 Adding New Machine

    Incredible Crazily Progressing Company (ICPC) suffered a lot with the low speed of procedure. After investigation, they found that the bottleneck was at Absolutely Crowded Manufactory (ACM). In oder to accelerate the procedure, they bought a new machine for ACM. But a new problem comes, how to place the new machine into ACM?

    ACM is a rectangular factor and can be divided into W * H cells. There are N retangular old machines in ACM and the new machine can not occupy any cell where there is old machines. The new machine needs M consecutive cells. Consecutive cells means some adjacent cells in a line. You are asked to calculate the number of ways to choose the place for the new machine.

    Input

    There are multiple test cases (no more than 50). The first line of each test case contains 4 integers W, H, N, M (1 ≤ W, H ≤ 107, 0 ≤ N ≤ 50000, 1 ≤ M ≤ 1000), indicating the width and the length of the room, the number of old machines and the size of the new machine. Then N lines follow, each of which contains 4 integers Xi1, Yi1, Xi2 and Yi2 (1 ≤ Xi1Xi2W, 1 ≤ Yi1Yi2H), indicating the coordinates of the i-th old machine. It is guarantees that no cell is occupied by two old machines.

    Output

    Output the number of ways to choose the cells to place the new machine in one line.

    Sample Input

    3 3 1 2
    2 2 2 2
    3 3 1 3
    2 2 2 2
    2 3 2 2
    1 1 1 1
    2 3 2 3
    

    Sample Output

    8
    4
    3
    
    My Code
      1 #include <cstdio>
      2 #include <algorithm>
      3 using namespace std;
      4 #define lson l,m,rt<<1
      5 #define rson m+1,r,rt<<1|1
      6 #define maxn 100100
      7 struct node
      8 {
      9     int len,c;
     10 }setree[maxn<<2];
     11 struct op
     12 {
     13     int l,r,cnt,h;
     14 }mes[maxn],mes1[maxn];
     15 int sorted[maxn],sorted1[maxn];
     16 long long ans;
     17 int w,h,n,m;
     18 bool cmp(struct op a,struct op b)
     19 {
     20     return a.h<b.h;
     21 }
     22 void build(int l,int r,int rt)
     23 {
     24     setree[rt].c=0;
     25     setree[rt].len=0;
     26     if(l==r)
     27     return;
     28     int m=(l+r)>>1;
     29     build(lson);
     30     build(rson);
     31 }
     32 int binsearch(int a[],int l,int r,int num)
     33 {
     34     int m=(l+r)>>1;
     35     if(a[m]==num)
     36     return m;
     37     if(num<a[m])
     38     return binsearch(a,l,m-1,num);
     39     return binsearch(a,m+1,r,num);
     40 }
     41 void pushup(int a[],int rt,int l,int r)
     42 {
     43     if(setree[rt].c>0)
     44     setree[rt].len=a[r]-a[l-1];
     45     else
     46     setree[rt].len=setree[rt<<1].len+setree[rt<<1|1].len;
     47     
     48 }
     49 void update(int a[],int l,int r,int rt,int L,int R,int c)
     50 {
     51     if(L<=l&&r<=R){
     52         setree[rt].c+=c;
     53         if(setree[rt].c>0)
     54         setree[rt].len=a[r]-a[l-1];
     55         else{
     56             if(l==r)
     57             setree[rt].len=0;
     58             else
     59             setree[rt].len=setree[rt<<1].len+setree[rt<<1|1].len;
     60         }
     61         return;
     62     }
     63     int m=(l+r)>>1;
     64     if(L<=m)
     65     update(a,lson,L,R,c);
     66     if(R>m)
     67     update(a,rson,L,R,c);
     68     pushup(a,rt,l,r);
     69 }
     70 void solve()
     71 {
     72     sort(mes,mes+2*n,cmp);
     73     sort(sorted,sorted+2*n);
     74     int k=1;
     75     long long s=0;
     76     for(int i=1;i<2*n;i++)
     77     if(sorted[i]!=sorted[i-1])
     78     sorted[k++]=sorted[i];
     79     build(1,k,1);
     80     for(int i=0;i<2*n;i++){
     81         int l=binsearch(sorted,0,k-1,mes[i].l);
     82         int r=binsearch(sorted,0,k-1,mes[i].r);
     83         update(sorted,1,k,1,l+1,r,mes[i].cnt);
     84         s+=(long long)(mes[i+1].h-mes[i].h)*setree[1].len;
     85     }
     86     ans+=(long long)w*h-s;
     87 }
     88 void solve1()
     89 {
     90     sort(mes1,mes1+2*n,cmp);
     91     sort(sorted1,sorted1+2*n);
     92     int k=1;
     93     long long s=0;
     94     for(int i=1;i<2*n;i++)
     95     if(sorted1[i]!=sorted1[i-1])
     96     sorted1[k++]=sorted1[i];
     97     build(1,k,1);
     98     for(int i=0;i<2*n;i++){
     99         int l=binsearch(sorted1,0,k-1,mes1[i].l);
    100         int r=binsearch(sorted1,0,k-1,mes1[i].r);
    101         update(sorted1,1,k,1,l+1,r,mes1[i].cnt);
    102         s+=(long long)(mes1[i+1].h-mes1[i].h)*setree[1].len;
    103     }
    104     ans+=(long long)w*h-s;
    105 }
    106 int main()
    107 {
    108     while(~scanf("%d%d%d%d",&w,&h,&n,&m)){
    109         ans=0;
    110         for(int i=0;i<n;i++){
    111             int a,b,c,d;
    112             scanf("%d%d%d%d",&a,&b,&c,&d);
    113             mes[2*i].l=a-m>0?a-m:0;mes[2*i].r=c;mes[2*i].cnt=1;mes[2*i].h=b-1;
    114             mes[2*i+1].l=a-m>0?a-m:0;mes[2*i+1].r=c;mes[2*i+1].cnt=-1;mes[2*i+1].h=d;
    115             sorted[2*i]=a-m>0?a-m:0;sorted[2*i+1]=c;
    116             
    117             mes1[2*i].l=a-1;mes1[2*i].r=c;mes1[2*i].cnt=1;mes1[2*i].h=b-m>0?b-m:0;
    118             mes1[2*i+1].l=a-1;mes1[2*i+1].r=c;mes1[2*i+1].cnt=-1;mes1[2*i+1].h=d;
    119             sorted1[2*i]=a-1;sorted1[2*i+1]=c;        
    120         }
    121         if(m>1){
    122         mes[2*n].l=w-m+1>0?w-m+1:0;mes[2*n].r=w;mes[2*n].h=0;mes[2*n].cnt=1;
    123         mes[2*n+1].l=w-m+1>0?w-m+1:0;mes[2*n+1].r=w;mes[2*n+1].h=h;mes[2*n+1].cnt=-1;
    124         sorted[2*n]=w-m+1>0?w-m+1:0;sorted[2*n+1]=w;
    125         
    126         mes1[2*n].l=0;mes1[2*n].r=w;mes1[2*n].h=h-m+1>0?h-m+1:0;mes1[2*n].cnt=1;
    127         mes1[2*n+1].l=0;mes1[2*n+1].r=w;mes1[2*n+1].h=h;mes1[2*n+1].cnt=-1;
    128         sorted1[2*n]=0;sorted1[2*n+1]=w;
    129         n++;
    130         }
    131         solve();
    132         solve1();
    133         if(m==1)
    134         ans/=2;
    135         printf("%lld\n",ans);
    136     }
    137 }
  • 相关阅读:
    ansible-playbook启动的多种方式
    git版本控制
    特征工程
    特征工程:图像特征提取和深度学习
    tensorflow数据读取机制tf.train.slice_input_producer 和 tf.train.batch 函数
    浙大版《C语言程序设计(第3版)》题目集 练习2-9 整数四则运算 (10 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-8 计算摄氏温度 (10 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-6 计算物体自由下落的距离 (5 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-4 温度转换 (5 分)
    浙大版《C语言程序设计(第3版)》题目集 练习2-3 输出倒三角图案 (5 分)
  • 原文地址:https://www.cnblogs.com/kim888168/p/2912839.html
Copyright © 2011-2022 走看看