FZU 2187 扫描线

2024-06-20 04:18
文章标签 扫描线 2187 fzu

本文主要是介绍FZU 2187 扫描线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

和HDU 1255差不多

这次是求只被覆盖一次的矩形面积和

修改callen函数即可

data[k].len表示被覆盖的纵长度

data[k].key表示被只被覆盖一次的纵长度


#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "iostream"
#include "algorithm"
using namespace std;struct comp
{int flag; // 1代表矩阵的起始边,-1代表矩阵的终边int  x,y1,y2;
} node[200010];  // 记录每条与Y轴平行的边struct comp1
{int l,r,mid,s;int  len,ml,mr,key;
} data[800010];bool cmp(comp a,comp b)
{return a.x<b.x;
}int y[200010];void build(int l,int r,int k)
{data[k].l=l;data[k].r=r;data[k].mid=(l+r)/2;data[k].ml=y[l];data[k].mr=y[r];data[k].s=data[k].len=0;if (l+1==r) return ;build(l,data[k].mid,k*2);build(data[k].mid,r,k*2+1); // 注意应该从 mid开始
}void callen(int k) // 计算纵长度
{if (data[k].s>1){data[k].len=data[k].mr-data[k].ml;data[k].key=0;}elseif (data[k].s==1){data[k].len=data[k].mr-data[k].ml;if (data[k].l+1==data[k].r) data[k].key=data[k].len;else data[k].key=data[k].len-data[k*2].len-data[k*2+1].len;}elseif (data[k].l+1==data[k].r){data[k].len=0;data[k].key=0;}else{data[k].len=data[k*2].len+data[k*2+1].len;data[k].key=data[k*2].key+data[k*2+1].key;}
}void updata(int k,comp b)
{if (b.y1==data[k].ml && b.y2==data[k].mr){data[k].s+=b.flag;callen(k);return ;}if (b.y2<=data[k*2].mr) updata(k*2,b);elseif (b.y1>=data[k*2+1].ml) updata(k*2+1,b);else{comp temp;temp=b;temp.y2=data[k*2].mr;updata(k*2,temp);temp=b;temp.y1=data[k*2+1].ml;updata(k*2+1,temp);}callen(k);
}int main()
{int n,i,t,p,Case;int x1,x2,y1,y2;long long  sum;scanf("%d",&Case);for (p=1;p<=Case;p++){scanf("%d",&n);t=1;for (i=0;i<n;i++){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);node[t].x=x1;node[t].y1=y1;node[t].y2=y2;node[t].flag=1;y[t++]=y1;node[t].x=x2;node[t].y1=y1;node[t].y2=y2;node[t].flag=-1;y[t++]=y2;}sort(node+1,node+t,cmp);sort(y+1,y+t);build(1,t-1,1);sum=0;updata(1,node[1]);for (i=2;i<t;i++){sum+=(long long )data[1].key*(node[i].x-node[i-1].x);updata(1,node[i]);}printf("Case %d: %lld\n",p,sum);}return 0;
}


这篇关于FZU 2187 扫描线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077080

相关文章

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

fzu 2277 Change 线段树

Problem 2277 Change Time Limit: 2000 mSec    Memory Limit : 262144 KB  Problem Description There is a rooted tree with n nodes, number from 1-n. Root’s number is 1.Each node has a value ai.

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

Zxing扫描二维码精简(竖屏、拉伸处理、扫描框大小和扫描线移动、开灯)

自己在简版zxing的基础上美化了下,给大家分享下,直接扫描功能没问题。 就是从相册导入图片,解码一直不成功,导入图片解码 我引入了一个解码类  RGBLuminanceSource(百度网上二维码图片解码都是这个,我还把这个类编译了,导到core.jar包里面了), 好像是hity类型有问题,反正一直不成功。 有大神解决了,回复告诉我!谢谢! 分享 暂时没做效

【FZU】1921 栀子花开 线段树果题

Problem 1921 栀子花开 Accept: 216    Submit: 745 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 这是一个栀子花开的季节,也是一个离别的季节,四年一千多个日日夜夜,那校园的角角落落,留下了我们沉思的身影;那上百次的成绩排名表,印证了我们深深浅浅不断进步的

【FZU】2171 防守阵地 II 线段树

Problem 2171 防守阵地 II Accept: 96    Submit: 360 Time Limit: 3000 mSec    Memory Limit : 32768 KB Problem Description 部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得

【FZU】2105 Digits Count 线段树

传送门:【FZU】2105 Digits Count 题目分析:与、或、异或三种操作都是每一位相互独立的,所以可以将线段树建四棵,分别对应一位,and和or操作相当于覆盖操作,xor操作相当于反转操作,就和普通的线段树方法类似,设立两个lazy标记即可。查询的时候求得每一位的1的个数*权重(1,2,4,8),全部累加就是答案。 代码如下: #include <cst

扫描线Sweep Line算法总结

扫描线算法,推荐还是用标准的模板去写,treemap只适合于求最大的overlap个数的题目,其余的不能用treemap来解,所以推荐还是用event的思想去+1, -1然后排序扫描的方法可以用来解所有的题型; Number of Airplanes in the Sky 思路:经典扫描线算法:把interval起飞和降落做为event,全部打散,按照时间排列,同时时间相等的,按照降落在前面,起

矩形面积并、矩形面积交、矩形周长并(线段树、扫描线总结)

转自:http://blog.csdn.net/lwt36/article/details/48908031 HDU 1542 [POJ 1151] Atlantis (矩形面积并) 题意: 求N<=100个矩形的面积并 分析: 离散化: 这些技巧都是老生常谈的了, 不然浮点数怎么建树, 离散化 x 坐标就可以了扫描线: 首先把矩形按 y 轴分成两条边, 上边和下边,