AtCoder Beginner Contest 382 F - Falling Bars
在这里记录我第一次通过 F 题。
题意:给你一个简化版的俄罗斯方块,每一个方块变成一个长条,要求你模拟这些方块掉落后的结果,输出每一个方块的位置的高度。由于题目的特殊,地面高度为
思路:考虑按照方块从低到高处模拟。对于一开始的一个方块都没有放,所有的点都是高度为
没有线段树的部分是这样的:
int main(){
cin>>h>>w>>n;
for(int i=1;i<=n;i++)cin>>a[i].r>>a[i].c>>a[i].l,a[i].i=i;
sort(a+1,a+n+1);
build(1,1,w); // 初始化空格, 最大空格位置位于 h 行, 区间 1...w
for(int i=1;i<=n;i++){
lps=a[i].c,rps=a[i].c+a[i].l-1; // 求出 bar 的位置区间
hgh=qry(1,1,w,lps,rps); // 查询 lps 到 rps 范围内的最小值, 找到尽可能底下的空格位子
upd(1,1,w,lps,rps,hgh-1); // 更改 lps 到 rps 范围内的值, 最大空格位置变为 hgh-1
ans[a[i].i]=hgh; // 求出答案, 对于每一个 bar, r'[i] 的值就是 hgh
}
for(int i=1;i<=n;i++)cout<<ans[i]<<"\n"; // 输出答案
return 0;
}
总代码有点长,这里放个赛时的链接:代码。