热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU1828Picture(线段树+扫描线)(周长并)

题目链接:给你n个矩形,让你求出总的周长。类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y轴一次。每次加起来的无非都是新加的边(flag为1)或者是新减

题目链接:

给你n个矩形,让你求出总的周长。

类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y轴一次。每次加起来的无非都是新加的边(flag为1)或者是新减的边(flag为-1),即加起来的是此时的总长度(T[1].val)减去上一次扫到的总长度(last)的绝对值(T[1].val - last)。(注意用c++提交,g++会wa)

#include iostream
#include cstdio
#include cstring
#include algorithm
using namespace std;
const int MAXN = 2e4 + ;
struct data {
int l , r , h , flag;
bool operator (const data cmp) const {
return h cmp.h;
}
}x[MAXN] , y[MAXN];
struct segtree {
int l , r , val , add;
}T[MAXN ];
int f(int a) {
return (a ? a : -a);
void build(int p , int l , int r) {
int mid = (l + r) ;
T[p].l = l , T[p].r = r , T[p].add = T[p].val = ;
if(r - l == ) {
return ;
}
build(p , l , mid);
build((p )| , mid , r);
void pushup(int p) {
if(T[p].add) {
T[p].val = T[p].r - T[p].l;
}
else if(T[p].r - T[p].l == ) {
T[p].val = ;
}
else {
T[p].val = T[p ].val + T[(p )|].val;
}
void updata(int p , int l , int r , int add) {
int mid = (T[p].l + T[p].r) ;
if(l == T[p].l T[p].r == r) {
T[p].add += add;
pushup(p);
return ;
}
if(r = mid) {
updata(p , l , r , add);
}
else if(l = mid) {
updata((p )| , l , r , add);
}
else {
updata(p , l , mid , add);
updata((p )| , mid , r , add);
}
pushup(p);
int main()
{
int n , x1 , x2 , y1 , y2;
while(~scanf("%d" , n)) {
for(int i = ; i i++) {
scanf("%d %d %d %d" , x1 , y1 , x2 , y2);
x1 += 1e4 , x2 += 1e4 , y1 += 1e4 , y2 += 1e4;
if(x1 x2)
swap(x1 , x2);
if(y1 y2)
swap(y1 , y2);
int ls = i , rs = (i )|;
x[ls].l = x1 , x[ls].r = x2 , x[ls].h = y1 , x[ls].flag = ;
x[rs].l = x1 , x[rs].r = x2 , x[rs].h = y2 , x[rs].flag = -;
y[ls].l = y1 , y[ls].r = y2 , y[ls].h = x1 , y[ls].flag = ;
y[rs].l = y1 , y[rs].r = y2 , y[rs].h = x2 , y[rs].flag = -;
}
sort(x , x + n * );
sort(y , y + n * );
build( , , 2e4);
int res = , last = ;
for(int i = ; i * n ; i++) {
updata( , x[i].l , x[i].r , x[i].flag);
res += f(last - T[].val);
last = T[].val;
}
for(int i = ; i * n ; i++) {
updata( , y[i].l , y[i].r , y[i].flag);
res += f(last - T[].val);
last = T[].val;
}
printf("%d\n" , res);
}
}

推荐阅读
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • T15483.【清华集训2017模拟11.26】简单路径T25484.【清华集训2017模拟11.26】快乐树T35485.【清华集训2017模拟11.26】字符串T1结论题,结论很 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • iOS开发 - 解决导航栏子视图损坏问题
    本文介绍了一个在Xcode 5.0.2和iOS 7模拟器环境下,使用Storyboard创建CoreData CRUD应用时遇到的导航栏子视图损坏问题及其解决方案。 ... [详细]
  • 本文介绍了 NOI Open Judge 6049 购书问题的详细解法,代码简洁易懂,并附有详细的注释和解释。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
author-avatar
榴莲味蛋筒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有