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

称平行于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. solr全文检索基本原理

    场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...

  2. 【C#基础】实现URL Unicode编码,编码、解码相关整理

    1.Unicode编码 引用系统 System.Web using System.Web; string postdata = "SAMLRequest=" + HttpUtili ...

  3. struts2.1.*中再实现了一个servlet的方法

    学习Struts2也有一段时间了,今天用Servlet写了一个验证码,然后搬到Struts2中,惊奇地发现Servlet无法访问,出现404错误!后来折腾了半天,终于找出原因了.这也算我学习中的一个重 ...

  4. [置顶] 对于最新的Android病毒,Smack完全可以抵御

    我写的有关Smack和Android系统结合的技术博客,希望有志之士可以参透其中奥妙,Smack作为Linux内核安全模块,已经可以移植到Android系统中,如果大家弄清我写的Smack安全策略,可 ...

  5. Gson序列化对象时排除字段

    import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; /** *Gson序列化对象排除属性 ...

  6. HDU 1853Cyclic Tour(网络流之最小费用流)

    题目地址:pid=1853">HDU1853 费用流果然好奇妙. .还能够用来推断环...假设每一个点都是环的一部分并且每一个点仅仅能用到一次的话,那每一个点的初度入度都是1,这就能够 ...

  7. http发送post请求

    package com.j1.soa.resource.member.oracle.service; import java.io.BufferedReader; import java.io.IOE ...

  8. String.PadLeft - 格式对齐

    语法:public string PadLeft( int totalWidth, char paddingChar ) 概述,实现的效果是右对齐,返回一个总长度为 totalWidth,如果实际长度 ...

  9. 使用UIPageControl UIScrollView制作APP引导界面

    1. 新建两个视图控制器类(继承自UIViewController), 在AppDelegate.m中指定根视图控制器 #import "AppDelegate.h" #impor ...

  10. poj1418 Viva Confetti 判断圆是否可见

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Viva Confetti Time Limit: 1000MS   Memory ...