Расскажи пожалуйста как на нём зарегистрироваться,а то я прошлый Гугл Джам так и пропустил
Поподробнее о нём,и если можешь передай опыт участвия на нём
126 2009-07-23 23:49:40
Re: Google Code Jam 2009 (12 ответов, оставленных в OlympNews)
127 2009-07-19 23:13:40
Re: Суффиксный массив (6 ответов, оставленных в Algo)
Предлагаю,отписывать где нибудь интересующие всех алгоритмы,какие нибудь необычные,или очень полезные,и опубликовывать их на сайте для повышения кол-ва алгоритмов,тогда этот сайт действительно станет великолепным
128 2009-07-18 22:57:48
Re: Динамика + Выпуклая Оболочка (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 2009-07-18 22:04:43
Re: Динамика + Выпуклая Оболочка (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 2009-07-18 21:31:53
Re: Динамика + Выпуклая Оболочка (12 ответов, оставленных в Algo)
то есть я так понял у тебя найти максимальное в промежутке ???? если да,то блина просто структуру заведи,что бы за О(1) искать минимальное на промежутке .. если не так понял то извини .
131 2009-07-18 20:50:27
Re: Динамика + Выпуклая Оболочка (12 ответов, оставленных в Algo)
Ну блин ,... у тебя полное динамика понятное дело .
Во первых ! Для начала ускорение,это избавиться от ненужного вначале ..
то есть если есть (X1,Y1),(X2,Y2) то нам не надо использовать (X1,Y1), если (X2>=X1 && Y2>=Y1) ===>
если есть (5,4) и (6,4) то (5,4) можно удалить спокойно так как на ответ это не влияет,(6,4) поглощает (5,4)
Ну а далее эта динамика только она не бегает по всем 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
132 2009-07-18 15:59:28
Тема: Суффиксный массив (6 ответов, оставленных в Algo)
здесь в форумах многие писались про массив суффиксов,
можно ли написать как искать lcp двух суффиксов за O(log(LEN)) и использовании O(LEN) памяти,а то я только умею как при помощи O(LENlog(LEN)) памяти.
133 2009-07-17 21:50:21
Re: Поиск подстрок в строке (9 ответов, оставленных в Problems)
Да уж
Я просто не то умножил,переборщил !
Ну думаю можно наверняка за O(Nlog(N)) или O(Nsqrt(N)) .. Нужно поискать поглубже
134 2009-07-17 13:16:08
Re: Поиск подстрок в строке (9 ответов, оставленных в Problems)
даже если под это условие что подпоследовательности , то нужна длинка что никак вроде не успеет .
Ну а так для ограничений поменьше самое простое это динамика за O(NxM)
135 2009-07-12 21:17:04
Re: Динамика + Выпуклая Оболочка (12 ответов, оставленных в Algo)
Дело в том , что там выпуклая используется не поэтому !
Просто во время просчёта динамики нам нужно быстро находить оптимум.
Если представить точки динамики как функцию,то нужно найти наиболее выгодную точку,что бы получить наилучший ответ .
А это делается с помощью пару строк из алгоритма выпуклой оболочки,где мы сравниваем три подряд точки и выпихиваем среднюю если не выгодно ! Так как каждая точка будет использоваться ровно один раз,то и получаем асимптотику O(n).
136 2009-06-25 13:10:12
Re: Задачка с www.acmp.ru (# ) (11 ответов, оставленных в Problems)
Ну что за вопросы, неужели кто то должен отлаживать эту программу ? Я так понял у тебя перебор .
Если он не по времени слетел,значит просто ошибка в коде . Как её найти ,протестировать вручную на маленьких тестах,где точно знаешь ответ . Или вот как .
Генерируешь такие тесты, что бы поле 100% можно было замостить данными фигурами,и тогда если у тебя выдаст ответ "NO" то ошибку ты быстро найдёшь,если наоборот у тебя выдаёт "YES" где надо "NO", то подумай ;D
137 2009-06-23 11:38:02
Re: zadachka s acm.mipt.ru (145. Antiplagiat II) (4 ответов, оставленных в Problems)
кстате я тебя знаю ты вроде Madiyar_Tktl
а я на 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 2009-06-22 20:53:17
Re: zadachka s acm.mipt.ru (145. Antiplagiat II) (4 ответов, оставленных в Problems)
зачем писать тяжко , когда можно проще и успевает. я тоже писал суффиксный массив и нормально и быстро.