传送门1
传送门2
传送门3
思路:
有点纸张的做法
不会记录竖向边的个数
于是横着做一遍扫描线,竖着做一遍扫描线
好像还挺正确的……
但实际上可以通过当前扫到的横向边的类型来记录竖向边的个数
唉:-(……
代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define M 5005
using namespace std;
int n;
int b[M<<1],cover[M<<3],lazy[M<<3];
struct node{int up,down,data,tp;
}a[M<<1],c[M<<1];
bool cmp(node a,node b)
{if (a.data==b.data) return a.tp>b.tp;return a.data<b.data;
}
void update(int rt,int begin,int end,node x)
{if (x.up<=begin&&end<=x.down){lazy[rt]+=x.tp;if (lazy[rt]) cover[rt]=b[end+1]-b[begin];else if (begin==end) cover[rt]=0;else cover[rt]=cover[rt<<1]+cover[rt<<1|1];return;}int mid=begin+end>>1;if (mid>=x.up) update(rt<<1,begin,mid,x);if (mid<x.down) update(rt<<1|1,mid+1,end,x);if (lazy[rt]) cover[rt]=b[end+1]-b[begin];else cover[rt]=cover[rt<<1]+cover[rt<<1|1];
}
int get(int rt,int begin,int end,node x)
{if (x.up<=begin&&end<=x.down) return cover[rt];if (cover[rt]==b[end+1]-b[begin]) return b[min(end,x.down)+1]-b[max(begin,x.up)]; int mid=begin+end>>1,ans=0;if (mid>=x.up) ans+=get(rt<<1,begin,mid,x);if (mid<x.down) ans+=get(rt<<1|1,mid+1,end,x);return ans;
}
main()
{scanf("%d",&n);int x,y,xx,yy;for (int i=1;i<=n;++i)scanf("%d%d%d%d",&x,&y,&xx,&yy),b[i*2-1]=y,b[i*2]=yy,a[i*2-1]=(node){y,yy,x,1},a[i*2]=(node){y,yy,xx,-1},c[i*2-1]=(node){x,xx,y,1},c[i*2]=(node){x,xx,yy,-1};sort(b+1,b+n*2+1);b[0]=unique(b+1,b+n*2+1)-b-1;for (int i=1;i<=n;++i)a[i*2-1].up=a[i*2].up=lower_bound(b+1,b+b[0]+1,a[i*2-1].up)-b,a[i*2-1].down=a[i*2].down=lower_bound(b+1,b+b[0]+1,a[i*2-1].down)-b-1;sort(a+1,a+n*2+1,cmp);int t=a[1].data,ans=0;for (int i=1;i<=n<<1;++i){if (a[i].tp==1)ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]),update(1,1,b[0]-1,a[i]);elseupdate(1,1,b[0]-1,a[i]),ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]);t=a[i].data;}for (int i=1;i<=n;++i)a[i*2-1]=c[i*2-1],a[i*2]=c[i*2],b[i*2-1]=a[i*2-1].up,b[i*2]=a[i*2].down;sort(b+1,b+n*2+1);b[0]=unique(b+1,b+n*2+1)-b-1;for (int i=1;i<=n;++i)a[i*2-1].up=a[i*2].up=lower_bound(b+1,b+b[0]+1,a[i*2-1].up)-b,a[i*2-1].down=a[i*2].down=lower_bound(b+1,b+b[0]+1,a[i*2-1].down)-b-1;sort(a+1,a+n*2+1,cmp);t=a[1].data;for (int i=1;i<=n<<1;++i){if (a[i].tp==1)ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]),update(1,1,b[0]-1,a[i]);elseupdate(1,1,b[0]-1,a[i]),ans+=b[a[i].down+1]-b[a[i].up]-get(1,1,b[0]-1,a[i]);t=a[i].data;}printf("%d\n",ans);
}

【POJ1177】【HDU1828】【codevs2149】矩形面积周长并相关推荐

  1. 矩形面积周长和梯形面积

    矩形梯形面积 矩形面积周长和梯形面积 创建一个Example1.java: public class Example1 { public static void main(String args[]) ...

  2. 矩形面积和矩形周长并的模板——来自notonlysuccess

    矩形面积并 hdu1542 Atlantis 题意:矩形面积并 思路:浮点数先要离散化;然后把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用cnt表示该区间下边比上边多几个,sum代 ...

  3. 【Java】编写Java GUI应用程序,完成从键盘输入矩形的长和宽,求矩形的周长和面积并输出结果的功能...

    计算公式 周长=(长+宽)*2 面积=长*宽 import javax.swing.JOptionPane; public class MyTest2 {/*输入矩形的长和宽,计算矩形的周长和面积*/ ...

  4. Python 实战案例--计算圆、矩形的周长和面积

    import math# 计算圆的面积 def circle_area(radius):return math.pi * radius * radius# 计算圆的周长 def circle_peri ...

  5. 创建一个Rectangle类。 添加两个属性width、height,分别表示宽度和高度,添加计算矩形的周长和面积的方法。测试输出一个矩形的周长和面积。

    [Java]创建一个Rectangle类 添加两个属性width.height,分别表示宽度和高度,添加计算矩形的周长和面积的方法.测试输出一个矩形的周长和面积. /*作者:龙蝶 *日期:2020年4 ...

  6. python输入矩形的长和宽、求周长_输入矩形的长和宽,求出该矩形的周长和面积...

    01.1.上机内容:C++程序的编写和运行 02. 03.上机目的:编程序,输入数值,输出星期. 04. 05.我的程序:/*输入矩形的长和宽,求出该矩形的周长和面积*/ 06. 07.2./* 08 ...

  7. 【Java基础】使用swing对话框编写一个程序:输入长和宽,计算矩形的周长和面积

    输入矩形的长和宽,计算矩形的周长和面积. 来源:丁振凡老师编著的<Java语言程序设计(第2版)> import javax.swing.*;public class Demo02Task ...

  8. Java编程-计算矩形的周长和面积

    题目: 一.需求分析       编写程序,定义一个矩形类,具有长.宽.面积.周长共四个成员变量,计算面积和计算周长的两个方法,在主类中创建矩形对象,输入长和宽,输出矩形的面积和周长. 二.功能设计 ...

  9. 计算机语言周长,C语言计算矩形的周长和面积

    C语言计算矩形的周长和面积 发布时间:2020-07-08 11:07:25 来源:亿速云 阅读:108 作者:Leah 本篇文章给大家分享的是有关C语言计算矩形的周长和面积,小编觉得挺实用的,因此分 ...

最新文章

  1. “AttributeError: ‘str‘ object has no attribute ‘decode‘ “
  2. 老版本fortran语言 内存无效_面向科学计算的高性能动态编程语言 Julia
  3. vue定义一个全局价格处理函数
  4. java数据结构与算法_清华大学出版社-图书详情-《数据结构与算法分析(Java版)》...
  5. Sprint3(12.18)总结
  6. java datatable用法_C# DataTable用法示例详解|DataTable Select,sort排序,Linq过滤操作
  7. 再次提升2%,仅85K参数的开源人脸检测算法
  8. 干掉visio,这是一款免费又好用的画图神器
  9. 高版本linux安装gamit,Ubuntu14下Gamit安装(示例代码)
  10. 720度全景拍摄详细教程
  11. python零基础电子书免费下载-零基础入门学习Python PDF 扫描版
  12. 【Python基础学习】基本数据结构:列表、元组、栈、字典、集合与队列
  13. 00后表示真干不过,部门新来的00后网络安全工程师已把我卷崩溃,想离职了...
  14. 【C++Primer笔记】第一章 开始
  15. 4. Java并发编程-管程
  16. yarn设置缓存,清除缓存
  17. Python3.8+OpenCV4 实现二维码扫码
  18. SpringBoot学生成绩管理系统
  19. 【毕业设计】 微信小程序购物商城系统 【含代码】
  20. c语言定义node类型指针,C语言指针的概念

热门文章

  1. 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】
  2. 周杰伦新歌《说好不哭》上线,程序员哭了......【华为云分享】
  3. 2018年三月份计算机一级考试试题,2018年3月计算机一级考试MSOFFICE模拟试题(4)
  4. Android笔记 隐式意图vs显示意图+隐式意图打开短信应用demo
  5. C++ STL容器vector篇(一) vector容器存放内置和自定义数据类型并遍历
  6. Bootstrap4代码模板
  7. python有趣的函数_Python中有趣在__call__函数
  8. 内外网映射 html缓存问题_浅谈内存映射
  9. php7 void,2.10.PHP7.1 女神级教程-女神的私人信息 -【PHP 函数】
  10. 【项目调研+论文阅读】(目录)中文实体识别研究方法综述 day6