试题描述
输入正整数N和M,在N中删除掉M位,能留下的最大整数是多少?
输入
正整数N和M
输出
留下的最大整数
输入示例
233390323 5
输出示例
9323
其他说明
1<=N<=10^1000
1<=M<=1000
 

N的长度比较小,胡搞就行了。

那么如果1<=N<=10^1000000呢?

考虑当前最后保留的位置是cur,还要删m个字符,那么下一个要删的区间应是[cur+1,cur+m+1],那么我们要设计一个数据结构快速找到区间最大值。

这显然是个滑动窗口,用单调队列做做就行了(<--WZJ这蒟蒻竟然没看出来写了线段树)。注意这组数据636546796 8要输出9,即如果最后还没删够要输出前n-m个得到的字符。

#include<cstdio>
#include<cctype>
#include<ctime>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
char s[],q[];
int maxv[];
void build(int o,int l,int r) {
if(l==r) maxv[o]=l;
else {
int mid=l+r>>,lc=o<<,rc=lc|;
build(lc,l,mid);build(rc,mid+,r);
if(s[maxv[lc]]>=s[maxv[rc]]) maxv[o]=maxv[lc];
else maxv[o]=maxv[rc];
}
}
int ql,qr;
int query(int o,int l,int r) {
if(ql<=l&&r<=qr) return maxv[o];
int mid=l+r>>,lc=o<<,rc=lc|;
if(qr<=mid) return query(lc,l,mid);
if(ql>mid) return query(rc,mid+,r);
int ans1=query(lc,l,mid),ans2=query(rc,mid+,r);
return s[ans1]>=s[ans2]?ans1:ans2;
}
int main() {
int m,cnt=,t;
scanf("%s%d",s+,&m);t=m;
int n=strlen(s+),cur=;
build(,,n);
while(cur<n) {
ql=cur+;qr=min(cur+m+,n);
int next=query(,,n);
m-=next-cur-;cur=next;
q[++cnt]=s[cur];if(m<=) break;
}
if(m) rep(i,,n-t) putchar(q[i]);
else {
printf("%s",q+);
rep(i,cur+,n) putchar(s[i]);
}
return ;
}

COJ 删除数字的更多相关文章

  1. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

  2. lintcode - 删除数字

    class Solution { public: /* * @param A: A positive integer which has N digits, A is a string * @para ...

  3. react之redux增加删除数字

    比如在页面中添加和删除‘222’ action.js export const ADD= 'ADD'; export const RED='RED'; export const add=(str)=& ...

  4. 【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始

    第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ...

  5. Oracle删除指定用户下所有对象

    --.sql脚本 --唯一注意的是下面的d:\dropuserobj.sql为操作的.sql; --用于删除当前用户的所有对象 --use for drop all objects in curren ...

  6. IT公司100题-18-圆圈中最后剩下的数字

    问题描述: n个数字(下标为0, 1, …, n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(当前数字从1开始计数).当一个数字被删除后,从被删除数字的下一个数字开始计数,继续删除 ...

  7. 转: 数字证书原理 https 完整过程解析

    点评: 讲的非常的详细与全面,值得一看. 转: http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html 文中首先解释了加密解 ...

  8. 基于visual Studio2013解决面试题之1001去除数字

     题目

  9. [区块链|非对称加密] 对数字证书(CA认证)原理的回顾

    摘要:文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的 ...

随机推荐

  1. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  2. 【JAVA、C++】LeetCode 007 Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 解题思路:将数字 ...

  3. 【JAVA、C++】LeetCode 012 Integer to Roman

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...

  4. codeforces 489C.Given Length and Sum of Digits... 解题报告

    题目链接:http://codeforces.com/problemset/problem/489/C 题目意思:给出 m 和 s,需要构造最大和最小的数.满足长度都为 m,每一位的数字之和等于 s. ...

  5. mysql生成varchar类型主键排序

    用uuid生成20位的主键 SELECT LEFT(REPLACE(UUID(), '-', ''),20) FROM DUAL 另一种方法: 因为数据库中有字母 需要排序的时候去除字母,重新取最大值 ...

  6. Maven无法引入自定义构件依赖的解决方案

    一般情况下,使用如下命令即可将自定义构件安装到本地仓库,供其他项目使用. mvn clean install 但是也有例外,今天我就分享一下我遇到问题,供相同遭遇的同学参考下. 我使用了父POM统一管 ...

  7. 【读书笔记】读《JavaScript DOM 编程艺术-第2版》

    1.DHTML DHTML曾被认为是HTML/XHTML.CSS和JavaScript相结合的产物,就像今天的HTML5那样,但把这些东西真正凝聚在一起的是DOM.如果真的需要来描述这一过程的话,“D ...

  8. C语言实现大数据除法

    本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...

  9. hadoop中常见的问题

    一.在root下进行格式化 这样很糟糕 这样的话,若是第一次装的话,我的建议是将生成的文件都删掉,恢复到最开始的状态, 1. 首先你需要删除 vi conf/hdfs-site.xml   配置文件的 ...

  10. 二、JavaScript语言--JS基础--JavaScript入门篇

    1.如何插入JS 使用<script>标签在HTML网页中插入JavaScript代码.注意, <script>标签要成对出现,并把JavaScript代码写在<scri ...