bzoj1510[POI2006]Kra-The Disks*

bzoj1510[POI2006]Kra-The Disks

题意:

一个瓶子有n个节,每个节有一个宽度。现在要从上往下扔m个盘子,如果盘子的下一个位置宽度比该盘子的宽度小则盘子会停在这个位置。问最后一个盘子会停在那个位置。n,m≤300000。

题解:

首先利用单调栈去掉那些没用的节,之后对于每个盘子,二分大于等于它宽度的第一个节,尝试它能否再往下掉到无用的节,具体看代码。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define inc(i,j,k) for(int i=j;i<=k;i++)
 5 #define maxn 300010
 6 using namespace std;
 7
 8 inline int read(){
 9     char ch=getchar(); int f=1,x=0;
10     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();}
11     while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar();
12     return f*x;
13 }
14 int st[maxn],stn[maxn],top,n,m,sz[maxn];
15 int main(){
16     n=read(); m=read(); inc(i,1,n)sz[i]=read();
17     for(int i=n;i>=1;i--){while(top&&sz[i]<st[top])top--; st[++top]=sz[i]; stn[top]=n-i+1;}
18     int now=1;
19     inc(i,1,m){
20         int x=read(); int pos=lower_bound(st+now,st+top+1,x)-st;
21         if(pos>top){printf("%d",0); return 0;}
22         if(i==m)printf("%d",n-(stn[pos]-stn[pos-1]>1?stn[pos-1]+1:stn[pos])+1);
23         if(stn[pos]-stn[pos-1]>1)now=pos,stn[pos-1]++;else now=pos+1;
24     }
25     return 0;
26 }

20161115

时间: 2024-07-28 18:41:04

bzoj1510[POI2006]Kra-The Disks*的相关文章

[bzoj1510][POI2006]Kra-The Disks_暴力

Kra-The Disks bzoj-1510 POI-2006 题目大意:题目链接. 注释:略. 想法:不难发现其实只有前缀最小值是有效的. 进而我们把盘子一个一个往里放,弄一个自底向上的指针往上蹦即可. 时间复杂度$O(n)$. Code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 300010 using namespa

洛谷P3434 [POI2006]KRA-The Disks(线段树)

洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直观的思路(最差的程序效率) 题目相当于每次让我们找区间\([1,las-1]\)中上数第一个比当前盘子半径小的位置(las为上一次盘子掉到的位置)于是用线段树无脑搞一下,维护区间最小值,每次找这个位置,能往左跳就往左,不能的话再往右,当然如果超过了las-1就不用找了,直接放在las上面(相当于la

如何恢复,迁移,添加, 删除 Voting Disks

如何恢复,迁移,添加, 删除 Voting Disks恢复流程 在11gR2 之前,我们可以直接直接使用dd命令对voting disk进行备份.DD示例 备份votedisk盘:[[email protected] bin]# dd if=/dev/raw/raw2 of=/home/oracle/voting_disk.bak 恢复votedisk盘:[[email protected] bin]# dd if=/home/oracle/voting_disk.bak of=/dev/raw

SMR磁盘学习8---Novel Address Mappings for Shingled Write Disks

SMR磁盘学习8---Novel Address Mappings for Shingled Write Disks 第一部分:总述 本文通过改变mapping,减少SWD带来的写放大问题,主要对两个因素进行了深刻的讨论,即SG(Space Gain,空间增益)和WAR(Write Amplification Ratio,写放大比例),实现空间和性能的平衡,降低磁盘系统的开销. 第二部分:重难点详解 Update out-of-place 一.分析两种更新的模式 Update in-place

Disks

题目链接 题意: 给n个圆形盘子的半径,按照顺序一个一个放到x轴正无穷处(与x轴相切),然后向x轴负方向滚动直到碰到第一个盘子或者接触到y轴就停止.输出哪些盘子去掉后,右边界不会变小 分析: 这个题的总体思路比较简单,就是枚举出之前所有的盘子就可以知道当前盘子的位置了.既然要去掉后右边界不变,那么可以先找到右边界上的盘子,问题来了,如果有多个呢?可以想到,选id较小的那个就可以了,因为这个圆的半径必然比较大,和之前的盘子肯定有接触:然后就是看一下和当前盘子接触的有哪些,如果有多个呢?同样的,还是

How To Setup ASM & ASMLIB On Native Linux Multipath Mapper disks?

(文档 ID 602952.1) Applies to: Oracle Database - Enterprise Edition - Version 10.1.0.2 to 12.1.0.2 [Release 10.1 to 12.1]Linux x86Linux x86-64Linux Itanium***Checked for relevance on 08-Oct-2013*** Goal The present document provides an example about ho

bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)

1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 540  Solved: 175[Submit][Status] Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将

【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

[BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将知道落下的立方体信息以及位置,你的任务就是回答所有立方体落下后最高的方块的高度.所有的立方体在下落过程中都是垂直的并且不会旋转.平板左下角坐标为原点,并且

bzoj1524【POI2006】Pal

1524: [POI2006]Pal Time Limit: 5 Sec  Memory Limit: 357 MB Submit: 367  Solved: 121 [Submit][Status][Discuss] Description 给出n个回文串s1, s2, -, sn 求如下二元组(i, j)的个数 si + sj 仍然是回文串 规模 输入串总长不超过2M bytes Input The first line of input file contains the number o