洛谷 P1638 逛画展

c63a81fc599a40c19a1c05bc2ce84719.png

ff203a27c1cf4965ac0b39e1b0ca914b.png


 最简单的穷举L,R然后区间里面求和看看是否满足条件(n^3)显然是过不了的。

对穷举L,R这一部分用尺取法优化一下就会喜提TL代码...(n^2)

TLE代码(54分)

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+1;

int n,m,a[MAXN],ansl=INT_MIN/2,ansr=INT_MAX/2,ans;

inline void scan(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
}
bool isOK(int l,int r){
    bitset<2001>vis;
    int cnt=0;
    for(int i=l;i<=r;i++){
        if(!vis[a[i]]){
            vis[a[i]]=true;
            cnt++;
        }
    }
    if(cnt>=m)return true;
    return false;
}

int main(){
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(false);
    scan();
    for(int l=1,r=1;r<=n;r++){
        if(!isOK(l,r))continue;
        while(isOK(l+1,r))l++;
        if(r-l<ansr-ansl){
            ansr=r;
            ansl=l;
        }
        if(r-l==ansr-ansl&&l<ansl){
            ansl=l;
            ansr=r;
        }
    }

    cout<<ansl<<" "<<ansr;
    return 0;
}

很明显对于isOK判断函数可以简单的变成L,R两点的缩放。大常数(n)

AC代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+1;

int n,m,a[MAXN],ansl=INT_MIN/2,ansr=INT_MAX/2,ans,cnt;
int vis[2001];

inline void scan(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
}

int main(){
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(false);
    scan();
    for(int l=1,r=1;r<=n;r++){
        if(!vis[a[r]]){
            cnt++;
        }vis[a[r]]++;
        if(cnt<m)continue;
        while(cnt>=m&&vis[a[l]]>1){
            vis[a[l]]--;
            l++;
        }
        if(r-l<ansr-ansl){
            ansr=r;
            ansl=l;
        }
        if(r-l==ansr-ansl&&l<ansl){
            ansl=l;
            ansr=r;
        }
    }

    cout<<ansl<<" "<<ansr;
    return 0;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值