题目:http://poj.org/problem?id=1177题意:墙上贴着一些海报、照片等矩形,所有的边都为垂直或水平。每个矩形可以被其它矩形部分或完全遮盖,所有矩形合并成区域的边界周长称为轮廓周长。思路:见陈宏论文//一维数组 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int maxn=10000; const int inf=10010; struct Point { int lx, ly, rx, ry; }p[maxn+10]; int x[maxn+10], y[maxn+10], z[maxn+10], len_x, len_y; int n, a, b, c, d; int cmpx(Point a, Point b) { if (a.lx<b.lx) return 1; else return 0; } int cmpy(Point a, Point b) { if (a.ly<b.ly) return 1; else return 0; } int cmp(int a, int b) { if (a<b) return 1; else return 0; } int rowlen() { sort(x, x+len_x, cmp); sort(p, p+n, cmpy); int up, down; int res=0; for (int i=1; i<len_x; i++) { if (abs(x[i]-x[i-1])==0) continue; up=down=-inf; for (int j=0; j<n; j++) { if (x[i-1]-p[j].lx>=0&&x[i]-p[j].rx<=0) { if (p[j].ly-up>0) { //printf("%d %d\n", x[i], x[i-1]); res+=2*(x[i]-x[i-1]); //printf("res=%d\n", res); down=p[j].ly, up=p[j].ry; } else if (p[j].ry-up>0) up=p[j].ry; } } } return res; } int collen() { sort(y, y+len_y, cmp); sort(p, p+n, cmpx); int up, down; int res=0; for (int i=1; i<len_y; i++) { if (abs(y[i]-y[i-1])==0) continue; up=down=-inf; for (int j=0; j<n; j++) { if (y[i-1]-p[j].ly>=0&&y[i]-p[j].ry<=0) { if (p[j].lx-up>0) { //printf("%d %d\n", x[i], x[i-1]); res+=2*(y[i]-y[i-1]); //printf("res=%d\n", res); down=p[j].lx, up=p[j].rx; } else if (p[j].rx-up>0) up=p[j].rx; } } } return res; } int main() { //freopen("in.txt", "r", stdin); while (scanf("%d", &n)==1) { len_x=len_y=0; for (int i=0; i<n; i++) { scanf("%d %d %d %d", &p[i].lx, &p[i].ly, &p[i].rx, &p[i].ry); x[len_x++]=p[i].lx, x[len_x++]=p[i].rx; y[len_y++]=p[i].ly, y[len_y++]=p[i].ry; } int ans=0; ans+=rowlen(); ans+=collen(); printf("%d\n", ans); } return 0; }//线段树 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; const int maxn=10000; struct STree { int l, r; int len, segnum, cover, sum, lcover, rcover; }st[maxn*4]; struct Line { int y_top, y_btm; int x; int in; bool operator<(Line l) const { return x<l.x; } }line[maxn+10]; int n, cnt, y[maxn+10]; void BuildTree(int l, int r, int i) { st[i].l=l, st[i].r=r; st[i].len=y[r]-y[l]; st[i].segnum=st[i].cover=st[i].sum=st[i].lcover=st[i].rcover=0; if (r-l>1) { int mid=(l+r)>>1; BuildTree(l, mid, i*2); BuildTree(mid, r, i*2+1); } } void GetLen(int x) { if (st[x].cover>0) st[x].sum=st[x].len; else if (st[x].r-st[x].l>1) st[x].sum=st[x*2].sum+st[x*2+1].sum; else st[x].sum=0; } void GetSegNum(int x) { if (st[x].cover>0) { st[x].lcover=st[x].rcover=1; st[x].segnum=1; } else if (st[x].r-st[x].l>1) { st[x].lcover=st[x*2].lcover; st[x].rcover=st[x*2+1].rcover; st[x].segnum=st[x*2].segnum+st[x*2+1].segnum-st[x*2].rcover*st[x*2+1].lcover; } else { st[x].lcover=st[x].rcover=0; st[x].segnum=0; } } void Insert(int l, int r, int i) { if (st[i].l==l&&st[i].r==r) st[i].cover++; else { int mid=(st[i].l+st[i].r)>>1; if (r<=mid) Insert(l, r, 2*i); else if (l>=mid) Insert(l, r, 2*i+1); else { Insert(l, mid, 2*i); Insert(mid, r, 2*i+1); } } GetLen(i); GetSegNum(i); } void Delete(int l, int r, int i) { if (st[i].l==l&&st[i].r==r) st[i].cover--; else { int mid=(st[i].l+st[i].r)>>1; if (r<=mid) Delete(l, r, i*2); else if (l>=mid) Delete(l, r, i*2+1); else { Delete(l, mid, 2*i); Delete(mid, r, 2*i+1); } } GetLen(i); GetSegNum(i); } int GetIndex(int x) { return lower_bound(y, y+cnt, x)-y; } int main() { //freopen("in.txt", "r", stdin); while (scanf("%d", &n)==1) { int x1, y1, x2, y2; for (int i=0; i<n; i++) { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); line[i*2].x=x1, line[i*2+1].x=x2; line[i*2].y_top=line[i*2+1].y_top=y1; line[i*2].y_btm=line[i*2+1].y_btm=y2; line[i*2].in=1, line[i*2+1].in=0; y[i*2]=y1, y[i*2+1]=y2; } sort(y, y+2*n); sort(line, line+2*n); cnt=0; for (int i=1; i<2*n; i++) { if (y[i]!=y[i-1]) y[cnt++]=y[i-1]; } y[cnt++]=y[2*n-1]; BuildTree(0, cnt-1, 1); int ans=0; int last_num=0; for (int i=0; i<2*n-1; i++) { if (line[i].in) Insert(GetIndex(line[i].y_top), GetIndex(line[i].y_btm), 1); else Delete(GetIndex(line[i].y_top), GetIndex(line[i].y_btm), 1); ans+=st[1].segnum*(line[i+1].x-line[i].x)*2; ans+=abs(st[1].sum-last_num); last_num=st[1].sum; } Delete(GetIndex(line[2*n-1].y_top), GetIndex(line[2*n-1].y_btm), 1); ans+=abs(st[1].sum-last_num); printf("%d\n", ans); } return 0; }
相关推荐
Cadence IC618与Spectre231安装配置全攻略:License、环境变量与依赖检查
EDA工具部署中,License管理与环境变量隔离是核心难点。FlexLM作为通用授权机制,通过守护进程和端口配置实现工具授权;环境变量则控制工具路径与库加载顺序,避免版本冲突。合理配置可确保IC618与Spectre231稳定运行,提升仿真效率。典型应用场景包括模拟IC设计、高校实验室及企业级EDA环境。本文聚焦Cadence IC618与Spectre231的安装实践,详解License配置、环境隔离及依赖检查,助你快速搭建可靠设计环境。
pku 1177 pictures (线段树+扫描线+离散化)
<br />只能说与pku1151相似,别的还没有发言权<br />哎~~~~~~~~~~愿自己一路走好!!!!!<br /> <br />代码:<br /> <br />#include<iostream> #include<cstdlib> #include<cmath> #define N 5005 using namespace std; struct elem{ double x; double ly; double ry; bool flag; }; s
Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包
一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2 百度云网盘 提取码:z...
pku1177 picture(矩阵周长并)
只能说线段树太强大了,以下是我的代码(含注释),希望大家能看懂:#include#include#includeusing namespace std;const int Max=5005;struct lineTree{ //线段树结构体 int down,up; //线段上下端坐标 int len,num; //线段长度,连续线段的个数
快速玩转 Llama2!机器学习 PAI 最佳实践(一)—低代码 Lora 微调及部署
本实践将采用阿里云机器学习平台PAI-快速开始模块针对 Llama-2-7b-chat 进行开发。PAI-快速开始支持基于开源模型的低代码训练、布署和推理全流程,适合想要快速开箱体验预训练模型的开发者。
InsightFace实战:如何在树莓派上部署轻量级人脸识别系统(附完整代码)
本文详细介绍了如何在树莓派上部署基于InsightFace框架的轻量级人脸识别系统。通过硬件选型、环境配置、模型优化(如MobileFaceNet)及完整代码实战,指导开发者构建本地化、低功耗的智能应用,如智能门铃,并提供了性能调优与系统服务化的进阶技巧。
pku 1177 Picture
#include #include using namespace std;#define MAX 5000#define INF -10001struct TNode{ int left, right; int top; int sum;};TNode T[MAX*12];int map[MAX][4];// left right bolow hi
IPMItool 控制风扇转速
然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。
ACM PKU 1177 Picture
http://acm.pku.edu.cn/JudgeOnline/problem?id=1177 //这个题呢,据说是用线段树来求解,下面有一个示例解法,但我觉得好像有点问题,仅供参考,譬如在输入 3 -1 –1 0 0 0 –1 1 2 -1 1 0 2 时结果应该为12 但该程序的结果是16 #include #include using namespace std; const int MAXINT = 99999999; struct TSegment
Python 爬虫进阶:爬取 APP 数据(Charles 抓包 + Requests)
本文详细介绍了APP数据爬取的完整技术方案。首先通过Charles抓包工具配置HTTPS代理和证书,解析APP通信协议;然后分析请求参数、反爬机制和动态签名生成规则;接着使用Python的Requests库实现模拟请求、分页爬取和数据存储;最后针对证书问题、Token失效等常见问题提供解决方案。文章强调抓包分析、参数逆向和请求模拟三大核心技术,同时提醒开发者需遵守法律法规,合理控制爬取频率。该方案适用于移动端数据采集场景,为无法直接获取网页数据的情况提供了有效解决方案。
基于Python实现学习进度跟踪系统
{{ task }}: {{ "%.1f"|format(hours) }}小时
pku 1177 picture
一道经典的离散化的题目,有论文可以参考。基本思想,在某个方向进行 映射,将连续的坐标(或其它)离散化,在另一个方向以某种方式做题目所需的统计,包括离散化,线段树式统计或其它。优化可以考虑映射方式(减少循环),减小坐标范围(优化插入及更新),主要是通过去重。很可能同时涉及线段树的操作。
微信小程序 - 获取当前日期时间(函数封装)
效果图 前言 摘自微信小程序demo程序中utils.js方法。 普通newDate()出来的日期时间,并不是我们想要的格式,所以要进行格式整理。 解决方案 打开utils.js文件(随意),复制以下代码: /** *获取当前时间 *@description自定义日期分钟秒数 *@param{Object}date-newData()对象 *@returnString */ functionformatTime(date){ //年月日
pku1177 Picture
思路: 1,对y坐标离散化,设有ycnt个不同的y值,在[0,ycnt]上建立线段树 2,建立竖边结构(每个矩形有两条竖边,n个矩形有2*n条竖边): struct Edge{ int yu;//竖边上端点y坐标 int yd;//下端点y坐标 int x;//x坐标 int tag;//竖边类型 } 把所有竖边分为IN和OUT两类,再对x排...
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
PKU 1177 Picture .
Picture Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 7116 Accepted: 3711 Description A number of rectangular posters, photographs and other pictures of the s...
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
pku1177 Picture(矩形外围总周长)
这题我先是用离散化做了下,发现可以过,时间当然要久点。在离散化中有这样一个概念:超元线段。这些线段将平面分割成大小不相当(或相等)的矩形,这些矩形的边要么是给定矩形的边的一部份要么完全和给定矩形无关。我们只有按给定矩形的顶点的x坐标,y坐标分别画出垂直x轴,y轴的直线,用这些直线来分割平面,它们相交得到的线段就是超元线段。只有统计出超元线段出现的次数矩形的总周长就可以算到了。/*pku1177
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
hdu 1828 / poj/pku 1177(Picture)(线段树求矩形覆盖面周长)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 题意描述:题意大家都懂的 分析:此题求的方法和求面积并的方法是一样的,只是在线段树中增加了一些域方便求周长、此题的做法,因为这里的坐标是整点,如果你不采用离
PKU 2352 Stars
题目:http://poj.org/problem?id=2352 题意:平面上有n个星星,每个星星的等级是比该星星的X和Y坐标都小的星星的个数,给出每个星星的坐标(按y轴升序),输出等级0~n-1每个等级的星星个数。 思路:线段树,因为y轴升序给出,我们只考虑x轴就可以, 每次查询只需要查询0~x区间的个数即可。 #include #include const int maxn=320
PKU 2104 K-th Number
题目:http://poj.org/problem?id=2104 借此题学习了一下划分树 划分树定义: 他的每个节点保存【l, r】区间的所有元素,元素的排列顺序与输入的顺序相同,但是其两个子树的元素是所有元素排序后, 有(l+r)/2个元素进入左子树,其余的进入右子树,同时 维护一个num[]变量, num[i]表示l->i中, 有多少个元素进入了左子树。 红色代表进入左子树的元素
PKU 2063 Investment
题目:http://poj.org/problem?id=2063 题意:Jone 有M钱,有d种股票,给出每种股票的价值和年利息,给你y年的时间,使你的钱最多。 思路:典型的完全背包,可以参见背包九讲,需要注意的是The value of a bond is always a multiple of $1000,就是股票的价值是1000的倍数,这样就可以降低 时间复杂度了。。。。
PKU 2947 Widget Factory
题目:http://poj.org/problem?id=2947 题意:工人生产不同的部件需要不同的时间,最少需要3天,最多需要9天。 现有给出n种部件和m条记录,每条记录包括该工人生产部件的总数k和他开始生产时间和结束时间(只给出是周几,不给出具体时间),之后给出这K个部件跟别所属的种类。 最后求出生产这n种部件分别所需要的时间。 思路:高斯消元,设每种部件生产一个所需
PKU 1014 Dividing
题目:http://poj.org/problem?id=1014 题意:有6个物品,价值分别为1、2、3、4、5、6,输入6个数,代表相应的物品的个数,问的是 能不能物品分成两份,每份的价值总和相同。 思路:深搜或多重背包~~~ 好久没写了 生啊~~~ //深搜 #include #include int array[10]; int a, b, c, d, e, f; int
PKU 1018 Communication System
题目:http://poj.org/problem?id=1018 题意:有一个系统有n个设备,每个设备有m个制造商,每个制造商制造的设备的最大带宽和价值是不同的, 题目要求计算n个设备组成的系统中最小的带宽和总价值的最大值,有点绕~~ 思路:选出所有设备的最大带宽和最小带宽,然后从最小带宽枚举到最大带宽,找出每种设备价值最小切带宽大于当前当前带宽~~ #include #in
PKU 1166 The Clocks
题目:http://poj.org/problem?id=1166 题意:给出9个时钟的状态和9种操作,每种操作可以改变不同的时钟的状态,每次只能改变90度,输出最少的有序的操作序列 思路:枚举出每种操作的次数,最多为3次,保存在num数组中,判断每个时钟经过9种,每种num[j]次操作,是否为0. #include #include int flag; int state[9],
PKU 3624 Charm Bracelet
题目:http://poj.org/problem?id=3624 裸的0-1背包问题 #include #include #include using namespace std; const int maxn=12880; const int maxm=3500; int n, m; int dp[maxn+10], w[maxm+10], d[maxm+10]; in
PKU 1151 Atlantis
题目:http://poj.org/problem?id=1151 题意:求矩形并的面积 思路:线段树+离散化+扫描线 #include #include #include #include using namespace std; const int maxn=200; struct SegmentTree { int l, r, cover; double len, sum;
324



被折叠的 条评论
为什么被折叠?



