BK Algorithm Club
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.


BK Algorithm Practice Forum
 
Trang ChínhTrang Chính  Latest imagesLatest images  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  

 

 2267. Hoán vị dài nhất NKLP

Go down 
4 posters
Tác giảThông điệp
ldt
dzào năm I
ldt


Tổng số bài gửi : 109
Join date : 25/11/2008

2267. Hoán vị dài nhất NKLP Empty
Bài gửiTiêu đề: 2267. Hoán vị dài nhất NKLP   2267. Hoán vị dài nhất NKLP I_icon_minitime07.12.08 22:38

để xôn lên nào, thấy bài này có vẻ được. Mới đọc, chưa giải.

https://vn.spoj.pl/problems/NKLP/
Về Đầu Trang Go down
o0o.hero.o0o
bắt đầu sự nghiệp đi học
bắt đầu sự nghiệp đi học



Tổng số bài gửi : 20
Join date : 25/11/2008
Age : 34

2267. Hoán vị dài nhất NKLP Empty
Bài gửiTiêu đề: Re: 2267. Hoán vị dài nhất NKLP   2267. Hoán vị dài nhất NKLP I_icon_minitime07.12.08 23:37

bài này em làm thử rồi, nhưng mà chỉ được có 87.5 thôi
không được trọn điểm T_T, ý tưởng là kiếm những số 1 trong dãy, rồi từ đó chạy về 2 bên, rồi đếm thôi ^^
Về Đầu Trang Go down
anhdung
bắt đầu sự nghiệp đi học
bắt đầu sự nghiệp đi học
anhdung


Tổng số bài gửi : 26
Join date : 25/11/2008
Age : 35

2267. Hoán vị dài nhất NKLP Empty
Bài gửiTiêu đề: Re: 2267. Hoán vị dài nhất NKLP   2267. Hoán vị dài nhất NKLP I_icon_minitime07.12.08 23:51

http://ioicamp.net/index.php?pkg=sbm&func=viewrs&sid=7094

hồi đó accepted mà giờ mất code, ioicamp lại ko cho downcode T_T, giờ chả nhớ hồi đó làm j mà acc Smile)
Về Đầu Trang Go down
anhdung
bắt đầu sự nghiệp đi học
bắt đầu sự nghiệp đi học
anhdung


Tổng số bài gửi : 26
Join date : 25/11/2008
Age : 35

2267. Hoán vị dài nhất NKLP Empty
Bài gửiTiêu đề: Re: 2267. Hoán vị dài nhất NKLP   2267. Hoán vị dài nhất NKLP I_icon_minitime07.12.08 23:56

bài giải của KT, xin đc ^^, ai đọc đc hiểu j thì hiểu, hoặc google lại, có thảo luận

"Hoán vị dài nhất" site:ioicamp.net

Code:

const  INP      =      'LPERMUT.inp';
        OUT      =      'LPERMUT.out';

        maxn    =      100007;
        maxc    =      270000;

var    n , nmax :      longint;
        a        :      array[1..maxn+1] of longint;
        d , c    :      array[1..maxc+1] of longint;
        mark    :      array[0..maxn]  of boolean;
        fi , fo  :      text;

function fmax( x , y : longint ) : longint;
begin
    if x > y then fmax := x else fmax := y;
end;

procedure add( val , tt : longint );

    procedure visit( k , l , r : longint );
    var
        mid : longint;
    begin
        repeat
              inc( c[k] );
              d[k] := tt;
              if l = r then exit;

              mid := ( l + r ) shr 1;
              k := k shl 1;
              if ( l <= val )and( val <= mid ) then r := mid
              else
                    begin
                        inc( k ); l := mid + 1;
                    end;
        until false;
    end;

begin
    mark[val] := true;
    visit( 1 , 1 , nmax );
end;

function not_cover : longint;

    procedure visit( k , l , r : longint );
    var
        mid : longint;
    begin
        repeat
              if c[k] = 0 then begin
                  not_cover := l; exit;
              end;

              mid := ( l + r ) shr 1;
              k := k shl 1;
              if c[k] <= mid - l then r := mid
              else
                    begin
                        inc( k ); l := mid + 1;
                    end;
        until false;
    end;

begin
    if c[1] < nmax then visit( 1 , 1 , nmax )
    else not_cover := nmax + 1;
end;

function farthest( val : longint ) : longint;
var
    vt : longint;

    procedure visit( k , l , r : longint );
    var
        mid : longint;
    begin
        if r <= val then begin
            if d[k] > vt then vt := d[k];
            exit;
        end;

        mid := ( l + r ) shr 1;
        if l <= val then visit( k shl 1 , l , mid );
        if mid < val then visit( k shl 1 + 1 , mid + 1 , r );
    end;

begin
    vt := 0;
    visit( 1 , 1 , nmax );
    farthest := vt;
end;

procedure push_out( val : longint );

  procedure visit( k , l , r : longint );
  var
        mid : longint;
  begin
        dec( c[k] );
        if l = r then begin
          d[k] := 0; exit;
        end;

        mid := ( l + r ) shr 1;
        if ( l <= val )and( val <= mid ) then visit( k shl 1 , l , mid )
        else visit( k shl 1 + 1 , mid + 1 , r );

        d[k] := fmax( d[k shl 1] , d[k shl 1 + 1] );
  end;

begin
    mark[val] := false;
    visit( 1 , 1 , nmax );
end;

procedure process;
var
    vt , i , ht , max , val , gh : longint;
begin
    ht  := 0;
    max := 0;
    for i := 1 to n do begin
        if ( i + max > n )or( max = nmax ) then break;

        while not mark[ a[ht+1] ] do begin
              inc( ht );
              add( a[ht] , ht );
        end;

        if mark[1] then begin
          val := not_cover - 1;
          gh  := fmax( a[i] - 1 , max );

          while val > gh do begin
                vt := farthest( val );
                if vt - i + 1 = val then begin
                    max := val; break;
                end
                    else val := a[vt] - 1;
          end;
        end;

        push_out( a[i] );
    end;

    writeln( fo , max );
end;

procedure init;
var
    i : longint;
begin
    a[n+1]  := 0  ;
    mark[0] := true;
    for i := 1 to n do
        if nmax < a[i] then nmax := a[i];
end;

procedure nhapdl;
var
    i : longint;
begin
    read( fi , n );
    for i := 1 to n do read( fi , a[i] );
end;

procedure mofile;
begin
    assign( fi , INP ); reset( fi )  ;
    assign( fo , OUT ); rewrite( fo );
end;

procedure dongfile;
begin
    close( fi ); close( fo );
end;

BEGIN
    mofile  ;
    nhapdl  ;
    init    ;
    process ;
    dongfile;
END.

Về Đầu Trang Go down
duy
bắt đầu sự nghiệp đi học
bắt đầu sự nghiệp đi học



Tổng số bài gửi : 11
Join date : 02/12/2008

2267. Hoán vị dài nhất NKLP Empty
Bài gửiTiêu đề: Re: 2267. Hoán vị dài nhất NKLP   2267. Hoán vị dài nhất NKLP I_icon_minitime08.12.08 13:05

Bài này em làm với độ phức tạp O(n) nhưng chỉ được 93.75.
Mọi người xem giúp đoạn code dưới có gì sai không.
Code:

#include <iostream>
#include <fstream>
#include <cstdio>
#include <memory>
using namespace std;
const int MAX=100010;
      int main()
      {
          int n;
          int x,i,j,s;
          int foot ;
          int best=0;
          int larr[MAX];
          int sum[MAX];
          int pre[MAX];
          memset(larr,0,sizeof (larr));
          memset(sum,0,sizeof (sum));
          memset(pre,0,sizeof (pre));
          foot=1;
          s=0;
          scanf("%d",&n);
          for (i=1;i<=n;i++)
              {
                scanf("%d",&x);
                sum[i]=sum[i-1]+x;
                if (larr[x]==0)
                {
                    larr[x]=i;
                    pre[i]=0;
                }
                else
                    if (larr[x]>0)
                    {
                        pre[i]=larr[x];
                        larr[x]=i;
                    }
                if (pre[i]>=foot)
                    foot=pre[i]+1;
                      s=sum[i]-sum[foot-1];
                      j=(i-foot+1);
                      j=j*(j+1);
                      j=j/2;
                      if (j==s)
                      {
                        if (best<i-foot+1) best=i-foot+1;
                      }
              }
         
          printf("%d",best);
          return 0;
      }

Về Đầu Trang Go down
Sponsored content





2267. Hoán vị dài nhất NKLP Empty
Bài gửiTiêu đề: Re: 2267. Hoán vị dài nhất NKLP   2267. Hoán vị dài nhất NKLP I_icon_minitime

Về Đầu Trang Go down
 
2267. Hoán vị dài nhất NKLP
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
BK Algorithm Club :: Giải bài trực tuyến :: SPOJ-
Chuyển đến