当前位置: 首页 > news >正文

UVA11491 Erasing and Winning(单调队列/RMQ)

题目链接


在这里插入图片描述
1.题目大意:给出一个n位整数,删除其中的d个数字,保证剩下的整数尽可能的大

2.第一眼没想到单调队列那种做法,反正题目意思明显就是每次保证取前n-m个(m递减),而且是这段序列中最大的元素,且位置越靠左越好,对于靠左的最大元素,如果遍历的话会使时间复杂度达到O(n2),显然不可取的。于是emmm,预处理之后每次查询区间最值,这样的查询时间复杂度显然为O(n)

3.标答是利用单调队列的思想,在输入时就和前面已经输入的序列对比,在满足合法区间内取得每个数时,每次更新到前面的数大于等于当前输入的数,检查区间的合法性则直接向后更新,显然这样相当于在每次取数的序列里维护了一个降序的序列,且随时被覆盖更新,最后达到目的

RMQ:

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=2e5+10;


int a[maxn],dp[maxn][25];
int n,m;

void RMQ_init(){
    for(int i=1;i<=n;i++)
        dp[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j-1)<=n;i++)
            dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}

int query(int l,int r){
    int k=0;
    while((1<<(k+1))<=r-l+1) k++;
    return max(dp[l][k],dp[r-(1<<k)+1][k]);
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    string s;
    while(cin>>n>>m){
        if(!n && !m) break;
        cin>>s;
        for(int i=1,j=0;i<=n;i++,j++) a[i]=s[j]-'0';
        RMQ_init();
        int l=1,len=n-m;
        vector<int> ans;
        while(len){
            len--;
            int i=l,r=n-len;
            int now=query(l,r);
            while(a[i]<now) i++;
            ans.push_back(now);
            l=i+1;
        }
        for(int i=0;i<ans.size();i++) cout<<ans[i];
        cout<<endl;
    }
    return 0;
}

单调队列:

#include <iostream>
using namespace std;
const int maxn=2e5+10;

char s[maxn];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    while(cin>>n>>m){
        if(!n && !m) break;
        int k=0;
        char c;
        for(int i=0;i<n;i++){
            cin>>c;
            while(k>0 && c>s[k] && k>i-m) k--;
            if(k+m<n) s[++k]=c;
        }
        s[++k]='\0';
        cout<<s+1<<endl;
    }
    return 0;
}

相关文章:

  • MacBook 常用快捷键
  • UVA1618 Weak Key(枚举优化/RMQ)
  • Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum(差分)
  • 用Stopwatch类来测试你的程序运行时间
  • UVA1613 K-Graph Oddity(无向图染色简单题)
  • 属于我们的移动智能时代
  • UVA1614 Hell on the Markets(结论+贪心)
  • OPhone开发环境设置备忘录
  • 尺有所长,寸有所短——谁是主人
  • Codeforces Round #636 (Div. 3) E. Weights Distributing(bfs求无向无权图最短路径)
  • 另一种MTK特效制作的方法,层复制
  • 字典树(Trie)——入门篇
  • 警惕:电信加紧发力为哪般?(下)
  • Codeforces Round #637 (Div. 2) C. Nastya and Strange Generator(阅读理解/思维)
  • Broken Space Bar(Trie)[待补]
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python 反序列化安全问题(二)
  • python 装饰器(一)
  • Python进阶细节
  • python学习笔记-类对象的信息
  • Rancher如何对接Ceph-RBD块存储
  • Solarized Scheme
  • storm drpc实例
  • yii2中session跨域名的问题
  • 订阅Forge Viewer所有的事件
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 浏览器缓存机制分析
  • 嵌入式文件系统
  • 巧用 TypeScript (一)
  • 实习面试笔记
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用 5W1H 写出高可读的 Git Commit Message
  • ionic异常记录
  • MPAndroidChart 教程:Y轴 YAxis
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​flutter 代码混淆
  • #14vue3生成表单并跳转到外部地址的方式
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (1)(1.13) SiK无线电高级配置(六)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (六)c52学习之旅-独立按键
  • (三)elasticsearch 源码之启动流程分析
  • (十八)SpringBoot之发送QQ邮件
  • (实战篇)如何缓存数据
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • ./和../以及/和~之间的区别
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core 项目指定SDK版本