`
Coco_young
  • 浏览: 125880 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[离散化+扫描线+线段树]LightOJ 1120 - Rectangle Union

 
阅读更多

传送门:http://lightoj.com/volume_showproblem.php?problem=1120

1120 - Rectangle Union
Time Limit:2 second(s) Memory Limit:64 MB

Given some axis parallel rectangles, you have to find the union of their area. For example, see the shaded regions in the picture. Each rectangle will be denoted by four integers. They arex1, y1, x2, y2where(x1, y1)denotes the lower left corner and(x2, y2)denotes the upper right corner.

For the picture above, there are three rectangles. For the yellow rectangle the co-ordinates are (0, 2) and (3, 6). For the blue rectangle the co-ordinates are (1, 3) and (6, 7). For the green rectangle the co-ordinates are (2, 1) and (5, 4). So, the union area is (the shaded region) 31 square units.

Input

Input starts with an integerT (≤ 13), denoting the number of test cases.

Each case starts with a line containing an integern (1 ≤ n ≤ 30000). Each of the nextnlines will contain four integersx1, y1, x2, y2(0 ≤ x1, y1, x2, y2≤ 109, x1< x2, y1< y2)denoting a rectangle.

Output

For each case, print the case number and the union area.

Sample Input

Output for Sample Input

2

3

0 2 3 6

1 3 6 7

2 1 5 4

2

0 0 4 4

1 1 2 5

Case 1: 31

Case 2: 17

Notes

Dataset is huge, use faster I/O methods.

题意:很裸就矩形面积并,直接扫描线.

注意点:由于面积最大可以达到10^18次方,所以结果需要用long long,而且在中间计算时需要强制转换,否则会溢出.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 33333;
int x[MAXN<<1],t,n,sum[MAXN<<3],cnt[MAXN<<3],x_num,line_num;
unsigned __int64 ans;
struct Line{
    int l,r,h,s;
    Line(){}
    Line(int ll,int rr,int hh,int ss):l(ll),r(rr),h(hh),s(ss){}
    bool operator < (const Line &l) const{
        return h<l.h;
    }
}L[MAXN<<1];
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
void build(){
    memset(sum,0,sizeof(sum));
    memset(cnt,0,sizeof(cnt));
    x_num = line_num = 0;
    ans = 0;
}
void pushUP(int rt,int l,int r){
    if(cnt[rt]){
        sum[rt] = x[r]-x[l];
    }else{
        sum[rt] = sum[rt<<1]+sum[rt<<1|1];
    }
}
void update(int L,int R,int s,int l,int r,int rt){
    if(L<=l&&R>=r){
        cnt[rt]+=s;
        pushUP(rt,l,r);
        return;
    }
    if(l==r-1)return;
    int m = (l+r)>>1;
    if(m>L)update(L,R,s,lson);
    if(m<R)update(L,R,s,rson);
    pushUP(rt,l,r);
}
int search(int k){
    int l=0,r=x_num-1,m;
    while(l<=r){
        m = (l+r)>>1;
        if(x[m]==k)return m;
        else if(k<x[m])r = m-1;
        else l = m+1;
    }
    return -1;
}
int main(){
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++){
        scanf("%d",&n);
        build();
        for(int i=0;i<n;i++){
            int a,b,c,d;
            scanf("%d%d%d%d",&a,&b,&c,&d);
            x[x_num++] = a;
            x[x_num++] = c;
            L[line_num++] = Line(a,c,b,1);
            L[line_num++] = Line(a,c,d,-1);
        }
        sort(x,x+x_num);sort(L,L+line_num);
        int temp = 1;
        for(int i=1;i<x_num;i++)if(x[i]!=x[i-1])x[temp++]=x[i];
        x_num = temp;
        for(int i=0;i<line_num;i++){
            int l = search(L[i].l);
            int r = search(L[i].r);
            if(!i){
                update(l,r,L[i].s,0,x_num-1,1);
            }else{
                ans += (__int64)sum[1]*(L[i].h-L[i-1].h);
                update(l,r,L[i].s,0,x_num-1,1);
            }
        }
        printf("Case %d: %llu\n",cas,ans);
    }
    return 0;
}



分享到:
评论

相关推荐

    LightOJ-Solved-Code:LightOJ 解决问题代码

    【标题】"LightOJ-Solved-Code"指的是一个关于在Light Online Judge平台上解决编程问题的代码集合。这个集合很可能包含了作者在LightOJ上解答各类算法问题的C++源代码。LightOJ是一个在线的编程竞赛平台,它提供了一...

    lightoj-tutorial-editorial-by-sayeed:像Codeforces编辑模式一样在lightoj上发表社论​​!

    标题中的“lightoj-tutorial-editorial-by-sayeed”指的是LightOJ(Light Online Judge)平台上的一篇教程或社论,由用户Sayeed撰写,旨在帮助用户了解如何在LightOJ上创建类似于Codeforces编辑模式的教程。...

    LightOJ-solutions

    【标题】"LightOJ-solutions" 是一个与编程竞赛相关的资源,主要包含了参与 LightOJ(Light Online Judge)平台的解题方案。这个压缩包很可能是某位参赛者或编程爱好者整理的代码集合,旨在分享他们在解决 LightOJ ...

    leetcode中国-ACM_Training::balloon:不是为了比赛,而是为了训练和兴趣

    leetcode中国 数据结构和算法编码 议程 :balloon: 不是为了比赛,而是为了训练和兴趣。 Python3 你可以在这里找到我的 LeetCode 解决方案:(等待打开) ...LightOJ 1012 --- dfs transform 13. HDU 1495 --- compl

    LightOJ

    "LightOJ"是一个在线判题系统,专为竞赛编程和算法训练而设计。它允许用户提交代码并立即获得运行结果、时间复杂度和空间复杂度等反馈。这个平台广泛支持多种编程语言,包括C++,因此在标签中提到了"C++"。现在我们...

    CHelper同伴「CHelper Companion」「Competitive Companion」-crx插件

    解析编程问题,并将其发送给CHelper插件以实现IntelliJ IDEA。 竞争性伴侣解析程序...-HackerRank-HDU在线法官-Kattis-LightOJ-NYTD在线法官-PEG法官-POJ-QDUOJ-Timus-URI在线法官 支持语言:English (United States)

    问题教程:一个包含有关LightOJ问题的教程的存储库

    LightOJ是一个在线编程竞赛平台,它为程序员和计算机科学爱好者提供了一系列的算法问题来解决。这个存储库是一个专门针对LightOJ问题的教程集合,旨在帮助用户更好地理解和解决这些问题。下面,我们将深入探讨其中...

    LightOJ:收集我对http上发现的一些问题的解决方案

    【压缩包子文件的文件名称列表】"LightOJ-master"可能是一个Git仓库的名称,暗示了这个问题解决方案可能是开源的,并且包含了一个项目的主分支。通常,这样的仓库会包含源代码、文档、测试用例和其他资源,帮助用户...

    leetcode2sumc-Dynamic-Programming:从各种在线评委(包括Leetcode、SPOJ、LightOJ、Codef

    leetcode 2 和 c 动态规划 动态规划相关问题的解答。 这些问题来自各种在线评委,包括 、 、 等。 解决方案是用 C++ 编码的。 —— —— —— —— —— —— —— —— —— —— —— —— ...——

    Solved_programming_problems_Online_judges:这个存储库包括我解决的各种在线法官的编程问题的解决方案,即 UVa、Topcoder、Codeforces、Hackerrank、LightOj、Spoj、Project Euler 等

    已解决的编程问题 Online Judges 这个存储库包含我解决的各种在线法官的编程问题的解决方案,即 UVa、Topcoder、Codeforces、Hackerrank、LightOj、Spoj、Project Euler 等。

    problemSolving

    - **熟悉基础算法和数据结构**:了解并掌握排序、搜索、图论、动态规划等基础算法,同时理解链表、树、队列、堆等数据结构的实现和应用。 - **练习编程技巧**:通过解决实际问题来提高编程技巧,注意代码的效率、...

    Ishmam-Rahman

    这是乔杜里医学博士。 伊斯玛姆·拉赫曼(Ishmam Rahman) :closed_mailbox_with_raised_flag: 联络我: ... LightOJ: ://lightoj.com/user/ishmam64 脸书: : 目标:使自己在新技术的海洋中立足,在这里我可

    solving-oj-problems

    描述中提到的“uva”,“lightoj”,“spoj”,“timus”都是知名的在线编程竞赛平台,它们为程序员提供了各种算法和逻辑思维的练习题目。 在这个项目的压缩包 "solving-oj-problems-master" 中,我们可以推测它...

    test_program:编程竞赛问题的自动化工具

    测试程序TestProgram 是针对竞争性编程程序(即 Codeforces、lightOJ、OmegaUp 等)的专用测试工具。 当我们解决问题时,我们必须非常小心,并致力于解决所有可能的情况。 我们的解决方案在登顶前正确解决的测试用例...

    解决问题:您可以在其中学习算法和数据结构的平台。 竞争程序员的天堂

    这个仓库是关于什么的 创建该存储库是为了组织与数据结构和算法有关的问题的解决方案。 并且,如果可能的话,为学习与数据结构和算法有关的各种概念提供一种更简单的方法。 以下评委使用的问题 ...

    开心农场java源码-showrav-ansary:我的GitHub登陆页面

    开心农场java源码AA Noman Ansary 你好呀! 我的名字是AA Noman Ansary 。 但我更喜欢被称为Showrav...问题解决:LightOJ。 代码部队。 蒂姆斯。 紫外线。 成就 以下是我的一些显著成就: BRAC 大学副校长证书。 (2019)

    Depressed of Competitive Programming-crx插件

    race_words = [“后缀数组”,“前缀特里”,“动态编程”,“竞赛”,“ codeforces”,“编程”,“竞争性编程”,“算法”,“数据结构”,“ codeforces”,“ light oj”,“ lightoj”,“ spoj”,“堆栈”,...

Global site tag (gtag.js) - Google Analytics