1. 程式人生 > >HDU1543(離散化)

HDU1543(離散化)

題意:給你n個矩形然後在牆上按先後順序塗上顏色最後求牆上有多少顏色和該顏色對應的面積

題解:因為n很小離散化一些標記一下這塊面積是被那個顏色佔用即可,注意一些如果有多個顏色是There are並且color要加s只有一個顏色只要There is即可

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<cstdlib>
#include<ctime>
#include<stack>
using namespace std;
#define mes(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(i = a; i <= b; i++)
#define dec(i,a,b) for(i = b; i >= a; i--)
#define fi first
#define se second
#define ls rt<<1
#define rs rt<<1|1
#define mid (L+R)/2
#define lson ls,L,mid
#define rson rs,mid+1,R
typedef double db;
typedef long long int ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
const int mx = 1e5+5;
const int x_move[] = {1,-1,0,0,1,1,-1,-1};
const int y_move[] = {0,0,1,-1,1,-1,1,-1};
int n,m;
struct node{
    int x1,y1,x2,y2;
    int co;
}a[mx];
int x[mx],y[mx];
int vis[1005][1005];
int ans[105];
int main(){
    int t,q,ca = 1;
    while(scanf("%d%d",&n,&m),n||m){
        int d = 0,s = 0;
        scanf("%d",&n);
        mes(ans);
        mes(vis);
        for(int i = 1; i <= n; i++){
            scanf("%d%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2,&a[i].co);
            x[++d] = a[i].x1;
            x[++d] = a[i].x2;
            y[++s] = a[i].y1;
            y[++s] = a[i].y2;
        }
        sort(x+1,x+d+1);
        sort(y+1,y+s+1);
        n = 1,m = 1;
        for(int i = 1; i <= d; i++)
            if(x[i]!=x[n])
                x[++n] = x[i];
        for(int i = 1; i <= s; i++)
            if(y[i]!=y[m])
                y[++m] = y[i];
        d/=2;
        for(int i = 1; i <= d; i++){
            int l,r,L,R;
            l = lower_bound(x+1,x+n,a[i].x1)-x;
            r = lower_bound(x+1,x+n,a[i].x2)-x;
            L = lower_bound(y+1,y+m,a[i].y1)-y;
            R = lower_bound(y+1,y+m,a[i].y2)-y;
            //cout<<l<<r<<L<<R<<endl;
            for(int j = l; j < r; j++)
                for(int k = L; k < R; k++)
                    vis[j][k] = a[i].co;
        }
        for(int i = 1; i < n; i++)
            for(int j = 1; j < m; j++){
                if(vis[i][j]){
            //        cout<<i<<j<<endl;
            //        cout<<vis[i][j]<<endl;
                    ans[vis[i][j]]+= (y[j+1]-y[j])*(x[i+1]-x[i]);
                }
            }
        int num = 0;
        if(ca>1)
            puts("");
        printf("Case %d:\n",ca++);
        for(int i = 1; i <= 100; i++)
            if(ans[i]){
                printf("%d %d\n",i,ans[i]);
                num++;
            }
        if(num==1)
            printf("There is %d color left on the wall.\n",num);
        else
            printf("There are %d colors left on the wall.\n",num);
    }
    return 0;
}

相關推薦

HDU1543離散

題意:給你n個矩形然後在牆上按先後順序塗上顏色最後求牆上有多少顏色和該顏色對應的面積題解:因為n很小離散化一些標記一下這塊面積是被那個顏色佔用即可,注意一些如果有多個顏色是There are並且color要加s只有一個顏色只要There is即可#include<ios

UVA 221 城市化地圖離散

span uva 部分 精度 spa 最大的 分析 重疊 pan 題意: 分析: 記錄一個一開始就想錯的觀點, 以為只要把x 和 width放大到到足夠大(例如10000倍,倍數越高精度越高),然後排序填充一下數軸就可以,就可以解決x坐標是小數的問題。但這樣打了一下,發

Maximizing Advertising 離散

在做題的時候,如果要開vis陣列但是下標比較大的時候,需要用離散化做 sort(tmp+1,tmp+1+n); int num=unique(tmp+1,tmp+n+1)-tmp-1; for(int i=1;i<=n;i++){

POJ 2299 Ultra-QuickSort樹狀數組+離散

計算 htm upd ace stream max arc clas 下標 http://poj.org/problem?id=2299 題意:給出一組數,求逆序對。 思路: 這道題可以用樹狀數組解決,但是在此之前,需要對數據進行一下預處理。 這道題目的數據可

子序列 NYOJ 尺取法+隊列+hash 尺取法+離散

std edi cto res lis http using ring 子串 子序列 時間限制:3000 ms | 內存限制:65535 KB 難度:5 描述 給定一個序列,請你求出該序列的一個連續的子序列,使原串中出現的所有元素皆在該子序列中出現過至少1次。

51Nod 1515並查集、set、離散

() space 並查集 conn com i++ include int esp //代碼還是YY學姐幫改的,自己從來沒有真正A過幾道題,不是看題解就是有BUG找不出,多久了還是改變不了這樣的現狀,或許ACM就是這麽篩選人的吧。從5.24到11.24,再到又一年的5.24

CodeForces 19D Points離散+線段樹+單點更新

cond clu ref console padding top ostream name consola 題目鏈接: huangjing 題意:給了三種操作 1:add(x,y)將這個點增加二維坐標系 2:remove(x,y)將這個點從二維坐標系移除。 3:fin

求逆序數數目樹狀數組+離散

string pre ext com pad margin ons style sizeof 404在玩忍者印記(Mark of the Ninja)操縱忍者時遇到這樣一個場景,兩棟大樓之間有許多繩索,從側面看,就像這個樣子: 我們的忍者非常有好奇心,他可以觀察到每

Codeforces 597B Restaurant離散 + 貪心

ces struct lower c++ 排好序 bit ont scanf sin 題目鏈接 Restaurant 題目意思就是在n個區間內選出盡可能多的區間,使得這些區間互不相交。 我們先對這n個區間去重。 假如有兩個區間[l1, r1],[l2, r2] 若滿

HDU 5877 Weak Pair樹狀數組+dfs+離散

const while 現在 clear return tor blog freopen def http://acm.hdu.edu.cn/showproblem.php?pid=5877 題意: 給出一棵樹,每個頂點都有權值,現在要你找出滿足要求的點對(u,v)數,

POJ 3581 Sequence 後綴數組+離散

return har tag contains nes string 字符 eight ssi

HDU 4325 Flowers樹狀數組+離散

sort pro query 維護 %d pac stream n) ons http://acm.hdu.edu.cn/showproblem.php?pid=4325 題意:給出n個區間和m個詢問,每個詢問為一個x,問有多少個區間包含了x。 思路: 因為數據

hdu1542線段樹掃描線+離散

== 參考 .net 傳遞 區間 bool hdu unique xpl 題目鏈接 要求矩形的面積並 代碼不復雜,主要要理解掃描線的思想以及一些細節的處理。 首先需要將接收到的x坐標離散化,方法就是排序去重。接下來的線段樹建立在這個 關於x坐標的數組上,這很關鍵。線段樹的節

hdu1828線段樹兩次掃描+離散

for 掃描 方向 body 理解 upd sort 有序 ide 題目鏈接 求周長並,思路和註意事項與求面積並類似,我用了最簡單的思路,即x軸做一次線段樹,y軸做一次線段樹。 還有一種方法,只做一次線段樹,在做線段樹的同時求另一個方向的長度,大概的想法我知道,不過在左右區

UVA12171-Sculpture離散+floodfill

con muc desc sep truct empty time quit side Problem UVA12171-Sculpture Accept: 196 Submit: 1152 Time Limit: 3000 mSec Problem Descript

POJ - 2528 Mayor's posters 離散+線段樹區間修改

clu max 單位 cover rst unique ace output https https://cn.vjudge.net/problem/POJ-2528 題意 給定一些海報,可能相互重疊,告訴你每個海報的寬度(高度都一樣的)和先後疊放順序,問沒有被完全蓋

Session in BSU CodeForces - 1027F思維 樹 基環樹 離散

efi mod else node ffffff 思維 基環樹 連通 lse 題意:   有n門考試,每門考試都有兩個時間,存在幾門考試時間沖突,求考完所有的考試,所用的最後時間的最小值  解析:   對於時間沖突的考試 就是一個聯通塊 把每個考試看作邊,兩個時間看作點,

【CodeForces - 633D】Fibonacci-ish 離散,暴力列舉+STPmap,fib數列收斂性質

題幹: Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if the sequence con

CodeForces - 652D Nested Segments線段樹/樹狀陣列+離散

題目連結 看了大佬的部落格:https://blog.csdn.net/chenquanwei_/article/details/79137969;   題意:給n個線段的左右端點,問每個線段包括多少線段;類似於https://blog.csdn.net/weixin_4275

【CodeForces - 255C】Almost Arithmetical Progression dp,離散

題幹: Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A seq