青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

這個題目是Sherlock推薦我做的。
題目意思是給一個長度為n(n <= 100000)的序列,里面的數滿足1 <= a[i] <= n。要找一個最長的連續子串,使得這個子串是1..k的一個排列。

昨天晚上mmd想了個n^(3/2)的算法,今天Sherlock想了個nlogn的算法。我一直在考慮有沒有O(n)的算法。我覺得應該有的。
今天晚上吃飯的時候忽然想出來了。回來寫了果然AC。

下面是我的算法:
注意到滿足題目要求的序列必有如下性質:
1。最大值等于長度
2。必含1
3。序列和為k * (k + 1) / 2
4。序列內元素不重復
如果一個序列同時滿足性質3,4,那么一定符合題目要求。
于是如果做了O(n)的預處理,可以用O(1)的時間驗證某序列是否滿足題目要求。
然后我的算法就順理成章了:
1。預處理s[i],為序列的部分和
2。預處理rl[i],為從i開始往右,最長的不重復序列的末端的下標
3。預處理m[i],為從i開始,到i右邊的第一個1(或者最右端),這一段數的最大值。
4。枚舉左端點lp,則lp到其右邊的第一個1(或者最右端)中的最大值為m[lp]。把m[lp]作為序列長度,則序列的右端點為lp + m[lp] - 1。利用s[i]和rl[i]數組可以驗證這段序列是否滿足題目要求,若滿足,就更新最優解。
5。把輸入序列反過來,重復步驟1-4。
以上每步的時間復雜度都是O(n),故算法總的時間復雜度也是O(n)。

下面是我的代碼

/*************************************************************************
Author: WHU_GCC
Created Time: 2008-1-4 18:06:14
File Name: spoj744.cpp
Description: 
***********************************************************************
*/

#include 
<iostream>
using namespace std;

#define out(x) (cout << #x << ": " << x << endl)
typedef 
long long int64;
const int maxint = 0x7FFFFFFF;
const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
template 
<class T> void show(T a, int n) for (int i = 0; i < n; ++i) cout << a[i] << ' '; cout << endl; }
template 
<class T> void show(T a, int r, int l) for (int i = 0; i < r; ++i) show(a[i], l); cout << endl; }

const int maxn = 100010;

int n;
int a[maxn];
int s[maxn];
int rl[maxn];
int hash[maxn];
int m[maxn];

int calc()
{
    s[
0= 0;
    
for (int i = 1; i <= n; i++)
        s[i] 
= a[i] + s[i - 1];

    memset(hash, 
0sizeof(hash));
    
for (int i = 1, j = 1; i <= n; i++)
    
{
        
while (j <= n && hash[a[j]] == 0)
            hash[a[j
++]] = 1;
        rl[i] 
= j - 1;
        hash[a[i]] 
= 0;
    }


    
for (int i = n; i >= 1; i--)
        
if (a[i] == 1)
            m[i] 
= 1;
        
else if (i == n)
            m[i] 
= a[i];
        
else
            m[i] 
= max(m[i + 1], a[i]);

    
int ret = 0;
    
for (int i = 1; i <= n; i++)
        
if (rl[i] >= i + m[i] - 1 && s[i + m[i] - 1- s[i - 1== m[i] * (m[i] + 1/ 2)
            ret 
>?= m[i];
    
return ret;
}


int main()
{
    scanf(
"%d"&n);
    
for (int i = 1; i <= n; i++)
        scanf(
"%d"&a[i]);
    
int ans = calc();
    reverse(a 
+ 1, a + n + 1);
    ans 
>?= calc();
    printf(
"%d\n", ans);
    
return 0;
}


posted on 2008-01-04 20:45 Felicia 閱讀(952) 評論(11)  編輯 收藏 引用 所屬分類: 雜題
Comments
  • # re: [雜題]SPOJ744
    wywcgs
    Posted @ 2008-01-04 22:57
    和我的想法很像,呵呵,緣分阿  回復  更多評論   
  • # re: [雜題]SPOJ744
    Felicia
    Posted @ 2008-01-05 16:10
    嘿嘿,看來我們真是有緣  回復  更多評論   
  • # re: [雜題]SPOJ744[未登錄]
    1
    Posted @ 2008-01-06 12:00
    這樣做如何:
    #define N 10000
    int a[N];
    bool fis[N];
    memset(fis, false, sizeof(fis));
    對于i, 由于1《=a[i] 《= n,所以,如果a[i-1]=a[i]-1,并且
    a[i]的前a[i]-1個元素剛好是1....a[i-1]的最后一個元素,那么a[i],就分設置fis[i] = true ,or false;
    這個做完后,再掃描一次,看看fis[i]為true的i中,哪個a[i]最大。
      回復  更多評論   
  • # re: [雜題]SPOJ744
    Felicia
    Posted @ 2008-01-06 13:52
    感覺你說得不是很清楚
    并且
    a[i]的前a[i]-1個元素剛好是1....a[i-1]的最后一個元素,那么a[i],就分設置fis[i] = true ,or false;

    這兩句是什么意思?
    而且有 N <= 100000,貌似你定義錯了
      回復  更多評論   
  • # re: [雜題]SPOJ744
    2
    Posted @ 2008-01-06 15:21
    #define N 100000
    簡單點定義一個bool數組fis[N];
    如果a[1...n]中存在從1到a[i]連續a[i]個數,那么fis[i] = true;or fis[i] =false;

    那么f[i+1] = (a[i]==a[i+1]-1)&&(fis[i]);

    。  回復  更多評論   
  • # re: [雜題]SPOJ744
    2
    Posted @ 2008-01-06 15:38
    看錯題目了。。。。  回復  更多評論   
  • # re: [雜題]SPOJ744
    Felicia
    Posted @ 2008-01-06 21:30
    暈  回復  更多評論   
  • # re: [雜題]SPOJ744
    richardxx
    Posted @ 2008-01-23 18:57
    嗯,有點難度,好方法,受教了!!  回復  更多評論   
  • # re: [雜題]SPOJ744
    Felicia
    Posted @ 2008-01-23 19:34
    看了你的blog了,真的非常贊!  回復  更多評論   
  • # re: [雜題]SPOJ744
    gnaggnoyil
    Posted @ 2009-03-04 12:29
    Orz wh大牛.  回復  更多評論   
  • # re: [雜題]SPOJ744
    吳豪
    Posted @ 2009-04-29 15:55
    @gnaggnoyil
    .......................  回復  更多評論   
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区免费观看| 亚洲无限乱码一二三四麻| 亚洲欧洲av一区二区三区久久| 国产精品成人免费| 女人香蕉久久**毛片精品| 久久精品国产亚洲一区二区| 欧美一区二区三区的| 久久精品99无色码中文字幕 | 亚洲一区二区三区四区五区黄| 亚洲精品五月天| 亚洲在线一区二区| 欧美一级视频精品观看| 久久精品二区| 欧美国产专区| 亚洲天堂成人在线视频| 久久国产精品久久国产精品| 欧美成人久久| 国产精品私房写真福利视频| 韩国精品久久久999| 亚洲九九精品| 欧美怡红院视频一区二区三区| 久久久久久亚洲精品杨幂换脸 | 一本色道久久综合狠狠躁篇怎么玩 | 亚洲一区欧美一区| 久久久夜色精品亚洲| 亚洲黄页一区| 亚洲欧美成人一区二区在线电影| 久久亚洲精品中文字幕冲田杏梨| 欧美精品色综合| 国产一区二区黄| 妖精视频成人观看www| 久久伊人一区二区| 国产精品99久久久久久有的能看| 久久亚洲不卡| 国产拍揄自揄精品视频麻豆| 亚洲精品久久久久久久久久久久久| 亚洲欧美在线免费| 亚洲国产日韩美| 久久久噜噜噜久久中文字幕色伊伊 | 国产午夜精品视频免费不卡69堂| 亚洲成人在线| 欧美日韩精品一区| 亚洲日本va午夜在线电影| 一区二区三区国产在线| 噜噜噜久久亚洲精品国产品小说| 欧美性猛交xxxx乱大交蜜桃 | 在线高清一区| 香蕉精品999视频一区二区 | 久久精品国产亚洲精品| 国产精品高清免费在线观看| 91久久精品国产91久久性色tv| 欧美诱惑福利视频| 中文有码久久| 欧美三级资源在线| 亚洲一级免费视频| 9色精品在线| 欧美日韩亚洲综合| 999亚洲国产精| 亚洲国产一区二区视频| 美脚丝袜一区二区三区在线观看| 国产一区二区三区在线播放免费观看| 亚洲一区二区四区| 亚洲一二三区视频在线观看| 国产精品麻豆va在线播放| 亚洲欧美电影院| 一区二区三区黄色| 国产精品视频一区二区高潮| 亚洲一区中文| 亚洲欧美日韩国产综合在线| 国产精品久久久久久久电影 | 欧美在线高清| 国内外成人在线视频| 久久亚洲精品一区二区| 亚欧成人在线| 亚洲第一成人在线| 亚洲精品国产精品乱码不99| 欧美日韩免费区域视频在线观看| 亚洲最新色图| 亚洲一区二区三区精品在线观看| 国产精品视频免费| 久久久久久久高潮| 女人天堂亚洲aⅴ在线观看| 亚洲人成高清| 一区二区三区成人| 国产日韩专区| 亚洲第一福利在线观看| 欧美精品日韩精品| 欧美在线91| 欧美国产精品中文字幕| 国产精品99久久久久久宅男| 亚洲——在线| 亚洲国产日日夜夜| 在线一区二区视频| 好吊日精品视频| 亚洲欧洲美洲综合色网| 国产麻豆精品theporn| 欧美成人精品福利| 欧美午夜剧场| 久久裸体艺术| 欧美成年人网| 午夜精彩视频在线观看不卡| 久久精品国产第一区二区三区最新章节| 精品69视频一区二区三区| 亚洲人成在线观看| 国产欧美一区二区色老头| 亚洲国产欧美久久| 国产一区二区三区久久久| 一本色道久久综合亚洲91| 国产一区二区日韩精品欧美精品| 亚洲国产精品久久久久秋霞蜜臀| 国产农村妇女精品一区二区| 亚洲日本黄色| 亚洲国产mv| 欧美一区激情| 午夜精品美女自拍福到在线| 欧美激情91| 欧美大秀在线观看| 国产私拍一区| 亚洲综合精品自拍| 一区二区三区视频免费在线观看| 久久激情一区| 性欧美大战久久久久久久免费观看| 欧美高清在线视频观看不卡| 久久先锋资源| 国外视频精品毛片| 欧美亚洲一区二区在线| 亚洲天堂成人| 欧美精选在线| 亚洲黄色视屏| 99国产精品视频免费观看一公开| 久久久99精品免费观看不卡| 久久精品国产欧美激情| 国产精品任我爽爆在线播放 | 久久精品国产精品| 久久成人18免费观看| 国产精品人人爽人人做我的可爱 | 羞羞答答国产精品www一本| 欧美另类久久久品| 欧美成人r级一区二区三区| 国产一区二区三区无遮挡| 亚洲欧美福利一区二区| 亚洲欧美国产77777| 国产精品系列在线| 西西人体一区二区| 久久久欧美精品| 狠狠做深爱婷婷久久综合一区| 久久国产精品99精品国产| 久久躁狠狠躁夜夜爽| 在线观看不卡av| 欧美成人午夜影院| 亚洲精品专区| 亚洲免费在线电影| 国产欧美日韩在线播放| 久久久水蜜桃av免费网站| 欧美激情久久久久| 亚洲视屏在线播放| 国产农村妇女精品一二区| 久久精品国语| 欧美国产另类| 一区二区三区毛片| 国产精品视频专区| 久久精品九九| 亚洲夫妻自拍| 欧美大色视频| 亚洲午夜视频在线| 国一区二区在线观看| 欧美国产综合视频| 亚洲视频自拍偷拍| 玖玖视频精品| 亚洲一级一区| 国产亚洲精品久久久久动| 久久爱另类一区二区小说| 欧美成人精品一区二区| 亚洲中字在线| 亚洲国产精品va在看黑人| 欧美日韩精品久久| 久久av二区| 99视频日韩| 美女视频网站黄色亚洲| 亚洲天堂网在线观看| 国产一区二区三区直播精品电影| 欧美+亚洲+精品+三区| 亚洲欧美日韩人成在线播放| 奶水喷射视频一区| 午夜精品久久99蜜桃的功能介绍| 激情综合在线| 欧美性猛交xxxx乱大交蜜桃| 久久久久久久久综合| 亚洲一本视频| 亚洲三级免费| 欧美电影资源| 久久久噜噜噜久久中文字幕色伊伊 | 欧美在线欧美在线| 亚洲精品欧美精品| 极品少妇一区二区三区| 国产麻豆精品久久一二三| 欧美精品一区二区精品网| 免费观看欧美在线视频的网站| 欧美一区视频| 校园春色国产精品|