1. 程式人生 > >CodeVS第二次月賽

CodeVS第二次月賽

傳送門

T1 TTY loves numbers

題目大意

給定一個模數m,構造一個最小01串,使其mod m=0
長度為len的01串滿足,從第1位到第i位都為1,第i+1到第len位都為0 (1<=i<=len)

題解

11111...11110len+10len1+...101

10len19
根據尤拉定理,10ϕ(m)1(modm)
要求10與m互質,那麼我們假設m為1e7以內的最大素數10999997
所以長度不超過1e7,一定有解不存在輸出’Impossible’的情況
所以,我們從小到大構造全是1的串,如果能整除就直接輸出,
如果不能找到之前與其取模之後相等的數做差即為答案
var
x:array[0..11000005]of longint; i,j,k:longint; m,ans,len:longint; begin readln(m); ans:=1; len:=1; for i:=1 to 100000000 do begin if ans mod m=0 then begin for j:=1 to len do write(1); writeln; halt; end else if x[ans mod m]<>0 then begin for j:=1 to len-x[ans mod m] do
write(1); for j:=1 to x[ans mod m] do write(0); writeln; halt; end else x[ans mod m]:=len; inc(len); ans:=(ans*10+1) mod m; end; end.

T2 TTY Plants Sunflowers

題目大意

給你一棵n個點n-1條邊的無根樹和每個點的權值,詢問任意兩點間路線的LIS值

題解

回顧O(nlogn)的LIS,每次修改的是ans以及維護的長度為i的LIS結尾的最小值,dfs動態維護陣列和ans就好了,離線處理處任意兩點的答案
O

(n2logn+m)

var
 w:array[0..8000,1..2]of longint;
 ans:array[0..2005,0..2005]of longint;
 d,x,y:array[0..2005]of longint;
 i,j,k:longint;
 n,m,len,a,b,anss:longint;
procedure init(a,b:longint);
begin
 w[len,1]:=b;
 if w[a,2]=0
 then w[a,2]:=len else w[w[a,1],2]:=len;
 w[a,1]:=len; inc(len);
end;

function find(a:longint):longint;
var l,r,mid:longint;
begin
 l:=1; r:=anss;
 while l<r do
  begin
   mid:=(l+r)>>1;
   if a<d[mid]
   then r:=mid
   else l:=mid+1;
  end;
 exit(l);
end;

procedure dfs(a,b:longint);
var tt,temp,e,f,g:longint;
begin
 y[a]:=1;
 if x[a]>d[anss]
 then begin inc(anss); d[anss]:=x[a]; e:=anss; f:=0; g:=-1; end
 else begin temp:=find(x[a]); e:=temp; f:=d[e]; g:=0; d[e]:=x[a]; end;
 ans[b,a]:=anss;
 tt:=w[a,2];
 while tt<>0 do
  begin
   if y[w[tt,1]]=0 then begin
    dfs(w[tt,1],b);
   end;
   tt:=w[tt,2];
  end;
 d[e]:=f; inc(anss,g);
end;

begin
 readln(n); len:=n+1;
 for i:=1 to n-1 do
  begin readln(a,b); init(a,b); init(b,a); end;
 for i:=1 to n do
  read(x[i]);
 for i:=1 to n do begin
  fillchar(y,sizeof(y),0);
  fillchar(d,sizeof(d),0);
  anss:=0;
  dfs(i,i);
 end;
 readln(m);
 for i:=1 to m do
  begin
   readln(a,b);
   writeln(ans[a,b]);
  end;
end.

T3 TTY Saves Da’shgua

題目大意

給出一個序列,進行如下3個操作
1.Ia[i]x
2.[L,R]a[i],ln(a[i])
3.[L,R]

題解

[BZOJ3211] 花神遊歷各國/[BZOJ3038] 上帝造題的七分鐘2
ln(a[i])40,ln(0)=0,沒有意義,所以我們對於操作2當某區間和為0時,不繼續向下修改

var
 x:array[0..100000]of longint;
 w:array[0..600000,1..3]of int64;
 i,j,k:longint;
 n,m:longint;
 a,b,c:longint;
procedure build(a,l,r:longint);
var mid:longint;
begin
 w[a,1]:=l; w[a,2]:=r; 
 if l=r 
 then begin w[a,3]:=x[l]; exit; end;
 mid:=(l+r)>>1;
 build(a*2,l,mid); build(a*2+1,mid+1,r);
 w[a,3]:=w[a*2,3]+w[a*2+1,3];
end;

procedure update1(a,b,c:longint);
var mid:longint;
begin
 if (w[a,1]=w[a,2])//and(w[a,1]=b)
 then begin w[a,3]:=c; exit; end;
 mid:=(w[a,1]+w[a,2])>>1;
 if b<=mid
 then update1(a*2,b,c)
 else update1(a*2+1,b,c);
 w[a,3]:=w[a*2,3]+w[a*2+1,3];
end;

procedure update2(a,l,r:longint);
var mid:longint;
begin
 if w[a,3]=0 then exit;
 if (w[a,1]=w[a,2])
 then begin w[a,3]:=trunc(ln(w[a,3])); exit; end;
 mid:=(w[a,1]+w[a,2])>>1;
 if r<=mid then update2(a*2,l,r) else
 if l>mid then update2(a*2+1,l,r) 
 else begin update2(a*2,l,mid); update2(a*2+1,mid+1,r); end;
 w[a,3]:=w[a*2,3]+w[a*2+1,3];
end;

function query(a,l,r:longint):int64;
var mid:longint;
begin
 if (w[a,1]=l)and(w[a,2]=r)
 then exit(w[a,3]);
 mid:=(w[a,1]+w[a,2])>>1;
 if r<=mid then exit(query(a*2,l,r)) else
 if l>mid then exit(query(a*2+1,l,r)) 
 else exit(query(a*2,l,mid)+query(a*2+1,mid+1,r));
end;

begin
 readln(n,m);
 for i:=1 to n do 
  read(x[i]);
 build(1,1,n);
 for i:=1 to m do
  begin
   readln(a,b,c);
   case a of
   1:update1(1,b,c);
   2:update2(1,b,c);
   3:writeln(query(1,b,c));
   end;
  end;
end.