2017-09-24 20:11:21

writer:pprp

找到的大神的代码,直接过了

采用了扫描线+线段树的算法,先码了,作为模板也不错啊

题目链接:https://nanti.jisuanke.com/t/17313

题意:给你很多个矩形,让你得到矩形的面积,重叠部分只算一次

代码如下:

//ac F
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm> using namespace std;
typedef long long ll;
const int maxn=1e6+; #define mm(a) memset(a,0,sizeof(a)) int num1[maxn*];
int num[maxn*],X[maxn*];
struct edge
{
int l,r,h;
int s;//s为1是下边,s为-1是上边
edge() {};
edge(int a,int b,int c,int d) : l(a),r(b),h(c),s(d) {}
bool operator<(const edge &n)const
{
return h<n.h;
}
} ss[maxn]; void pushup(int le,int ri,int node)
{
if(num1[node])
num[node]=X[ri+]-X[le];//在更新的时候,可能两个矩阵有重叠,这样就不能像以前那么更新,而是将le和ri传入
else if(le==ri)
num[node]=; //然后将X[ri+1]-X[le]的值进行更新,避免了重复的长度
else
num[node]=num[node<<]+num[node<<|];
}
void update(int l,int r,int add,int le,int ri,int node)
{
if(l<=le&&ri<=r)
{
num1[node]+=add;//与懒惰标记类似
pushup(le,ri,node);
return ;
}
int t=(le+ri)>>;
if(l<=t) update(l,r,add,le,t,node<<);
if(r>t) update(l,r,add,t+,ri,node<<|);
pushup(le,ri,node);
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
if(n == )
{
cout << "*" << endl;
break;
}
int a,b,c,d;
int k=;
for(int i=; i<n; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
X[k]=a;
ss[k++]=edge(a,c,b,);
X[k]=c;
ss[k++]=edge(a,c,d,-);
}
sort(X,X+k);
sort(ss,ss+k);
int k1=;
for(int i=; i<k; i++) //对X进行离散化
{
if(X[i]!=X[i-]) X[k1++]=X[i];
}
mm(num);
mm(num1);
int ans=;
for(int i=; i<k-; i++)
{
int l=lower_bound(X,X+k1,ss[i].l)-X;
int r=lower_bound(X,X+k1,ss[i].r)-X-;
update(l,r,ss[i].s,,k1-,);
ans+=num[]*(ss[i+].h-ss[i].h);//num[1]为当前横坐标的总长度
}
cout << ans << endl;
}
return ;
}

2017 ACM/ICPC 南宁区 网络赛 Overlapping Rectangles的更多相关文章

  1. 【2017 ACM/ICPC 乌鲁木齐赛区网络赛环境测试赛 E】蒜头君的排序

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 莫队算法+树状数组. 区间增加1或减少1. 对逆序对的影响是固定的. (用冒泡排序变成升序的交换次数,就是逆序对的个数) [错的次数] 0 [ ...

  2. 2017ICPC南宁赛区网络赛 Overlapping Rectangles(重叠矩阵面积和=离散化模板)

    There are nnn rectangles on the plane. The problem is to find the area of the union of these rectang ...

  3. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  4. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles

    There are nn rectangles on the plane. The problem is to find the area of the union of these rectangl ...

  5. 2014 ACM/ICPC 鞍山赛区网络赛(清华命题)

    为迎接10月17号清华命题的鞍山现场赛 杭电上的题目 Biconnected(hdu4997)     状态压缩DP Rotate(hdu4998)    相对任一点的旋转 Overt(hdu4999 ...

  6. 2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest

    2017 ACM - ICPC Asia Ho Chi Minh City Regional Contest A - Arranging Wine 题目描述:有\(R\)个红箱和\(W\)个白箱,将这 ...

  7. 2017 ACM/ICPC Asia Regional Shenyang Online spfa+最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  8. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  9. 2017 ACM/ICPC Shenyang Online SPFA+无向图最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

随机推荐

  1. dstat命令--检查linux系统性能

    系统性能的相关工具:vmstat.netstat.iostat.ifstat. dstat命令可以查看虚拟内存.网络连接和接口.cpu活动.输入/输出设备等.

  2. mysql一个特殊的条件.字符串除以0的结果.

    select *  form  user  where  username = ''/1; 一开始一看以为还是错误的语法.... 结果出来一堆结果.. 原来条件是  ''除以1 ''除以1 结果是什么 ...

  3. Java8 新特性之Stream API

    1. Stream 概述 Stream 是Java8中处理集合的关键抽象概念,可以对集合执行非常复杂的查找,过滤和映射数据等操作; 使用 Stream API 对集合数据进行操作,就类似于使用 SQL ...

  4. 剑指Offer——二叉树的深度

    题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 分析: 二叉树的深度等于其左子树的深度和右子树的深度两个中最大的深 ...

  5. paintschainer项目

    github:https://github.com/pfnet/PaintsChainer tensorflow实现:https://github.com/mizti/tensor_paint 在线测 ...

  6. print文档

    文档 def print(self, *args, sep=' ', end='\n', file=None): # known special case of print ""& ...

  7. POJ1159:Palindrome(LCS小应用 回文)

    地址:http://poj.org/problem?id=1159 题目需求: 给你一个字符串,求最少添加多少字符可以使之构成回文串. 题目解析: 简单做法是直接对它和它的逆序串求最长公共子序列长度l ...

  8. 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小

    题目描述: 有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小.例如:var a=[100,99,98, ...

  9. git安装教程(windows安装)

    git下载地址 https://git-scm.com/download/win 选择安装的组件,推荐全选 Additional icons 附加图标 ​ On the Desktop 在桌面上 Wi ...

  10. mac 安装Sequel Pro

    安装命令如下 Install the App Press Command+Space and type Terminal and press enter/return key. Run in Term ...