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

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

求给出矩形的周长。

这是一道周长扫描线题,比较裸。juruo第一次打打了一个多小时。

代码:

#include
#include
#include
using namespace std;#define N 5005int n,tot;struct EDge{ int l,r,s,v; EDge(){} EDge(int l,int r,int s,int v):l(l),r(r),s(s),v(v){} friend bool operator < (EDge a,EDge b) { if(a.s!=b.s)return a.s
b.v; }}ex[2*N];struct Segtree{ int sum; int num; int len; bool lfg,rfg;}tr[80005];void update(int u,int l,int r){ if(tr[u].sum) { tr[u].num=1; tr[u].len=r-l+1; tr[u].lfg=tr[u].rfg=1; }else if(l==r) { tr[u].num=0; tr[u].len=0; tr[u].lfg=tr[u].rfg=0; }else { tr[u].num=tr[u<<1].num+tr[u<<1|1].num; tr[u].len=tr[u<<1].len+tr[u<<1|1].len; if(tr[u<<1].rfg&&tr[u<<1|1].lfg)tr[u].num--; tr[u].lfg=tr[u<<1].lfg; tr[u].rfg=tr[u<<1|1].rfg; }}void Insert(int l,int r,int u,int ql,int qr,int v){ if(l==ql&&r==qr) { tr[u].sum+=v; update(u,l,r); return ; } int mid = (l+r)>>1; if(qr<=mid)Insert(l,mid,u<<1,ql,qr,v); else if(ql>mid)Insert(mid+1,r,u<<1|1,ql,qr,v); else Insert(l,mid,u<<1,ql,mid,v),Insert(mid+1,r,u<<1|1,mid+1,qr,v); update(u,l,r);}int main(){ scanf("%d",&n); int x_1,y_1,x_2,y_2,mn=0x7fffffff,mx=-0x7fffffff; for(int i=1;i<=n;i++) { scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2); ex[++tot]=EDge(x_1,x_2,y_1,1); ex[++tot]=EDge(x_1,x_2,y_2,-1); mx=max(mx,max(x_1,x_2)); mn=min(mn,min(x_1,x_2)); } if(mn<=0) { for(int i=1;i<=tot;i++)ex[i].l-=mn-1,ex[i].r-=mn-1; mx-=mn-1; } sort(ex+1,ex+tot+1); int ans = 0,las = 0; for(int i=1;i<=tot;i++) { Insert(1,mx,1,ex[i].l,ex[i].r-1,ex[i].v); while(ex[i+1].s==ex[i].s&&ex[i+1].v==ex[i].v) { i++; Insert(1,mx,1,ex[i].l,ex[i].r-1,ex[i].v); } ans+=abs(tr[1].len-las); las =tr[1].len; ans+=tr[1].num*2*(ex[i+1].s-ex[i].s); } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/9582020.html

你可能感兴趣的文章
javascript 操作 cookie 【转】
查看>>
数据库设计
查看>>
apicloud模块开发知识点
查看>>
C#3.0 语言基础扩充
查看>>
jQuery插件之-瀑布流插件
查看>>
代码详查中的自尊心
查看>>
[珠玑之椟]位向量/位图的定义和应用
查看>>
Root Pane Containers(一)
查看>>
php本地及远程文件包含漏洞
查看>>
[asp.net]网页与服务器的交互模型
查看>>
19-template转render写法
查看>>
大道至简
查看>>
(转)Altera对应的时序概念
查看>>
使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
查看>>
JDBC 调用存储过程代码示例
查看>>
一周冲刺计划2//第二天
查看>>
给flash添加A链接
查看>>
OEA 中 WPF 树型表格整体重构
查看>>
今天第一帖
查看>>
前端大牛的职业生涯建议 原文
查看>>