日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数糖纸(离散化)

發布時間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数糖纸(离散化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://ac.nowcoder.com/acm/contest/372/D
來源:牛客網

題目描述
可能很多人要吐槽為什么標題不是“救救blabla”了。

怪人PM6喜歡數糖紙,不同的糖紙有不同的顏色,一共有 N 張糖紙,第 i 張糖紙顏色為 Ci ,它們的位置都是固定的。PM6喜歡五彩繽紛的糖紙,所以他不希望有重復的顏色。他有一次機會,可以收集任意一段連續區間內的糖紙。求出PM6最多能收集多少張糖紙。

輸入描述:
第一行一個正整數 N ,表示共有 N 張糖紙。
第二行共有 N 個正整數,第 i 個正整數表示第 i 張糖紙的顏色 Ci
對于20%的數據:1<=N<=100
對于40%的數據:1<=N<=1000
對于100%的數據:1<=N<=1e6,0<=Ci<=1e9
輸出描述:
一個整數表示PM6最多能收集多少張糖紙。
示例1
輸入
復制
5
1 2 2 3 4
輸出
復制
3
說明
PM6可以收集第3到第5張的糖紙,共有三張。
總共有1e9的數據,但是數組卻只有1e6的大小,所以就需要離散化了。其實要是用map的話也可以不用離散化,但是這個題用map的話會超時,只能離散化了。離散化之后,設置兩個指針。如果當前值沒有出現過,就r++,知道當前值之前出現過,然后記錄最大值。這樣之后,在把這一段的值更新為0。
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=1e6+100; int a[maxx],b[maxx]; int vis[maxx]; int n;int main() {while(~scanf("%d",&n)){for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+1+n);int len=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+len,a[i])-b;//離散化for(int i=0;i<=len;i++) vis[i]=0;int l=1,r=1;int ans=0;while(l<=r&&r<=n){while(!vis[a[r]]&&r<=n) {vis[a[r]]=1;r++;}ans=max(ans,r-l);//找到之前出現的值就更新最大值while(vis[a[r]])//這個循環就是將l指針移動到a[r]第一次出現位置的下一個位置{vis[a[l++]]=0;}}printf("%d\n",ans);} }

努力加油a啊,(o)/~

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的数糖纸(离散化)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。