126

(12 ответов, оставленных в OlympNews)

Расскажи пожалуйста как на нём зарегистрироваться,а то я прошлый Гугл Джам так и пропустил big_smilewink
Поподробнее о нём,и если можешь передай опыт участвия на нём smile

127

(6 ответов, оставленных в Algo)

Предлагаю,отписывать где нибудь интересующие всех алгоритмы,какие нибудь необычные,или очень полезные,и опубликовывать их на сайте для повышения кол-ва алгоритмов,тогда этот сайт действительно станет великолепным wink

128

(12 ответов, оставленных в Algo)

f[r++]=make_pair(a[i+1].y,fc);
   while(r-l>2 && lesss(f[r-3],f[r-2],f[r-1])) { f[r-2]=f[r-1]; r--; } 

Вот этими строчками мы добиваемся что бы L и R были оптимальны.
Здесь мы что делаем,сами точки (f(i).x,f(i).y) представляются как бы на плоскости,
и мы уменьшаем R пока заведомо известно что данная точка (f(R).x,f(R).y) не даст оптимума,то есть она будет лишняя,поэтому мы её просто убираем,
точно так же делается и при построении выпуклой оболочки,когда у нас идёт неверный поворот,то мы удаляем лишнюю точку как и здесь.
(

bool lesss(vll a,vll b,vll c) {
 return ((a.y-b.y)*(b.x-c.x)<=(b.y-c.y)*(a.x-b.x));
}

Эта процедура определяет лишняя она или нет.
)
Поэтому у нас будет сложность ~~О(Н) .....:/

129

(12 ответов, оставленных в Algo)

Нет,ну во-первых не обязан ты писать за О(Н),можешь и за О(Нлог(Н)),сильно не повлияет.
Во-вторых они это делают так,
пусть ANS(i) это ответы для первых I точек,X(i), Y(i) - размеры блоков.
Тогда что мы делаем на каждом шаге
представляем как бы точки вида - (Y(i),ANS(i))

f[(n++)-n]=make_pair(a[0].y,0);
......make_pair(a[i+1].y,fc)

Вначале это ANS = 0, Y(0)
Далее это будет Y(i), ANS(i)
Теперь на каждый момент I, мы будем иметь границу (L,R) .
На каждом шаге когда мы хотим посчитать ANS(i), мы бегаем только по J = L..R .
Так же мы на каждом шаге двигаем эти (L,R), что бы поддерживать оптимальность.
Их мы двигаем так.
L = максимальному оптимальному J на данный момент I.
R = двигаем вниз пока ответ хуже чем надо.
И того в итоге мы сделаем ~~O(N) шагов ...
Вроде это видно из CODE.

130

(12 ответов, оставленных в Algo)

то есть я так понял у тебя найти максимальное в промежутке ???? если да,то блина просто структуру заведи,что бы за О(1) искать минимальное на промежутке .. если не так понял то извини . smile

131

(12 ответов, оставленных в Algo)

Ну блин ,... у тебя полное динамика понятное дело .
Во первых ! Для начала ускорение,это избавиться от ненужного вначале ..
то есть если есть (X1,Y1),(X2,Y2) то нам не надо использовать (X1,Y1), если (X2>=X1 && Y2>=Y1) ===>
если есть (5,4) и (6,4) то (5,4) можно удалить спокойно так как на ответ это не влияет,(6,4) поглощает (5,4) big_smile

Ну а далее эта динамика только она не бегает по всем 1<=j<=i .. она бегает по заведомо выбранным оптимальным ans(j)...

#include<algorithm>
#include<iostream>
using namespace std;

#define forr(i,x,y) for(int i=(int)(x); i<(int)(y); i++)
#define mem(a,b) memset(a,b,sizeof(a))
#define x first
#define y second

typedef pair<long long,long long> vll;

pair<int,int> a[50010];
vll f[50010];
int N,n=0,l=0,r=1;
long long fc=0,w=0;

bool compare(pair<int,int> a,pair<int,int> b) {
 if(a.x<b.x) return true;
 if(a.x>b.x) return false;
 if(a.y<b.y) return true;
 return false;
}

bool lesss(vll a,vll b,vll c) {
 return ((a.y-b.y)*(b.x-c.x)<=(b.y-c.y)*(a.x-b.x));
}

int main() {
 freopen("acquire.in","r",stdin);
 freopen("acquire.out","w",stdout);
 scanf("%d",&N);
 mem(a,0); mem(f,0); 
 forr(i,0,N) scanf("%d %d",&a[i].x,&a[i].y); 
 sort(a,a+N,compare);
 forr(i,0,N) { n++;
  while(n && a[i].x>=a[n-1].x && a[i].y>=a[n-1].y) n--;
  a[n]=a[i];
 }
 f[(n++)-n]=make_pair(a[0].y,0);
 forr(i,0,n) { fc=-1;
  forr(j,l,r) {
   w=f[j].x*a[i].x+f[j].y;
   if(w<fc || fc<0) { fc=w; l=j; } else break;
  }
  if(i<n-1) {
   f[r++]=make_pair(a[i+1].y,fc);
   while(r-l>2 && lesss(f[r-3],f[r-2],f[r-1])) { f[r-2]=f[r-1]; r--; } 
  } 
 }
 cout<<fc; 
}

Вот мой CODE tongue

132

(6 ответов, оставленных в Algo)

здесь в форумах многие писались про массив суффиксов,
можно ли написать как искать lcp двух суффиксов за O(log(LEN)) и использовании O(LEN) памяти,а то я только умею как при помощи O(LENlog(LEN)) памяти.

133

(9 ответов, оставленных в Problems)

Да уж smile
Я просто не то умножил,переборщил !
Ну думаю можно наверняка за O(Nlog(N)) или O(Nsqrt(N)) .. Нужно поискать поглубже smile

134

(9 ответов, оставленных в Problems)

даже если под это условие что подпоследовательности , то нужна длинка что никак вроде не успеет .
Ну а так для ограничений поменьше самое простое это динамика за O(NxM) big_smile

135

(12 ответов, оставленных в Algo)

Дело в том , что там выпуклая используется не поэтому !
Просто во время просчёта динамики нам нужно быстро находить оптимум.
Если представить точки динамики как функцию,то нужно найти наиболее выгодную точку,что бы получить наилучший ответ .
А это делается с помощью пару строк из алгоритма выпуклой оболочки,где мы сравниваем три подряд точки и выпихиваем среднюю если не выгодно ! Так как каждая точка будет использоваться ровно один раз,то и получаем асимптотику O(n).

136

(11 ответов, оставленных в Problems)

Ну что за вопросы, неужели кто то должен отлаживать эту программу ? Я так понял у тебя перебор .
Если он не по времени слетел,значит просто ошибка в коде . Как её найти ,протестировать вручную на маленьких тестах,где точно знаешь ответ . Или вот как .
Генерируешь такие тесты, что бы поле 100% можно было замостить данными фигурами,и тогда если у тебя выдаст ответ "NO" то ошибку ты быстро найдёшь,если наоборот у тебя выдаёт "YES" где надо "NO", то подумай ;D

137

(4 ответов, оставленных в Problems)

кстате smile я тебя знаю smile  ты вроде Madiyar_Tktl big_smile
а я на acm.mipt.ru                             WsemirZ

код кидаю прямо сюда
да и вообще суффиксный массив можно написать ещё быстрее чуть ли не с асимптотикой как у дерева..просто почитать надо. я писал самый простой вариант .

решение на Pascal Code.

{$r-,s-,q-,i-,o+}
const mn=200004;
type dataMass = array[-1..mn]of longint;
var a,b,c,ind,indind,aa,bb : dataMass;
 i,st,k,res,resx,resy,cres : longint;
 alcp,blcp : array[1..20]of dataMass;
 ch : char;

procedure sort(n : longint);
 var i : longint;

 procedure radixsort(var a,b : dataMass);
  var i : longint;
  begin
   fillchar(c,sizeof(c),0);
   for i:=1 to n do inc(c[a[i]]);
   for i:=1 to mn do c[i]:=c[i]+c[i-1];
   for i:=1 to n do begin
    inc(c[a[i]-1]);
    aa[c[a[i]-1]]:=a[i];
    bb[c[a[i]-1]]:=b[i];
    indind[c[a[i]-1]]:=ind[i];
   end;
   for i:=1 to n do begin
    a[i]:=aa[i];
    b[i]:=bb[i];
    ind[i]:=indind[i];
   end;
  end;

 begin
  for i:=1 to n do ind[i]:=i;
  radixsort(b,a);
  radixsort(a,b);
 end;

function find(x,y,st,k : longint): longint;
 var res : longint;
 begin
  res:=0;
  repeat
   if y+st*2+ord(st=0)<a[0]+2 then
   if (alcp[k][y]=alcp[k][x]) and (blcp[k][y]=blcp[k][x]) then begin
    inc(res,st*2+ord(st=0));
    inc(x,st*2+ord(st=0));
    inc(y,st*2+ord(st=0));
   end;
   dec(k);
   st:=st shr 1;
  until k=0;
  find:=res;
 end;

begin
 {assign(input,'input.txt');
 reset(input);
 assign(output,'output.txt');
 rewrite(output);}
 fillchar(a,sizeof(a),0);
 fillchar(b,sizeof(b),0);
 fillchar(ind,sizeof(ind),0);
 while not eoln do begin
  read(ch);
  inc(a[0]);
  a[a[0]]:=ord(ch);
  b[a[0]]:=ord(ch);
 end;
 readln;
 inc(a[0]);
 a[a[0]]:=222;
 b[a[0]]:=222;
 b[0]:=a[0]+1;
 while not eoln do begin
  read(ch);
  inc(a[0]);
  a[a[0]]:=ord(ch);
  b[a[0]]:=ord(ch);
 end;
 st:=0;
 k:=0;
 repeat
  inc(k);
  alcp[k]:=a;
  blcp[k]:=b;
  sort(a[0]);
  if st>=a[0] then break;
  st:=st*2+ord(st=0);
  c[ind[1]]:=1;
  for i:=2 to a[0] do c[ind[i]]:=c[ind[i-1]]+ord((a[i]<>a[i-1]) or (b[i]<>b[i-1]));
  for i:=1 to a[0] do begin
   a[i]:=c[i];
   b[i]:=0;
   if i+st<=a[0] then b[i]:=c[i+st];
  end;
 until false;
 res:=0;
 resx:=0;
 resy:=0;
 for i:=2 to a[0] do
 if (ind[i-1]>=b[0]) and (ind[i]<b[0]) then begin
  cres:=find(ind[i],ind[i-1],st,k);
  if cres>res then begin res:=cres; resx:=ind[i]-1; resy:=ind[i-1]-b[0]; end;
 end else
 if (ind[i-1]<b[0]) and (ind[i]>=b[0]) then begin
  cres:=find(ind[i],ind[i-1],st,k);
  if cres>res then begin res:=cres; resx:=ind[i-1]-1; resy:=ind[i]-b[0]; end;
 end;
 write(res,' ',resx,' ',resy);
 {close(input);
 close(output);}
end.

138

(4 ответов, оставленных в Problems)

зачем писать тяжко , когда можно проще и успевает. я тоже писал суффиксный массив и нормально и быстро.