Gym 100917J---dir -C(RMQ--ST)

题目链接

http://codeforces.com/gym/100917/problem/D

problem description

Famous Berland coder and IT manager Linus Gates announced his next proprietary open-source system "Winux 10.04 LTS"

In this system command "dir -C" prints list of all files in the current catalog in multicolumn mode.

Lets define the multicolumn mode for number of lines l. Assume that filenames are already sorted lexicographically.

  • We split list of filenames into several continuous blocks such as all blocks except for maybe last one consist of l filenames, and last block consists of no more than l filenames, then blocks are printed as columns.
  • Width of each column wi is defined as maximal length of the filename in appropriate block.
  • Columns are separated by 1 × l column of spaces.
  • So, width of the output is calculated as , i.e. sum of widths of each column plus number of columns minus one.

Example of multi-column output:

a       accd e taba     b    f wtrtabacaba db   k

In the example above width of output is equal to 19.

"dir -C" command selects minimal l, such that width of the output does not exceed width of screen w.

Given information about filename lengths and width of screen, calculate number of lines l printed by "dir -C" command.

Input

First line of the input contains two integers n and w — number of files in the list and width of screen (1 ≤ n ≤ 105, 1 ≤ w ≤ 109).

Second line contains n integers fi — lengths of filenames. i-th of those integers represents length of i-th filename in the lexicographically ordered list (1 ≤ fi ≤ w).

Output

Print one integer — number of lines l, printed by "dir -C" command.

Examples

input

11 201 3 7 4 1 2 1 1 1 1 4

output

3

题意:有n个目录名字符串,长度为a[1]~a[n] 屏幕宽为w  ,现在要按照已经给的目录循序一列一列的放,每一列放x个,最后一列放<=x个  要求每一列目录名左端对整齐 ,形成一个长方形的块 ,且块与块之间空一格,且不能超过屏幕的宽度,求最小的行数;

思路:先对输入长度处理,用ST算出每个区间的最大值,然后枚举行数x 从1 ~ n;

代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const int MAXN = 1e5+5;
int a[MAXN],m[30][MAXN];
int n;
LL w;

int main()
{
    while(scanf("%d%I64d",&n,&w)!=EOF)
    {
         memset(m,0,sizeof(m));
         for(int i=1;i<=n;i++)
         {
             scanf("%d",&a[i]);
             m[0][i]=a[i];
         }
         for(int i=1;i<=(int)log(n)/log(2);i++)
         {
             for(int j=1;j+(1<<i)-1<=n;j++)
                m[i][j]=max(m[i-1][j],m[i-1][j+(1<<(i-1))]);
         }

         for(int i=1;i<=n;i++)
         {
             int k=(int)log(i);
             long long sum=0;
             for(int j=0;j<n/i;j++)
             {
                 sum+=(long long)max(m[k][j*i+1],m[k][i*(j+1)-(1<<k)+1])+1;
             }
             if(n%i!=0) {
                k=(int)log(n%i);
                sum+=(long long)max(m[k][n-n%i+1],m[k][n-(1<<k)+1])+1;
             }
             if(sum-1<=w){
                printf("%d\n",i);
                break;
             }
         }
    }
    return 0;
}
时间: 2024-10-23 17:59:06

Gym 100917J---dir -C(RMQ--ST)的相关文章

Flying Squirrel --- Gym - 102091A(RMQ + 思维)

题目 https://vjudge.net/problem/Gym-102091A 题意 从左到右给出 n 个位置固定机场和 m 个询问,每个机场有自己的高度 H,每个飞机只能向高度比原高度小的地方飞,并且途中不能经过大于等于原高度的位置.询问给出两个参数 u,v. 当 v ! = 0 时,从 u,v 中较高处向较低出飞,最多途径几个机场(包括终点)飞到终点. 当 v == 0 时,从 u 起飞,不固定终点,问最多途径几个机场(包括终点)飞到终点. 题解 对于每个机场,若是想要飞的多,肯定是要飞

GYM 100345E New Mayors(二分图染色)

题意:有一个无向图和三种颜色,顶点数目n<=500,记从一个顶点u出发所能到的所有顶点的集合为S(u),S(u)中的点可以相互到达且只经过S(u)中的点(不包括u),规定一条边的两个端点不能染相同的颜色,问是否存在一种可行方案. 思路:如果直接暴力的话时间复杂度是3^n,显然无法承受. 考虑任意一个结点u,那么S(u)中的所有点组成的子图是联通的并且S(u)中的点只能染另外两种颜色,由于这个图是联通的,所以染色方案肯定是唯一的,也就是说我们对于每个节点进行一次二分图染色,如果有冲突那么不存在方案

POJ 3419 Difference Is Beautiful(RMQ变形)

题意:N个数,M个询问,每个询问为一个区间,求区间最长连续子序列,要求每个数都不同(perfect sequence,简称PS). 题解:很容易求出以每个数为结尾的ps,也就是求区间的最大值.有一个不同就是长度可能会超出询问范围,所以先对PS的首位置二分,然后RMQ.注意一点,序列有可能出现负数,所以先加最大值变为正数.其实也不算变形,挺裸的…… 这题卡线段树,然而我只会线段树,心塞…… 代码(树状数组): #include <iostream> #include <cstring>

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

Gym 100338I TV show (dfs枚举)

Gym 100338I 题意: 一个人去参加电视有奖问答的节目,初始奖金为100元,每答对一道问题奖金翻倍,答错奖金清零.此外有一次保险机会:花费C的奖金,下一题可以答对奖金翻倍,答错奖金不清零. 现在给你答对每道题的概率,求最优答题策略的奖金期望. 思路: 先不考虑有保险机会.回答对第j题后离开的奖金期望就是: 100?2j?∏ji=1pi 那么我们枚举回答对第j题后离开的奖金期望,维护其最大值即可(注意也可以一题不回答直接走人,期望为100). 那么我们现在来考虑有保险机会的情况,我们枚举回

gym101102D Rectangles (rmq+二分)

题意: 给你一个n*m(1e3)的矩阵,让你找出元素全部相同的子矩阵的个数. 思路: 可以预处理向左和向上的最大相同长度,然后对于每列用rmq维护一个区间最小值, 这个值表示向左延伸的长度,然后对于当前的元素,二分查找距离他最近的值小于他的上一个位置, 然后当前位置的贡献就是向左延伸的长度*纵坐标之差+1(这块矩阵完全相同,直接边长相乘)再加上上一个位置的贡献. 总复杂度就是n^2log(n)的 #include <iostream> #include <cstdio> #incl

UVA - 1618 Weak Key(RMQ算法)

题目: 给出k个互不相同的证书组成的序列Ni,判断是否存在4个证书Np.Nq.Nr.Ns(1≤p<q<r<s≤k)使得Nq>Ns>Np>Nr或者Nq<Ns<Np<Nr. 思路: 有两种情况<小.最大.最小.大>.<大.最小.最大.小>,枚举第1个和第4个数,用RMQ查询这两个数之间的最大值和最小值,然后根据给出的条件判断一下就可以了. 看到好多大佬不用RMQ也写出来了,还需要在研究一下. 代码: #include <bit

Gym - 100342I Travel Agency(割顶)

题意:给一个无向图,对于每个节点a,统计有多少点对(u,v)之间的路径必须经过a. 思路:首先求一个图的割顶,在这颗dfs时间树中我们可以发现,对于一个结点u,如果他的一颗子树不能连回u以上的结点,那么这一棵子树的结点与除u以外的结点之间的路径必然经过u,那么在dfs的过程中不断更新答案即可. #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<io

Gym - 101190F Foreign Postcards (期望dp)

题意:有n张标有“C”或“F”的卡片. 1.随机取前k张(1<=k<=n) 2.若这k张的第一张为“C”,则不翻转,否则,全部翻转这k张. 3.然后处理剩下的n-k张 4.重复步骤1~3直至处理完所有卡片. 求处理后卡片W的个数期望. 分析:期望dp从后往前推. 1.对于最后一张卡片,无论为C还是W,最后的结果都是W个数为0,因此dp[len] = 0. 2.对于卡片i,k有(len - i + 1)种选择 若卡片i为C,则前k张卡片是不反转的,预处理前缀和. k = 1, 1 / (len

Codeforces Round #172 (Div. 2)---D. Maximum Xor Secondary(RMQ + 二分)

Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1,?x2,?-,?xk (k?>?1) is such maximum element xj, that the following inequality holds: . The lucky number of the sequenc