哇!这小破题坑了我好久。

扫描线+线段树

这题数据范围小,没离散化。真要离散化我还搞不好呢。

具体的看这个博客吧。

主要是这个坑爹的c,len把我搞了,其他的还好。

代码:

 #include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
struct Node
{
int len,s;
} node[];
struct Edge
{
int L,R,high,flag;
bool operator < (const Edge &a) const
{
if(this->high!=a.high)return this->high>a.high;
return this->flag<a.flag;
}
};
priority_queue<Edge>x;
priority_queue<Edge>y;
void build(int l,int r,int o)
{
node[o].len=;
node[o].s=;
if(l==r) return;
int mid=(l+r)>>;
build(l,mid,o<<);
build(mid+,r,o<<|);
return;
}
void up(int l,int r,int o)
{
if(node[o].s) node[o].len=r-l+;
else if(l==r) node[o].len=;
else node[o].len=node[o<<].len+node[o<<|].len;
return;
}
void add(int L,int R,int v,int l,int r,int o)
{
//printf("add:%d %d %d %d %d %d\n",L,R,v,l,r,o);
if(L<=l && r<=R)
{
node[o].s+=v;
up(l,r,o);
return;///这里的return一开始忘了打,死循环。
}
if(R<l || r<L) return;
int mid=(l+r)>>;
if(L<=mid) add(L,R,v,l,mid,o<<);
if(mid<R) add(L,R,v,mid+,r,o<<|);
up(l,r,o);
return;
}
void adde(int x1,int y1,int x2,int yyy)
{
Edge xup,xlow,yup,ylow;
xup.L=xlow.L=ylow.high=x1;
xup.R=xlow.R=yup.high=x2;
yup.L=ylow.L=xlow.high=y1;
yup.R=ylow.R=xup.high=yyy;
xlow.flag=ylow.flag=;
xup.flag=yup.flag=-;
//printf("adde:%d %d %d %d\n",xup.L,xup.R,xup.high,xup.flag);
//printf("adde:%d %d %d %d\n",xlow.L,xlow.R,xlow.high,xlow.flag);
x.push(xup);
x.push(xlow);
y.push(yup);
y.push(ylow);
return;
}
int main()
{
int N = ;
build(,N,);
int n,x1,x2,y1,yyy;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&yyy);///这里 的变量名传错了,0分
adde(x1+,y1+,x2+,yyy+);
}
Edge e;int len=;
long long int ans=;
while(!x.empty())
{
//printf("x\n");
e=x.top();
x.pop();
//printf("edge:%d %d %d %d\n",e.L,e.R,e.high,e.flag);
add(e.L,e.R-,e.flag,,N,);
ans+=abs(node[].len-len);
len=node[].len;
//printf("ans=%d\n",ans);
}
build(,N,);len=;
while(!y.empty())
{
//printf("y\n");
e=y.top();
//printf("edge:%d %d %d %d\n",e.L,e.R,e.high,e.flag);
y.pop();
add(e.L,e.R-,e.flag,,N,);
ans+=abs(node[].len-len);
len=node[].len;
//printf("ans=%d\n",ans);
}
printf("%lld",ans);
return ;
}
/**
4
1 1 2 2
3 1 5 3
4 0 6 2
5 -1 7 1 20
*/

洛谷的数据好水

还有更高级的方法我没搞了,晦涩难懂......

P1856 矩形周长的更多相关文章

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

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

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

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

  3. 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

    package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...

  4. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并

    题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...

  5. HDU 1828 扫描线(矩形周长并)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. HDU 6362(求椭圆中矩形周长的期望 数学)

    题意是给定一个椭圆标准方程的a,b(椭圆的长半轴长和短半轴长),在[0,b]内取一个数,则过点(0,b)且平行于x轴的直线与椭圆交于两点,再将此两点关于x轴做对称点,顺次连接此四点构成矩形,求出这些矩 ...

  7. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  8. 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线

    51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...

  9. POJ 1177 矩形周长并 模板

    Picture 题目链接 http://poj.org/problem?id=1177 Description A number of rectangular posters, photographs ...

随机推荐

  1. 支持自定义协议的虚拟仪器【winform版】

    首先,这个程序的由来,额,工作以来,做的最久的就是上位机,对市面上的大部分组态软件都感到不满,不好用,LabView虽然用起来不错,但是入门还是不够简单,刚好现在工作比较闲(已经不再做上位机了),所以 ...

  2. SpringMvc执行过程

    --Test过程: 1. 先执行各种 Filter 2. HttpServlet.service(ServletRequest req, ServletResponse res) 3. HttpSer ...

  3. Spring RPC 入门学习(2)-获取Map对象

    Spring RPC传递Map用例编写 1. 新建RPC接口类 package com.cvicse.ump.rpc.interfaceDefine; import java.util.Map; pu ...

  4. linux-文件数据操作awk命令

    最后一列是:交互外壳 单引号里的内容不会被bash扩展 cut 同样可以做到 "\t" 制表符 cut 和 sed 结合同样可以实现 扩展:匿名方法可以有多个,and方法只能有一个 ...

  5. MySQL主从复制配置遇到的部分问题

    网上配置教程很多,我也是参考其他人的教程完成的,主要遇到了以下几个问题,如果以后有人遇到相同的希望能够给大家写提示吧. 1.my.cnf文件配置 Master上的my.cnf中配置的server_id ...

  6. Python学习笔记(二)——数据类型

    1.数据类型 Python有五个标准的数据类型: Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) 2.Python数字类型 Pyth ...

  7. 第二个spring,第一天

    陈志棚:成绩的统筹 李天麟:界面音乐 徐侃:代码算法 由于队友们都回家了,只有我在努力的写代码...

  8. Golang 入门~~基础知识

    变量声明 //通用形式,指定变量名,变量类型,变量值 var name int = 99 fmt.Println(name) //指定变量名,以及变量类型,未指定值的时候默认是类型零值 var age ...

  9. 在Windows命令行中编译运行C/C++程序

    此处运行环境是在Windos下,运行cmd命令进入DOS界面 现在有一段简单C++代码(文件名为 demo.cpp),用于计算a*b的值 #include<iostream> using ...

  10. linux中tomcat修改错误日志路径

    涉及文件 log4j.properties   (一般开发将该文件放在项目的缺省目录即源包下,在文件系统里,就是在项目的/src/java目录下,缺省的文件名是log4j.properties,这样项 ...