zoukankan      html  css  js  c++  java
  • [LA4108]SKYLINE

    [LA4108]SKYLINE

    试题描述

    The skyline of Singapore as viewed from the Marina Promenade (shown on the left) is one of the iconic scenes of Singapore. Country X would also like to create an iconic skyline, and it has put up a call for proposals. Each submitted proposal is a description of a proposed skyline and one of the metrics that country X will use to evaluate a proposed skyline is the amount of overlap in the proposed sky-line.

    epsfbox{p4108a.eps}

    As the assistant to the chair of the skyline evaluation committee, you have been tasked with determining the amount of overlap in each proposal. Each proposal is a sequence of buildings, $ langle$b1,b2,..., bn$ 
angle$ , where a building is specified by its left and right endpoint and its height. The buildings are specified in back to front order, in other words a building which appears later in the sequence appears in front of a building which appears earlier in the sequence.

    The skyline formed by the first k buildings is the union of the rectangles of the first k buildings (see Figure 4). The overlap of a building, bi , is defined as the total horizontal length of the parts of bi , whose height is greater than or equal to the skyline behind it. This is equivalent to the total horizontal length of parts of the skyline behind bi which has a height that is less than or equal to hi , where hi is the height of building bi . You may assume that initially the skyline has height zero everywhere.

    输入

    The input consists of a line containing the number c of datasets, followed by c datasets, followed by a line containing the number `0'.

    The first line of each dataset consists of a single positive integer, n (0 < n < 100000) , which is the number of buildings in the proposal. The following n lines of each dataset each contains a description of a single building. Thei -th line is a description of building bi . Each building bi is described by three positive integers, separated by spaces, namely, li , ri and hi , where li and rj (0 < li < ri$ le$100000) represents the left and right end point of the building and hi represents the height of the building.

    epsfbox{p4108b.eps}

    输出

    The output consists of one line for each dataset. The c -th line contains one single integer, representing the amount of overlap in the proposal for dataset c . You may assume that the amount of overlap for each dataset is at most 2000000.

    Note: In this test case, the overlap of building b1 , b2 and b3 are 6, 4 and 4 respectively. Figure 4 shows how to compute the overlap of building b3 . The grey area represents the skyline formed by b1 and b2 and the black rectangle represents b3 . As shown in the figure, the length of the skyline covered by b3 is from position 3 to position 5 and from position 11 to position 13, therefore the overlap of b3 is 4.

    输入示例

    1
    3
    5 11 3
    1 10 1
    3 13 2
    0

    输出示例

    14

    数据规模及约定

    见“输入

    题解

    为尊重原题面我就不翻译了。线段树打懒标记,记录一下区间最大最小值,小于最小值直接剪枝,大于等于最大值直接打懒标记并记录答案,否则下传标记接着递归处理。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    using namespace std;
    
    const int BufferSize = 1 << 16;
    char buffer[BufferSize], *Head, *Tail;
    inline char Getchar() {
        if(Head == Tail) {
            int l = fread(buffer, 1, BufferSize, stdin);
            Tail = (Head = buffer) + l;
        }
        return *Head++;
    }
    int read() {
        int x = 0, f = 1; char c = Getchar();
        while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
        while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
        return x * f;
    }
    
    #define maxn 100010
    int n, q, ans;
    
    int maxv[maxn<<2], minv[maxn<<2], setv[maxn<<2];
    void build(int L, int R, int o) {
    	maxv[o] = minv[o] = 0; setv[o] = -1;
    	if(L == R) return ;
    	int M = L + R >> 1, lc = o << 1, rc = lc | 1;
    	build(L, M, lc); build(M+1, R, rc);
    	return ;
    }
    void pushdown(int o) {
    	int lc = o << 1, rc = lc | 1;
    	if(setv[o] >= 0) {
    		maxv[o] = minv[o] = setv[o];
    		setv[lc] = setv[rc] = setv[o];
    		setv[o] = -1;
    	}
    	return ;
    }
    int ql, qr;
    void update(int L, int R, int o, int h) {
    	pushdown(o);
    	if(minv[o] > h) return ;
    	if(ql <= L && R <= qr && maxv[o] <= h) {
    		maxv[o] = minv[o] = setv[o] = h;
    		ans += (R - L + 1);
    		return ;
    	}
    	int M = L + R >> 1, lc = o << 1, rc = lc | 1;
    	if(ql <= M) update(L, M, lc, h);
    	if(qr > M) update(M+1, R, rc, h);
    	maxv[o] = max(maxv[lc], maxv[rc]);
    	minv[o] = min(minv[lc], minv[rc]);
    	return ;
    }
    
    int main() {
    	int T = read();
    	while(T--) {
    		q = read(); ans = 0;
    		n = maxn - 10;
    		build(1, n, 1);
    		while(q--) {
    			ql = read(); qr = read() - 1; int h = read();
    			update(1, n, 1, h);
    		}
    		printf("%d
    ", ans);
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    阅读提问
    阅读笔记
    结对需求分析
    分工
    对软件工程课程的期望
    JAVAWEB-Spring Boot学习
    团队编程-项目作业6-程序维护
    团队-吃货之家-项目总结
    团队编程项目作业5-小组评分
    安装Vue.js之Node.js,NMP环境搭建
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5752140.html
Copyright © 2011-2022 走看看