P1638 逛画展(尺取法)

文章介绍了如何使用双指针方法求解参观画展的最小费用问题,确保看到所有指定画家的作品,同时控制门票成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逛画展

题目描述

博览馆正在展出由世上最佳的 m m m 位画家所画的图画。

游客在购买门票时必须说明两个数字, a a a b b b,代表他要看展览中的第 a a a 幅至第 b b b 幅画(包含 a , b a,b a,b)之间的所有图画,而门票的价钱就是一张图画一元。

Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。

请求出他购买门票时应选择的 a , b a,b a,b,数据保证一定有解。

若存在多组解,输出 a a a 最小的那组

输入格式

第一行两个整数 n , m n,m n,m,分别表示博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。

第二行包含 n n n 个整数 a i a_i ai,代表画第 i i i 幅画的名师的编号。

输出格式

一行两个整数 a , b a,b a,b

样例 #1

样例输入 #1

12 5
2 5 3 1 3 2 4 1 1 5 4 3

样例输出 #1

2 7

提示

数据规模与约定
  • 对于 30 % 30\% 30% 的数据,有 n ≤ 200 n\le200 n200 m ≤ 20 m\le20 m20
  • 对于 60 % 60\% 60% 的数据,有 n ≤ 1 0 5 n\le10^5 n105 m ≤ 1 0 3 m\le10^3 m103
  • 对于 100 % 100\% 100% 的数据,有 1 ≤ n ≤ 1 0 6 1\leq n\le10^6 1n106 1 ≤ a i ≤ m ≤ 2 × 1 0 3 1 \leq a_i \leq m\le2\times10^3 1aim2×103

因为是要求看的画是连续的,所以可以考虑尺取法(双指针法)

既然要求要看到M位画家的画,我们可以考虑维护一个区间[l,r],保证这个区间是含有M位画家且以l开头最小的区间,则如果想更新答案获得更小区间,只能右移l,而不能左移r。

为什么呢?

考虑反证法。

假设有一个区间[l,r-k]比[l,r]更优,则这段区间会在r =r-k的时候就被更新,所以左移r无用。

所以r就满足单调性(只增不减),可以用尺取法做。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000005;
int n,m,a[MAXN],ans,b[MAXN],cnt,ansl,ansr;
inline void I(int x){if(b[x]==0)cnt++;b[x]++;}//加入第x位画家的画
inline void D(int x){if(b[x]==1)cnt--;b[x]--;}//删除第x位画家的画
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf ("%d",&a[i]);
    ans=n;
    for(int r=1,l=1;r<=n;r++){
        I(a[r]);//首先插入a[r]的画
        while(true){
            D(a[l]);//先删a[l]的画
            if(cnt==m)l++;//如果删了没事,加l
            else{I(a[l]);break;}//删了有事,还留着
        }
        if(cnt==m&&r-l+1<ans)ans=r-l+1,ansl=l,ansr=r;
    }
    if (ansl!=0)printf ("%d %d",ansl,ansr);
    else printf ("1 %d",n);//输出+特判:选择任意一个≤n的区间不满足要求,则只好选择区间[1,n]
    return 0;
}
### 如何在 Unity 中开发画展相关应用或场景 #### 使用 Unity 创建虚拟画展的基础流程 Unity 是一款功能强大的游戏引擎,同时也适用于构建交互式的艺术展览体验。通过结合其图形渲染能力以及插件支持,可以高效地制作出沉浸感强的虚拟画展。 为了实现这一目标,开发者通常会利用以下技术模块: 1. **场景搭建** 场景设计是整个项目的基石。可以通过导入现成的3D模型来快速建立展厅结构[^1]。这些模型可以从 Unity Asset Store 或其他公共资源库获取,也可以由专业的建模师定制化完成。对于画作展示区域,则需特别注意光照效果和材质表现力,以突出艺术品细节。 2. **纹理流送优化 (Texture Streaming)** 鉴于高分辨率图像文件可能占用大量内存空间,在移动设备或者WebGL平台上部署时容易遇到性能瓶颈问题。因此采用合适的纹理管理策略至关重要。正如提到过的基于Unity Addressables 的 Texture Streaming 方案能够有效解决这个问题 。它允许按需加载高质量图片数据而无需一次性全部载入到RAM里头 ,从而提升用户体验流畅度并减少初始下载时间 。 3. **互动机制设置** 用户界面(UI) 和物理行为(Physics) 设计让参观者能更深入参与到展览之中。比如点击放大查看某幅作品详情;拖拽调整视角方向等等操作都可以增强临场代入感。此外还可以加入音频解说作为辅助说明手段之一 。 4. **跨平台发布准备** 最后一步就是考虑最终成品要面向哪些具体终端类型——PC端浏览器访问? 移动APP独立安装包 ? VR眼镜直连模式?不同出口形式背后涉及到的技术选型差异较大,所以前期规划阶段就要明确下来以便后续针对性适配工作顺利开展下去 。 ```csharp // 示例代码片段:简单的UI按钮触发事件脚本用于切换展品显示状态 using UnityEngine; using UnityEngine.UI; public class ExhibitSwitcher : MonoBehaviour { public GameObject[] exhibits; // 所有可轮流展示的艺术品对象数组 private int currentIndex =0 ; void Start(){ foreach(var e in exhibits){ e.SetActive(false); // 初始状态下隐藏所有物品 } if(exhibits.Length>0){ exhibits[currentIndex].SetActive(true); } } public void NextExhibit(){ exhibits[currentIndex].SetActive(false); currentIndex=(currentIndex+1)%exhibits.Length ; exhibits[currentIndex].SetActive(true); } } ``` 上述C# 脚本展示了如何编写逻辑控制多个展品之间的轮播转换过程。当玩家按下某个按键或是触碰屏幕特定位置后调用NextExhibit 方法即可达成目的 。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值