sgu Kalevich Strikes Back
这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含。。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define maxn 120100
using namespace std; long long s[maxn];
vector<int>g[maxn];
int pre[maxn];
int X[maxn];
int n,m,w,h,x1,y1,x2,y2;
struct node
{
int l,r;
int ll,rr;
int cover;
}tree[maxn*]; struct line
{
int y,x1,x2,lr;
bool operator <(const line &a)const
{
return y<a.y;
}
}p[maxn]; void build(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].ll=X[l];
tree[i].rr=X[r];
tree[i].cover=;
if(r-l==) return ;
int mid=(l+r)>>;
build(i<<,l,mid);
build(i<<|,mid,r);
}
void down(int i)
{
if(tree[i].l+==tree[i].r) return;
if(tree[i].cover!=-)
{
tree[i<<].cover=tree[i<<|].cover=tree[i].cover;
tree[i].cover=-;
}
}
void update(int i, line a)
{
if(tree[i].ll==a.x1&&tree[i].rr==a.x2)
{
if(a.lr>)
tree[i].cover=a.lr;
else
tree[i].cover=pre[-a.lr];
return ;
}
down(i);
if(a.x2<=tree[i<<].rr) update(i<<,a);
else if(a.x1>=tree[i<<|].ll) update(i<<|,a);
else
{
line tmp=a;
tmp.x2=tree[i<<].rr;
update(i<<,tmp);
tmp=a;
tmp.x1=tree[i<<|].ll;
update(i<<|,tmp);
}
} int search1(int i,line m)
{
if(tree[i].cover!=-)
{
return tree[i].cover;
}
if(m.x2<=tree[i<<].rr) return search1(i<<,m);
else if(m.x1>=tree[i<<|].ll) return search1(i<<|,m);
else
{
line tmp;
tmp=m;
tmp.x2=tree[i<<].rr;
return search1(i<<,tmp);
}
}
void dfs(int u)
{
for(int i=; i<(int)g[u].size(); i++)
{
int v=g[u][i];
s[u]-=s[v];
dfs(v);
}
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=; i<=n; i++)
{
g[i].clear();
}
scanf("%d%d",&w,&h);
s[]=(long long)w*h;
int t1=;
for(int i=; i<=n; i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2)swap(x1,x2);
if(y1>y2)swap(y1,y2);
s[i]=(long long)(x2-x1)*(y2-y1);
p[t1].y=y1;
p[t1].x1=x1;
p[t1].x2=x2;
p[t1].lr=i;
X[t1++]=x1;
p[t1].y=y2;
p[t1].x1=x1;
p[t1].x2=x2;
p[t1].lr=-i;
X[t1++]=x2;
}
sort(X,X+t1);
t1=unique(X,X+t1)-X;
build(,,t1-);
sort(p,p+*n);
for(int i=; i<*n; i++)
{
if(p[i].lr>)
{
pre[p[i].lr]=search1(,p[i]);
g[pre[p[i].lr]].push_back(p[i].lr);
}
update(,p[i]);
}
dfs();
sort(s,s+n+);
for(int i=; i<=n; i++)
{
if(i==n) printf("%I64d\n",s[i]);
else printf("%I64d ",s[i]);
}
}
return ;
}
sgu Kalevich Strikes Back的更多相关文章
- SGU 319. Kalevich Strikes Back (线段树)
319. Kalevich Strikes Back Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: st ...
- SGU 319 Kalevich Strikes Back(线段树扫描线)
题目大意: n个矩形,将一个大矩形分成 n+1 块.矩形之间不重合,可是包括.求这n+1个矩形的面积 思路分析: 用线段树记录他们之间的父子关系.然后dfs 计算面积. 当给出的矩形上边的时候,就要记 ...
- SGU 495. Kids and Prizes
水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...
- ACM: SGU 101 Domino- 欧拉回路-并查集
sgu 101 - Domino Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Desc ...
- 【SGU】495. Kids and Prizes
http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...
- SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...
- SGU 422 Fast Typing(概率DP)
题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...
- sgu 104 Little shop of flowers 解题报告及测试数据
104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...
- 树形DP求树的重心 --SGU 134
令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...
随机推荐
- mysql if对数据进行处理 having对数据进行查询 thinkphp中的exp支持更复杂的where查询
很多时候,数据库获取的信息并不是我们最终想要的,需要通过if进行处理. where支持查询 having支持后查询(查询后的数据,再筛选) 代码如下: if ($this->_post('dos ...
- xcode忽略警告
1.对整个文件使用 你的工程 -> 你的target -> Build Phases -> Compile Sources -> 搜索要忽略警告的文件名,在 Compiler ...
- Laravel-表单篇-零散信息
1.asset('path'):用于引入静态文件,包括css.js.img 2.分页,调用模型的paginate(每页显示的行数)方法, 如$student = Student::paginate(2 ...
- iOS 部分问题总结2 - 苹果审核篇
iOS 部分问题总结(二) - 苹果审核篇 1. 记录下5.1新规后上传被拒的问题排查和解决过程. 几天前,最新一次的更新被拒了,提示Invaild Binary.好在苹果同时发来了说明邮件做了详细说 ...
- WebGIS在行业中应用的演变
结合我本身的项目及WebGIS在公检法行业中的应用,对此作了一个演变过程的总结: 第一阶段:GIS基本功能的应用:Data Show(数据展示):Search(搜索):Search b ...
- nyist 82迷宫寻宝(一)(BFS)
题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...
- Android开发小问题——java使用
2013-09-25 导语:离上次写博客有点久了,这次写两个开发中解决的问题吧. 正文: 1.ArrayList<E>使用remove问题: 2.字符串映射到函数运行方法: ==== 1. ...
- Canvas制作排序算法演示动画
tips: 形象化演示排序算法可以让初学者快速理解,比较好的例子:jun-lu的SortAnimate,旧金山大学的David Galles教授的算法演示课件.最近在看canvas,试着用js+can ...
- SVG 路径(path)
本文转自:https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Paths <path>元素是SVG基本形状中最强大的一个,它 ...
- Android AsyncTask学习
Android程序有UI进程和后台进程,在执行一些耗时的操作时,如果在UI进程中,很可能出现假死的情况,用户体验会受到影响,因此,那些耗时进程往往就放在了后台进程中,用户体验能更好一些.网络情况不稳定 ...