http://codevs.cn/problem/4109/
http://codevs.cn/problem/4110/
http://codevs.cn/problem/4111/
给定一个模数m,构造一个最小01串,使其mod m=0
长度为len的01串满足,从第1位到第i位都为1,第i+1到第len位都为0 (1<=i<=len)
一个11111...111的串的话可以看成10len+10len−1+...101等比数列求和公式可以写成
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.
给你一棵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.
给出一个序列,进行如下3个操作
1. 对于第I个数a[i]变为x
2. 对[L,R]区间内的每一个a[i],变为⌊ln(a[i])⌋
3. 询问[L,R]内的和
[BZOJ3211] 花神游历各国/[BZOJ3038] 上帝造题的七分钟2
⌊ln(a[i])⌋操作最多4次就变为0了 ,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.