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

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

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

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

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #define ll long long
 9 #define ull unsigned long long
10 #define d double
11 using namespace std;
12 const int maxn=100233,mxnode=maxn*50;
13 struct zs{int h,l,r;bool add;}b[maxn];int n1;
14 struct mat{int x1,y1,x2,y2;}a[50023];
15 int lc[mxnode],rc[mxnode],mn[mxnode],num[mxnode],add[mxnode],tot,MX;
16 int i,j,k,n,m,L,R,V;
17 ll ans;
18
19 int ra,fh;char rx;
20 inline int read(){
21     rx=getchar(),ra=0,fh=1;
22     while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();
23     if(rx=='-')fh=-1,rx=getchar();
24     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
25 }
26
27 inline void ins(int &x,int l){x=++tot,mn[x]=add[x]=0,num[x]=l;}
28 inline void upd(int x){
29     int l=lc[x],r=rc[x];
30     if(mn[l]>mn[r])swap(l,r);
31     if(mn[l]==mn[r])mn[x]=mn[l]+add[x],num[x]=num[l]+num[r];
32     else mn[x]=mn[l]+add[x],num[x]=num[l];
33 }
34 void insert(int x,int a,int b){
35 //    printf("insert:%d--%d      %d-----%d\n",a,b,L,R);
36     if(L<=a&&R>=b){add[x]+=V,mn[x]+=V;return;}
37     int mid=a+b>>1;
38     if(!lc[x])ins(lc[x],mid-a+1);if(!rc[x])ins(rc[x],b-mid);
39     if(L<=mid)insert(lc[x],a,mid);
40     if(R>mid)insert(rc[x],mid+1,b);
41     upd(x);//printf("%d--%d  mn:%d   num:%d\n",a,b,mn[x],num[x]);
42 }
43
44 inline int get0(){return mn[1]!=0?0:num[1];}
45 bool cmp(zs a,zs b){return a.h<b.h||(a.h==b.h&&a.add);}
46 inline void calc(){
47     int i;
48     sort(b+1,b+1+n1,cmp);
49     for(i=1;i<=tot;i++)lc[i]=rc[i]=0;tot=1,mn[1]=add[1]=0,num[1]=MX;
50     for(i=1;i<=n1;i++){
51         L=b[i].l,R=b[i].r;
52         if(b[i].add)ans+=get0(),V=1,insert(1,1,MX),ans-=get0();
53         else ans-=get0(),V=-1,insert(1,1,MX),ans+=get0();//printf("num0:%d    mn:%d\n",get0(),mn[1]);
54     }//printf("  ans:%d\n",ans);
55 }
56
57 inline int abs1(int x){return x<0?-x:x;}
58 inline int max(int a,int b){return a>b?a:b;}
59 int main(){
60     n=read();int tmp;
61     for(i=1;i<=n;i++){
62         a[i].x1=read(),a[i].y1=read(),a[i].x2=read()-1,a[i].y2=read()-1;
63         tmp=max(max(abs1(a[i].x1),abs1(a[i].x2)),max(abs1(a[i].y1),abs1(a[i].y2)));
64         if(tmp>MX)MX=tmp;
65     }
66     for(i=1;i<=n;i++)a[i].x1+=MX+1,a[i].x2+=MX+1,a[i].y1+=MX+1,a[i].y2+=MX+1;
67     MX=MX<<1|1;
68     n1=0;
69     for(i=1;i<=n;i++)
70         b[++n1]=(zs){a[i].x1,a[i].y1,a[i].y2,1},
71         b[++n1]=(zs){a[i].x2+1,a[i].y1,a[i].y2,0};
72     calc();
73     n1=0;
74     for(i=1;i<=n;i++)
75         b[++n1]=(zs){a[i].y1,a[i].x1,a[i].x2,1},
76         b[++n1]=(zs){a[i].y2+1,a[i].x1,a[i].x2,0};
77     calc();
78     printf("%lld\n",ans);
79 }

View Code

转载于:https://www.cnblogs.com/czllgzmzl/p/5942477.html

[51nod1206]Picture相关推荐

  1. usaco Picture(离散化求线段周长)

    usac前面有一题是递归求矩形覆盖面积的,学到不少东西 离散化 把所有矩形离散化(就是将整个平面分成许多"竖条"或"横条",对其操作),每个矩形都由四条边组成, ...

  2. [hdu1828] Picture

    帅哥美女们大家好! 今天本蒟蒻补一篇题解! 线段树维护扫描线求矩形周长并. 扫描线的话,跟求面积类似,这道题可以只扫一次,也可以x,y两个方向分别扫一次. 题目传送门 1 #include<cs ...

  3. vc picture控件载入背景图,随控件大小改变

    在mfc里,想要在Picture控件中载入一张图片有两种方法:静态的和动态的.静态的方法就是图片先载入资源(.rc)文件中,拥有一个唯一的ID:动态的方法就是制定图片的路径名即可. 当然这样的方法网上 ...

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

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

  5. H.264 picture parameter sets成员值含义学习笔记

    -picture parameter sets 1. pic_parameter_set_id pic_parameter_set_id指明了在切片头中对应的某个psp.pic_parameter_s ...

  6. Codeforces Global Round 8 C. Even Picture 题解[巧妙法构造题]

    C. Even Picture 题目大意:让你构造一个连通图,图中有k个灰点其中n个点4面都是灰点,(k-n)个点周围2个点是灰点 我们设最上面的为(1,1)点就可以了 ps:exactly:只有,其 ...

  7. 图像隐藏matlab代码,picture Matlab简单操作实现图像的隐藏加密 联合开发网 - pudn.com...

    picture 所属分类:其他 开发工具:Others 文件大小:15KB 下载次数:1 上传日期:2018-07-18 09:50:48 上 传 者:至尊宝物语 说明:  Matlab简单操作实现图 ...

  8. 十、图像参数集Picture Paramater Set(PPS)解析

    GitHub代码地址:点击这里 除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS).通常情况下,PPS类似于SPS,在H.264的 ...

  9. 视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念、IDR、I帧(关键帧,intra picture)、P帧、B帧、帧内压缩、帧间压缩、pts(显示时间)、dts(解码时间)

    文章目录 前言: 关于视频的基础定义 GOP:Group of Pictures 压缩(也就是编码) 帧内压缩:自己本身压缩,不参考其他的帧. 帧间压缩:参考其他视频帧压缩. 解码(解压缩) 为什么好 ...

  10. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序 ...

最新文章

  1. 理解数据类型与数学运算:求和、温度转换
  2. Ubantu下hadoop运行第一个例子wordcount过程
  3. 有bug!用Pytorch Lightning重构代码速度更慢,修复后速度倍增
  4. 十二种特征工程相关技术简介
  5. asp.net导出数据到Excel
  6. java 线程什么时候出栈_在Java中给出的时间
  7. c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)
  8. 宜搭小技巧|找不到应用怎么办?群应用一键直达
  9. Nginx性能提升--引入线程池性能提升9倍
  10. java.lang.NoSuchFieldError: INSTANCE at org.apache.http.conn.ssl.SSLConnectionSocketFactory
  11. 母机修改了文件,虚拟机复制到的可能不是预期的
  12. Java学习笔记——正则表达式
  13. 嵌入式开发之DSP学习
  14. java的日期格式化
  15. 计算机不能正常开机怎么处理,电脑不能正常启动的原因和处理步骤
  16. 4.1关系运算符和逻辑运算符
  17. Flutter笔记(9)flutter中baseline基准线布局
  18. 问游戏java面试问题_JAVA程序员面试32问,你能回答多少题?
  19. 在浏览器上打开、预览Excel xlsx表格文件
  20. 程序设计入门——C语言 翁恺 第8周编程练习

热门文章

  1. 哈夫曼思维导图,第六章前半段思维导图
  2. mysql批量删除指定前缀的表,批量修改表名的SQL语句
  3. 小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战...
  4. Python入门之面向对象module,library,package之间区别
  5. JavaScript Number 对象
  6. P1313 计算系数
  7. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
  8. XidianOJ 1007 易碎的鸟蛋
  9. Java中this和this()
  10. [洛谷P3919]【模板】可持久化数组