AC日记——玻璃切割 51nod 1562
思路:
并查集;
离线操作;
先把每次切割都存下来;
然后从后面不断合并切割;
然后每次更新最大长和宽;
记录答案;
要开longlong;
来,上代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 400005
#define ll long long struct OperType {
ll l,r,x;
};
struct OperType hh[maxn],ww[maxn]; struct CutType {
ll x,id;
};
struct CutType qh[maxn],qw[maxn]; ll f1[maxn],f2[maxn],w,h,n,totw,toth,dis1[maxn],dis2[maxn];
ll answ,ansh,ans[maxn]; bool ty[maxn]; inline void in(ll &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} ll find1(ll x)
{
if(f1[x]==x) return f1[x];
f1[x]=find1(f1[x]);
return f1[x];
} ll find2(ll x)
{
if(f2[x]==x) return f2[x];
f2[x]=find2(f2[x]);
return f2[x];
} bool cmp(CutType aa,CutType bb)
{
return aa.x<bb.x;
} int main()
{
in(w),in(h),in(n);char ch[];
for(ll i=;i<=n;i++)
{
scanf("%s",ch);
if(ch[]=='H')
{
ty[i]=true;
in(hh[++toth].x);
qh[toth].x=hh[toth].x;
qh[toth].id=toth,f1[toth]=toth;
}
else
{
in(ww[++totw].x);
qw[totw].x=ww[totw].x;
qw[totw].id=totw,f2[totw]=totw;
}
}
sort(qw+,qw+totw+,cmp);
sort(qh+,qh+toth+,cmp);
ll pos=;f1[toth+]=toth+,f2[totw+]=totw+;
for(ll i=;i<=toth;i++)
{
dis1[i]=qh[i].x-pos,pos=qh[i].x,ansh=max(dis1[i],ansh);
hh[qh[i].id].l=i,hh[qh[i].id].r=i+;
}
dis1[toth+]=h-pos,ansh=max(ansh,dis1[toth+]),pos=;
for(ll i=;i<=totw;i++)
{
dis2[i]=qw[i].x-pos,pos=qw[i].x,answ=max(dis2[i],answ);
ww[qw[i].id].l=i,ww[qw[i].id].r=i+;
}
dis2[totw+]=w-pos,answ=max(answ,dis2[totw+]);
ans[n]=answ*ansh;
for(ll i=n;i>;i--)
{
if(ty[i])
{
ll x=find1(hh[toth].l),y=find1(hh[toth].r);
if(x!=y)
{
dis1[x]+=dis1[y],f1[y]=x;
ansh=max(ansh,dis1[x]);
}
toth--;
}
else
{
ll x=find2(ww[totw].l),y=find2(ww[totw].r);
if(x!=y)
{
dis2[x]+=dis2[y],f2[y]=x;
answ=max(answ,dis2[x]);
}
totw--;
}
ans[i-]=answ*ansh;
}
for(ll i=;i<=n;i++) printf("%lld\n",ans[i]);
return ;
}
AC日记——玻璃切割 51nod 1562的更多相关文章
- AC日记——最高奖励 51nod 1163
最高的奖励 思路: 排序: 时间为第一关键字,按总小到大排: 价值为第二关键字,按从大到小排: 然后,不难看出,如果两个时间不同: 那么,两个时间之间最少能做一件事: 因为他们的时间下限最少相差1: ...
- AC日记——幸运号码 51nod 1043
幸运号码 思路: 传说中的数位dp: 不难发现,n(n<1000) ,那么,n个数的最大和为9*1000=9000: 对于9000*1000的时间范围,我们可以用dp来解决: dp[i][j], ...
- AC日记——石子归并 51nod 1021
石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][ ...
- AC日记——背包问题 V2 51nod 1086
有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi ...
- 51nod 1562 玻璃切割
1562 玻璃切割 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1562 题目来源: CodeForces 基准时间 ...
- 51nod 1562 玻璃切割 (STL map+一点点的思考)
1562 玻璃切割 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要 ...
- AC日记——codevs1688求逆序对
AC日记--codevs1688求逆序对 锵炬 掭约芴巷 枷锤霍蚣 蟠道初盛 到被他尽情地踩在脚下蹂躏心中就无比的兴奋他是怎么都 ㄥ|囿楣 定要将他剁成肉泥.挫骨扬灰跟随着戴爷这么多年刁梅生 圃鳋 ...
- 51nod 1562 玻璃切割 (set)
#include<stdio.h> #include<iostream> #include<set> using namespace std; typedef lo ...
- AC日记——最小正子段和 51nod 1065
最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include & ...
随机推荐
- Eclipse Java 构建路径 ---Eclipse教程第13课
Eclipse Java 构建路径 设置 Java 构建路径 Java构建路径用于在编译Java项目时找到依赖的类,包括以下几项: 源码包 项目相关的 jar 包及类文件 项目引用的的类库 我们可以通 ...
- 途牛banner自动轮播
<!DOCTYPE html> <!--申明文档类型:html--> <html lang="en"> ...
- MySQL Group Replication数据安全性保障
本文来自数据库内核专栏 在之前的文章中,介绍了MGR对数据可靠性.可用性和一致性的实现方案.简单来说,MGR通过基于paxos协议的多副本来实现数据的可靠性,通过多副本上的majority机制来实现可 ...
- 《Cracking the Coding Interview》——第17章:普通题——题目14
2014-04-29 00:20 题目:给定一个长字符串,和一个词典.如果允许你将长串分割成若干个片段,可能会存在某些片段在词典里查不到,有些则查得到.请设计算法进行分词,使得查不到的片段个数最少. ...
- 《算法》C++代码 快速排序
快速排序,简称快排,常称QuickSort.QSort.在排序算法中非常常用,其编程复杂度低,时间复杂度O(NlogN),空间复杂度O(N),执行效率稳定,而且常数很低. 基本思想就是二分,例如你要将 ...
- 自动化测试(三)如何用python写个一函数,这个函数的功能是,传入一个数字,产生N条手机号,产生的手机号不能重复
本期时间短没来得及写思路,不过我都加了注释,有问题可以@我 import randomimport timedef Phones(number):#生成手机号函数 s = "01234567 ...
- 编译TypeScript(TypeScript转JavaScript)
1.配置tsconfig.json文件 tsconfig.json文件配置说明 { "compilerOptions": { //生成相关说明,TypeScript编译器如何编译. ...
- hnust 好友互动标识
问题 A: 好友互动标识 时间限制: 1 Sec 内存限制: 128 MB提交: 897 解决: 122[提交][状态][讨论版] 题目描述 QQ有一个有趣的功能即显示好友互动标识,它 ...
- ftrace 简介
ftrace 简介 ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析. 最早 ftrace 是一个 function tracer,仅能够记录内核的函数 ...
- c# json 反序列化 泛型List 2行代码
List<EncyTable> list = new List<EncyTable>(); var jsonReqeust = "[{ENCY_ID:775,ENCY ...