给你一坨矩形,问这些矩形组成的所有多边形的周长之和。

  分别求竖着的边和横着的边。

  离散化后线段树,维护当前行(或者列)有多少没在多边形里的,添加矩形就变成添加、删除线段。

  每次加线段或删线段时累加一下贡献(加线段时的贡献就是加完后那条线段里有多少个位置变成在多边形里,删线段时的贡献就是删完后有多少个位置变成不在多边形里)。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
#define ull unsigned long long
#define d double
using namespace std;
const int maxn=,mxnode=maxn*;
struct zs{int h,l,r;bool add;}b[maxn];int n1;
struct mat{int x1,y1,x2,y2;}a[];
int lc[mxnode],rc[mxnode],mn[mxnode],num[mxnode],add[mxnode],tot,MX;
int i,j,k,n,m,L,R,V;
ll ans; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
} inline void ins(int &x,int l){x=++tot,mn[x]=add[x]=,num[x]=l;}
inline void upd(int x){
int l=lc[x],r=rc[x];
if(mn[l]>mn[r])swap(l,r);
if(mn[l]==mn[r])mn[x]=mn[l]+add[x],num[x]=num[l]+num[r];
else mn[x]=mn[l]+add[x],num[x]=num[l];
}
void insert(int x,int a,int b){
// printf("insert:%d--%d %d-----%d\n",a,b,L,R);
if(L<=a&&R>=b){add[x]+=V,mn[x]+=V;return;}
int mid=a+b>>;
if(!lc[x])ins(lc[x],mid-a+);if(!rc[x])ins(rc[x],b-mid);
if(L<=mid)insert(lc[x],a,mid);
if(R>mid)insert(rc[x],mid+,b);
upd(x);//printf("%d--%d mn:%d num:%d\n",a,b,mn[x],num[x]);
} inline int get0(){return mn[]!=?:num[];}
bool cmp(zs a,zs b){return a.h<b.h||(a.h==b.h&&a.add);}
inline void calc(){
int i;
sort(b+,b++n1,cmp);
for(i=;i<=tot;i++)lc[i]=rc[i]=;tot=,mn[]=add[]=,num[]=MX;
for(i=;i<=n1;i++){
L=b[i].l,R=b[i].r;
if(b[i].add)ans+=get0(),V=,insert(,,MX),ans-=get0();
else ans-=get0(),V=-,insert(,,MX),ans+=get0();//printf("num0:%d mn:%d\n",get0(),mn[1]);
}//printf(" ans:%d\n",ans);
} inline int abs1(int x){return x<?-x:x;}
inline int max(int a,int b){return a>b?a:b;}
int main(){
n=read();int tmp;
for(i=;i<=n;i++){
a[i].x1=read(),a[i].y1=read(),a[i].x2=read()-,a[i].y2=read()-;
tmp=max(max(abs1(a[i].x1),abs1(a[i].x2)),max(abs1(a[i].y1),abs1(a[i].y2)));
if(tmp>MX)MX=tmp;
}
for(i=;i<=n;i++)a[i].x1+=MX+,a[i].x2+=MX+,a[i].y1+=MX+,a[i].y2+=MX+;
MX=MX<<|;
n1=;
for(i=;i<=n;i++)
b[++n1]=(zs){a[i].x1,a[i].y1,a[i].y2,},
b[++n1]=(zs){a[i].x2+,a[i].y1,a[i].y2,};
calc();
n1=;
for(i=;i<=n;i++)
b[++n1]=(zs){a[i].y1,a[i].x1,a[i].x2,},
b[++n1]=(zs){a[i].y2+,a[i].x1,a[i].x2,};
calc();
printf("%lld\n",ans);
}

[51nod1206]Picture的更多相关文章

  1. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?

    复现过程 首先,我创建了一个基于Picture Library的图片文档库,名字是 Pic Lib 创建完毕后,我点击它的Upload 下拉菜单,点击Upload Picture按钮 在弹出的对话框中 ...

  2. MFC Picture控件加载图片

    CStatic *pPic = (CStatic*)GetDlgItem(IDC_PICTURE); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP2); ...

  3. [POJ1177]Picture

    [POJ1177]Picture 试题描述 A number of rectangular posters, photographs and other pictures of the same sh ...

  4. USACO 5.5 Picture(周长并)

    POJ最近做过的原题. /* ID: cuizhe LANG: C++ TASK: picture */ #include <cstdio> #include <cstring> ...

  5. 彩色照片转换为黑白照片(Color image converted to black and white picture)

    This blog will be talking about the color image converted to black and white picture. The project st ...

  6. HDU 1828 Picture(线段树扫描线求周长)

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

  7. don't forget the bigger picture

    Imagine a circle that contains all of human knowledge: By the time you finish elementary school, you ...

  8. A Complete Guide to the <Picture> Element

    If you’ve ever struggled building responsive websites, this post is for you. It’s part of a series o ...

  9. HDUOJ-----(1162)Eddy's picture(最小生成树)

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

随机推荐

  1. laravel框架一种方便的快速填充数据的方法

    首先大家都知道在laravel框架里是采用seeder来填充数据的,具体命令如下,请将如下的类名称替换成你具体的seeder类名. 首先创建seeder类 php artisan make:seede ...

  2. curl 命令详解

    curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS.f ...

  3. IDEA 环境设置

    IDEA环境设置 任何事物都有两面性,如何用好才是关键.IDEA为我们提供了丰富的功能,但不代表默认的配置就适合于你.我们应当根据自己的条件.需求合理的配置,从而驾驭好这匹悍马.让它成为我们编程的利器 ...

  4. spring boot 遇到 supported setting property http://xml.org/sax/properties/lexical-handler

    解决链接:http://apache-fop.1065347.n5.nabble.com/org-xml-sax-SAXNotSupportedException-thrown-by-FOP-td11 ...

  5. 基于Docker的ELK日志平台搭建

    1.安装Docker Docker可简单理解为一个轻量级的虚拟机.Docker对进程进行封装隔离,隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器.Docker和传统虚拟化方式的不同.传统虚拟 ...

  6. C语言学生管理系统(增进版)

    在原版上进行改进,主要改进的功能有. 1.利用atof:将字符串转换为浮点型: 利用atoi:将字符串转换为整型: 原文地址:http://www.cnblogs.com/sddai/p/577412 ...

  7. Matplotlib初体验

    为一个客户做了关于每个差异otu在时间点上变化的折线图,使用python第一次做批量作图的程序,虽然是很简单的折线图,但是也是第一次使用matplotlib的纪念. ps:在第一个脚本上做了点小的改动 ...

  8. Head First设计模式之迭代器模式

    一.定义 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示: 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代 ...

  9. Python中将函数作为另一个函数的参数传入并调用

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...

  10. grpc

    grpc入门(二) 一. 目标 本博文要介绍的是编写 grpc入门(一)中所提到的四种rpc的方式,然后通过命令行和eclipse两种方式生成对应的java代码,关于grpc是什么东西本文不再赘述. ...