zoukankan      html  css  js  c++  java
  • Rectangles(hdu2461)

    Rectangles

    Time Limit: 5000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1497    Accepted Submission(s): 773


    Problem Description
    You are developing a software for painting rectangles on the screen. The software supports drawing several rectangles and filling some of them with a color different from the color of the background. You are to implement an important function. The function answer such queries as what is the colored area if a subset of rectangles on the screen are filled.
     
    Input
    The input consists of multiple test cases. Each test case starts with a line containing two integers N(1 ≤ N ≤ 20) and M(1 ≤ M ≤ 100000), indicating the number of rectangles on the screen and the number of queries, respectively.
    The i-th line of the following N lines contains four integers X1,Y1,X2,Y2 (0 ≤ X1 < X2 ≤ 1000, 0 ≤ Y1 < Y2 ≤ 1000), which indicate that the lower-left and upper-right coordinates of the i-th rectangle are (X1, Y1) and (X2, Y2). Rectangles are numbered from 1 to N.
    The last M lines of each test case describe M queries. Each query starts with a integer R(1<=R ≤ N), which is the number of rectangles the query is supposed to fill. The following list of R integers in the same line gives the rectangles the query is supposed to fill, each integer of which will be between 1 and N, inclusive.

    The last test case is followed by a line containing two zeros.
     
    Output
    For each test case, print a line containing the test case number( beginning with 1).
    For each query in the input, print a line containing the query number (beginning with 1) followed by the corresponding answer for the query. Print a blank line after the output for each test case.
    思路:容斥原理;
    感觉这题的数据有点水,按照这个复杂度O(2^n*m)是 感觉会超时的;
    跑了1200多Ms。
    思路很简单,就是容斥求面积。
      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<string.h>
      5 #include<queue>
      6 #include<stack>
      7 #include<map>
      8 using namespace std;
      9 typedef struct pp
     10 {
     11         int x1;
     12         int y1;
     13         int x2;
     14         int y2;
     15 } ss;
     16 ss ju[30];
     17 int quer[1<<22];
     18 int cnt[30];
     19 int aa[1<<22];
     20 int bt[30];
     21 int cp[100005];
     22 int ask[100005];
     23 int tt[100];
     24 int N;
     25 void dfs(int k,int u);
     26 int main(void)
     27 {
     28         int i,j,k,p,q;
     29         int kk=0;
     30         while(scanf("%d %d",&p,&q),p!=0&&q!=0)
     31         {
     32                 kk++;
     33                 memset(ask,0,sizeof(ask));
     34                 for(i=0; i<p; i++)
     35                 {
     36                         scanf("%d %d %d %d",&ju[i].x1,&ju[i].y1,&ju[i].x2,&ju[i].y2);
     37                 }
     38                 int s;
     39                 int n;
     40                 for(s=0; s<q; s++)
     41                 {
     42                         N=0;
     43                         scanf("%d",&n);
     44                         int mn=0;
     45                         int dd;
     46                         for(i=0; i<n; i++)
     47                         {
     48                                 scanf("%d",&dd);
     49                                 mn|=(1<<(dd-1));
     50                         }
     51                         cp[s]=mn;
     52                 }
     53                 int flag[23];
     54                 for(i=1; i<=(1<<p)-1; i++)
     55                 {
     56                         int cn=0;
     57                         memset(flag,0,sizeof(flag));
     58                         for(j=0; j<p; j++)
     59                         {
     60                                 if(i&(1<<j))
     61                                 {
     62                                         cn++;
     63                                         flag[j]=1;
     64                                 }
     65                         }
     66                         int nn;
     67                         int ak=0;
     68                         for(nn=0; nn<22; nn++)
     69                         {
     70                                 if(flag[nn])
     71                                 {
     72                                         cnt[ak++]=nn;
     73                                 }
     74                         }
     75                         int mm;
     76                         int xx1,yy1,xx2,yy2;
     77                         xx1=ju[cnt[0]].x1;
     78                         yy1=ju[cnt[0]].y1;
     79                         xx2=ju[cnt[0]].x2;
     80                         yy2=ju[cnt[0]].y2;
     81                         int uu=0;
     82                         for(nn=1; nn<ak; nn++)
     83                         {
     84                                 if(xx1>=ju[cnt[nn]].x2)
     85                                 {
     86                                         uu=1;
     87                                         aa[i]=0;
     88                                         break;
     89                                 }
     90                                 else if(xx2<=ju[cnt[nn]].x1)
     91                                 {
     92                                         uu=1;
     93                                         aa[i]=0;
     94                                         break;
     95                                 }
     96                                 else if(yy1>=ju[cnt[nn]].y2)
     97                                 {
     98                                         uu=1;
     99                                         aa[i]=0;
    100                                         break;
    101                                 }
    102                                 else if(yy2<=ju[cnt[nn]].y1)
    103                                 {
    104                                         uu=1;
    105                                         aa[i]=0;
    106                                         break;
    107                                 }
    108                                 else
    109                                 {
    110                                         xx1=max(xx1,ju[cnt[nn]].x1);
    111                                         yy1=max(yy1,ju[cnt[nn]].y1);
    112                                         xx2=min(xx2,ju[cnt[nn]].x2);
    113                                         yy2=min(yy2,ju[cnt[nn]].y2);
    114                                 }
    115                         }
    116                         if(!uu)
    117                         {
    118                                 int miji=abs(xx1-xx2)*abs(yy1-yy2);
    119                                 aa[i]=miji;
    120                                 for(s=0; s<q; s++)
    121                                 {
    122                                         int gg=cp[s]|i;
    123                                         if(gg<=cp[s])
    124                                         {
    125                                                 if(cn%2)
    126                                                 {
    127                                                         ask[s]+=aa[i];
    128                                                 }
    129                                                 else ask[s]-=aa[i];
    130                                         }
    131                                 }
    132                         }
    133                 }
    134                 printf("Case %d:
    ",kk);
    135                 for(j=0; j<q; j++)
    136                 {
    137                         printf("Query %d: ",j+1);
    138                         printf("%d
    ",ask[j]);
    139                 }
    140                 printf("
    ");
    141         }
    142         return 0;
    143 }
     
    油!油!you@
  • 相关阅读:
    网络编程
    GUI编程
    Java数组
    Day24
    Day23
    Day22
    Day21
    Day20
    Day19
    Day18
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5462851.html
Copyright © 2011-2022 走看看