又知道了线段树的一种用法,除了单点更新,区间更新,还有这种在一段线段上标号但不往下推。 真是神奇

hdu1828

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <stdlib.h>
using namespace std;
#define N 5050 struct RECT
{
int x1,y1,x2,y2;
}g[N]; struct LINE
{
int k,b,d;
int flag;
}line[*N]; int ans=;
int n; int l[],r[],mark[],yb[],yd[],num[]; int cmp(LINE x,LINE y)
{
return x.k<y.k;
} void build(int tl,int tr,int s)
{
l[s]=tl; r[s]=tr;
mark[s]=;yb[s]=; yd[s]=; num[s]=;
if(tl==tr) return ;
int mid=(tl+tr)/;
build(tl,mid,*s);
build(mid+,tr,*s+);
} void up(int s)
{
if(mark[s]>)
{
num[s]=;
yb[s]=;
yd[s]=;
}
else
{
if(l[s]==r[s])
{
num[s]=;
yb[s]=;
yd[s]=;
}
else
{
if(yd[*s]==&&yb[*s+]==)
num[s]=num[*s]+num[*s+]-;
else num[s]=num[*s]+num[*s+];
yb[s]=yb[*s];
yd[s]=yd[*s+];
}
}
} void update(int tl,int tr,int sign,int s)
{
if(tl==l[s]&&tr==r[s])
{
mark[s]+=sign;
up(s);
return ;
}
int mid=(l[s]+r[s])/;
if(tr<=mid) update(tl,tr,sign,*s);
else if(tl>mid) update(tl,tr,sign,*s+);
else
{
update(tl,mid,sign,*s);
update(mid+,tr,sign,*s+);
}
up(s);
} void fuc()
{
int cnt=;
int mix=,mxx=-; for(int i=;i<n;i++)
{
line[cnt].k=g[i].y1;
line[cnt].b=g[i].x1;
line[cnt].d=g[i].x2-;//注意可能为负的
line[cnt].flag=;
cnt++; mix=min(mix,g[i].x1);
mxx=max(mxx,g[i].x2-); line[cnt].k=g[i].y2;
line[cnt].b=g[i].x1;
line[cnt].d=g[i].x2-;
line[cnt].flag=-;
cnt++;
}
sort(line,line+cnt,cmp);
build(mix,mxx,);
for(int i=;i<cnt-;i++)
{
update(line[i].b,line[i].d,line[i].flag,);
ans += (line[i+].k-line[i].k)**num[];
}
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<n;i++)
{
scanf("%d%d%d%d",&g[i].x1,&g[i].y1,&g[i].x2,&g[i].y2);
g[i].x1+=;
g[i].x2+=;
g[i].y1+=;
g[i].y2+=;
}
if(n==)
{
printf("0\n");
continue;
}
ans=;
fuc();
//
for(int i=;i<n;i++)
{
swap(g[i].x1,g[i].y1);
swap(g[i].x2,g[i].y2);
}
fuc();
printf("%d\n",ans);
}
return ;
}

hdu1828(线段树+扫描线)的更多相关文章

  1. hdu1828 线段树扫描线求矩形面积的周长

    题意:       给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路:       线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...

  2. hdu1828 Picture(线段树+扫描线+矩形周长)

    看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积))  解法一·:两次扫描线 如图我们可以 ...

  3. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

  4. 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))

    扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...

  5. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  6. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  7. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  8. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  9. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

随机推荐

  1. Python:Python 3.x 的革新

    Python 3.x 版本在设计时为了向最好的语言前进,没有考虑向下兼容,许多针对早期 Python 版本设计的程序都无法正常运行.本文简单介绍了 Python 3.x 版本较之 2.x 版本语法上的 ...

  2. 异步JS:$.Deferred的使用

    异步JS:$.Deferred的使用 原文链接:http://www.html5rocks.com/en/tutorials/async/deferred/ 当我们构建一个平稳的,响应式的HTML5应 ...

  3. js弹出图片原图效果

    1.将js方法独立出来common.js function openwin(src){ var basePath = document.getElementById("basePath&qu ...

  4. ubuntu修改ip、网关、dns等

    一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6 sudo vi /etc/modprobe.d/blacklist.conf 表示用vi编辑器(也可以 ...

  5. B树、B-树、B+树、B*树---转载

    B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...

  6. delphi的socket通讯 多个客户端 (转)

    ClientSocket组件为客户端组件.它是通信的请求方,也就是说,它是主动地与服务器端建立连接. ServerSocket组件为服务器端组件.它是通信的响应方,也就是说,它的动作是监听以及被动接受 ...

  7. (转)排列算法 Permutation Generation

    转自:http://www.cnblogs.com/dragonpig/archive/2010/01/21/1653680.html http://www.notesandreviews.com/p ...

  8. POJ 2080

    import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...

  9. hdu 4027 Can you answer these queries? 线段树

    线段树+剪枝优化!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #includ ...

  10. SqlBulkCopy大批量数据插入到sql表中

    alter TYPE TableType AS TABLE ( Name VARCHAR() , code VARCHAR() ) GO alter PROCEDURE usp_InsertProdu ...