链接

神奇的扫描线啊

估计之前刷面积并的时候太急了 没来得及理解 。。

有一大段代码是与面积并一模一样的 都是离散化 更新

面积并是扫描的x  这次也一样

因为周长只算外围的 所以扫描到一条x边时 要减去上一次扫描到的 对于Y方向上 就是与面积并不大一样的地方了

看篇带图的讲解吧 网上的题解都大同小异 估计出自一人之手

http://blog.sina.com.cn/s/blog_691ce2b7010177dz.html

它是扫描的Y  其实方法是一样的 横过来就是

对于我的代码 自己感觉不好理解在于求区间数

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 10010
#define LL long long
struct node
{
int lx,rx,y,d;
node(){}
node(int a,int b,int c,int d):lx(a),rx(b),y(c),d(d){}
bool operator < (const node &S) const
{
if(y == S.y) return d > S.d;
return y<S.y;
}
}mat[N];
int que[N],sum[N<<],lg[N<<],rg[N<<],seg[N<<];
int cnt[N<<];
LL ans=;
int bin(int k,int low,int high)
{
int m;
while(low<=high)
{
m = (low+high)/;
if(que[m]==k)
return m;
if(que[m]>k)
high = m-;
else
low = m+;
}
return m;
}
void up(int l,int r,int w)
{
if(cnt[w])//入边就更新这段的值 及区间数 (1个区间 2条Y边)
{
sum[w] = que[r+]-que[l];
seg[w] = ;
lg[w] = ;
rg[w] = ;
}
else if(l==r)
{
sum[w] = seg[w] = lg[w] = rg[w] = ;//出边的话 消除这条边
}
else//非出入边 向上更新 与平常线段树一样 等于子孩子相加
{
sum[w] = sum[w<<]+sum[w<<|];
seg[w] = seg[w<<]+seg[w<<|];
lg[w] = lg[w<<];
rg[w] = rg[w<<|];
if(lg[w<<|]&&rg[w<<])//左右相连 减去重复的
seg[w]-=;
}
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
cnt[w]+=d;
up(l,r,w);
return ;
}
int m = (l+r)>>;
if(a<=m)
update(a,b,d,l,m,w<<);
if(b>m)
update(a,b,d,m+,r,w<<|);
up(l,r,w);
}
int main()
{
int i,n,a,b,c,d;
while(scanf("%d",&n)!=EOF)
{
int num=;
for(i = ; i <= n ; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
que[num] = a;
mat[num++] = node(a,c,b,);
que[num] = c;
mat[num++] = node(a,c,d,-);
}
sort(que,que+num);
sort(mat,mat+num);
int k = ;
for(i = ; i < num ; i++)
{
if(que[i]!=que[i-])
que[k++] = que[i];
}
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
memset(lg,,sizeof(lg));
memset(rg,,sizeof(rg));
memset(seg,,sizeof(seg));
int o=;
ans=;
mat[num].y = ;
for(i = ; i < num ; i++)
{
int l = bin(mat[i].lx,,k-);
int r = bin(mat[i].rx,,k-)-;
update(l,r,mat[i].d,,k-,);
ans+=seg[]*(mat[i+].y-mat[i].y);
ans+=abs(sum[]-o);
o = sum[];
}
printf("%lld\n",ans);
}
return ;
}

poj1177Picture(线段树-周长并)的更多相关文章

  1. poj 1177 Picture(线段树周长并)

    题目链接:http://poj.org/problem?id=1177 题意:给你n个矩形问你重叠后外边缘总共多长. 周长并与面积并很像只不过是处理的时候是   增加的周长=abs(上一次的线段的长度 ...

  2. POJ 1177 Picture(线段树周长并)

      描述 A number of rectangular posters, photographs and other pictures of the same shape are pasted on ...

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

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

  4. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  5. hdu 1828 线段树扫描线(周长)

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

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

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

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

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

  8. POJ 1177 Picture(线段树:扫描线求轮廓周长)

    题目链接:http://poj.org/problem?id=1177 题目大意:若干个矩形,求这些矩形重叠形成的图形的轮廓周长. 解题思路:这里引用一下大牛的思路:kuangbin 总体思路: 1. ...

  9. luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树

    Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...

随机推荐

  1. JAVA如何解析多层json数据

    1. 使用标准的Json对象,如org.json.JSONObject json = new org.json.JSONObject(yourJsonString);然后通过get(keyString ...

  2. How to enable $Admin Shares in Windows 7

    Quote from: http://www.wintips.org/how-to-enable-admin-shares-windows-7/ As “Administrative shares” ...

  3. <meta name="viewport" content="width=device-width, initial-scale=1" />

    今天第一次用JQuery Mobile做了个3个手机小页面,一个登陆页面.一个列表页面和一个表单页面,页面中的组件呈现一切正常. 但出现了一个奇怪的问题,登陆页面大小正常,到了列表页面和表单页面就显得 ...

  4. sae-服务器php运行环境配置

    config.yaml 语法- OPTION: ARG1 ARG2 ... - OPTION: if (CONDICTIONs) ACTION CONDITION可以是以下任意一种: 使用 == 和 ...

  5. PHP学习心得(四)——基本语法

    从 HTML 中分离 当 PHP 解析一个文件时,会寻找开始和结束标记,标记告诉 PHP 开始和停止解释其中的代码.此种方式的解析可以使 PHP 嵌入到各种不同的文档中,凡是在一对开始和结束标记之外的 ...

  6. Delphi中判断WebBrowser的页面是否加载完成

    方法一: 在WebBrowser的OnDocumentComplete事件书写代码. 方法二: WebBrowser1.Navigate(Url); while WebBrowser1.Busy or ...

  7. mysql Error Handling and Raising in Stored Procedures

    MySQL的存储过程错误捕获方式和Oracle的有很大的不同. MySQL中可以使用DECLARE关键字来定义处理程序.其基本语法如下: DECLARE handler_type HANDLER FO ...

  8. 六,WPF的Application类

    Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Ap ...

  9. LINQ实战

    转载:http://www.cnblogs.com/yubinfeng/p/4567064.html    原作者:尼古拉斯~yu 文章部分内容在原文的基础上有删改. 我相信在net进阶的这个阶段,很 ...

  10. Unity3d Shader开发(三)Pass(Pass Tags,Name,BindChannels )

    Pass Tags 通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果. Syntax 语法 Tags { "TagName1" = "Value1&qu ...