博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[51nod1206]Picture
阅读量:5172 次
发布时间:2019-06-13

本文共 2283 字,大约阅读时间需要 7 分钟。

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

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

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

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

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #define ll long long 9 #define ull unsigned long long10 #define d double11 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?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

你可能感兴趣的文章
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>
c# for 和 foreach 的区别
查看>>
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>
(转)MFC界面风格
查看>>
Centos7 tmux1.6 安装
查看>>
二叉树(三)
查看>>
linux加密文件系统 fsck 无法修复一例
查看>>
【linux配置】VMware安装Redhat6.5
查看>>
AI自主决策——有限状态机
查看>>
《http权威指南》阅读笔记(二)
查看>>
软件工程
查看>>
http协议
查看>>
js替换问题replace和replaceAll
查看>>
c++11 : range-based for loop
查看>>
中国农历2013,2014 (zz.IS2120@BG57IV3)
查看>>