离散化计算重叠矩形的周长。

称平行于x轴的边为横边,我们以横边为例,某一矩形中y坐标比较小的横边我们称为始边,另一边我们称为终边。用一条扫描线从下往上扫描,当扫到一条始边的时候,如果这条始边的正下方出现过k条始边和k条终边,那么这条始边肯定是没被覆盖住的,统计结果;当扫到一条终边的时候,如果这条始边的正下方出现过k条始边和k-1条终边,同理,统计结果。

注意扫描到的边要拆成单位长度的小边分别分析。

Executing...
   Test 1: TEST OK [0.005 secs, 4156 KB]
   Test 2: TEST OK [0.008 secs, 4156 KB]
   Test 3: TEST OK [0.016 secs, 4156 KB]
   Test 4: TEST OK [0.008 secs, 4156 KB]
   Test 5: TEST OK [0.016 secs, 4156 KB]
   Test 6: TEST OK [0.008 secs, 4156 KB]
   Test 7: TEST OK [0.043 secs, 4156 KB]
   Test 8: TEST OK [0.014 secs, 4156 KB]
   Test 9: TEST OK [0.019 secs, 4156 KB]
   Test 10: TEST OK [0.008 secs, 4156 KB]
   Test 11: TEST OK [0.103 secs, 4156 KB]

All tests OK.

Your program ('picture') produced all correct answers! This is your submission #4 for this problem. Congratulations!

 #include <iostream>
#include <memory.h>
#include <stdio.h>
#include <algorithm>
using namespace std; class CEdge
{
public:
int y;
int x1,x2;
bool isBegin;
CEdge(int y0=,int x10=,int x20=,bool flag=false):y(y0),x1(x10),x2(x20),isBegin(flag){}
bool operator <(const CEdge &e2)const
{
return y<e2.y || y==e2.y && isBegin;
}
}; int cnt[]={};
int n; int solve(CEdge edges[])
{
int ans=;
memset(cnt,,sizeof cnt); sort(edges,edges+*n);
for(int i=;i<*n;i++)
{
CEdge e=edges[i];
for(int j=e.x1;j<e.x2;j++)
{
if(e.isBegin && cnt[j]== || !e.isBegin && cnt[j]==)
ans++; if(e.isBegin)
cnt[j]++;
else
cnt[j]--;
}
}
return ans;
} CEdge eh[],ev[]; int main()
{
freopen("picture.in","r",stdin);
freopen("picture.out","w",stdout);
cin>>n;
for(int i=;i<n;i++)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
x1+=;
x2+=;
y1+=;
y2+=; // 加入数组 横边
eh[*i]=CEdge(y1,x1,x2,true);
eh[*i+]=CEdge(y2,x1,x2,false);
// 加入数组 竖边
ev[*i]=CEdge(x1,y1,y2,true);
ev[*i+]=CEdge(x2,y1,y2,false);
} printf("%d\n",solve(eh)+solve(ev));
return ;
}

usaco5.5-Picture的更多相关文章

  1. P1856 [USACO5.5]矩形周长Picture

    P1856 [USACO5.5]矩形周长Picture $len$            $sum$              $num$             $flag\_l$ $flage\_ ...

  2. 洛谷P1856 [USACO5.5]矩形周长Picture

    题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...

  3. [题解]P1856 [USACO5.5]矩形周长Picture

    Loli 考试的题目之一 题目地址 \(N^2\)做法 #include <cstdio> #include <cstring> #define re register #de ...

  4. luogu1856 [USACO5.5]矩形周长Picture

    看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆 ...

  5. luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树

    Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...

  6. P1856 [USACO5.5]矩形周长Picture[扫描线]

    题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...

  7. [USACO5.5] 矩形周长Picture

    https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...

  8. 「USACO5.5」矩形周长Picture

    题目描述 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 编写一个程序计算周长. 如图1所示7个矩形. 如图2所 ...

  9. Luogu P1856 [USACO5.5]矩形周长Picture

    线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区 ...

  10. Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)

    对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...

随机推荐

  1. XSHELL使用技巧总结

    1. 配置鼠标右键直接黏贴,选中直接复制(和putty行为一致) 工具->选项->键盘和鼠标,向右按钮 2. 如何在不同的选项卡切换 查看->会话选项卡

  2. (转)ObjC利用正则表达式抓取网页内容(网络爬虫)

    转自:http://www.cocoachina.com/bbs/read.php?tid=103813 *****boy]原创 2012年5月20日 在开发项目的过程,很多情况下我们需要利用互联网上 ...

  3. java 存储oracle的clob字段

    项目中有很长的字符创需要存储,用到了oracle的clob字段,直接很长的字符串插入到clob字段中会报字符过长的异常,于是便寻求解决方案.看到这个博客写的还不错 首先,创建一个含CLOB字段的表: ...

  4. UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))

    Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...

  5. Codeforces 220B - Little Elephant and Array 离线树状数组

    This problem can be solve in simpler O(NsqrtN) solution, but I will describe O(NlogN) one. We will s ...

  6. Qt 格式化字符串

    Qt字符串格式化性能比较 Qt字符串格式方法有三种, QString::arg(), QString::sprinft()和QStringList::join().今天我做了个简单的性能测试, 希望对 ...

  7. VLV INDEX

    Normally, when the Directory Server conducts a search, the server looks through the entire entry for ...

  8. [编译原理代码][NFA转DFA并最小化DFA并使用DFA进行词法分析]

    #include <iostream> #include <vector> #include <cstring> #include "stack" ...

  9. mybati的存储过程

    这里我就以的存储过程为例,大家一起学习一下,

  10. EasyUI 1.4.4 DataGrid(大数据量) bufferview滚动时不加载下一页数据解决方案

    在使用Easyui DataGrid 过程中,发现若单页数据量超过300,IE浏览器加载速度很慢.也通过网上找寻了很多解决方案,最典型的就是去掉datagrid的自动列宽以及自动行高判断. 1.解决自 ...