bzoj 3217: ALOEXT
将此神题作为博客园的第一篇文章,至此,数据结构基本学完了(或者说数据结构轮流虐了我一次!)
人生第一道7K代码题!
没什么,就是treap套个trie,然后tle是因为一定要用指针当时p党谁会用那么丑的指针,所以作罢。然后光荣tle(用自己的数据和云神的对拍是没有错的),然后竟然是第一个尝试写此题的p党!
好吧。oi路也算是步入正轨(虽然一开始就必须走在翻盘的路上……noip就不想说了……),那么接下来就重新回归基础,把图论那些东西重新搞好♂搞深♂入♂……
然后来看看3217第一个死掉的p党的代码吧(语言歧视题!)
好多个第一!
const
maxd=;
maxn1=;
maxn2=;
number=;
mm=; var
son:array[..maxn1,..]of longint;
sum,pp:array[..maxn1]of longint;
size,root,left,right,p1,p2,value,fi,se,key:array[..maxn2]of longint;
tot,tot1,tot2,sum1,sum2,n,m,sroot,big1,big2:longint; function new1:longint;
begin
inc(tot);
exit(tot);
end; function new2:longint;
var
i:longint;
begin
if sum1> then begin
i:=pp[sum1];
dec(sum1);
sum[i]:=;
son[i][]:=;
son[i][]:=;
exit(i);
end;
inc(sum2);
exit(sum2);
end; procedure clear(x:longint);
begin
if x= then exit;
inc(sum1);
pp[sum1]:=x;
clear(son[x][]);
clear(son[x][]);
end; function max(x,y:longint):longint;
begin
if x<y then exit(y);
exit(x);
end; procedure swap(var x,y:longint);
var
i:longint;
begin
i:=x;
x:=y;
y:=i;
end; function ask(x,y:longint):longint;
var
ans,i,j:longint;
begin
ans:=;
for i:=maxd downto do begin
if x= then break;
j:=y>>i and ;
if sum[son[x][j xor ]]> then begin
inc(ans,<<i);
j:=j xor ;
end;
x:=son[x][j];
end;
exit(ans);
end; procedure add(var x:longint;y:longint);
var
i,j,t:longint;
begin
if x= then x:=new2;
t:=x;
for i:=maxd downto - do begin
inc(sum[t]);
if i=- then exit;
j:=y>>i and ;
if son[t][j]= then son[t][j]:=new2;
t:=son[t][j];
end;
end; procedure del(var x:longint;h,y:longint);
begin
dec(sum[x]);
if sum[x]= then begin
clear(x);
x:=;
exit;
end;
if h=- then exit;
del(son[x][y>>h and ],h-,y);
end; procedure calc(var x,y:longint;z:longint);
begin
if z>y then begin
if z>x then begin
y:=x;
x:=z;
end
else y:=z;
end;
end; procedure merge(var x:longint;ll,rr:longint);
begin
x:=new2;
sum[x]:=sum[ll]+sum[rr];
if sum[son[ll][]]+sum[son[rr][]]> then merge(son[x][],son[ll][],son[rr][]);
if sum[son[ll][]]+sum[son[rr][]]> then merge(son[x][],son[ll][],son[rr][]);
end; procedure up(x:longint);
begin
if x= then exit;
fi[x]:=fi[left[x]];
se[x]:=se[left[x]];
calc(fi[x],se[x],value[x]);
calc(fi[x],se[x],fi[right[x]]);
calc(fi[x],se[x],se[right[x]]);
size[x]:=size[left[x]]+size[right[x]]+;
end; procedure update(x:longint);
begin
merge(root[x],root[left[x]],root[right[x]]);
add(root[x],value[x]);
up(x);
end; procedure lt(var x:longint);
var
k:longint;
begin
k:=right[x];
right[x]:=left[k];
left[k]:=x;
size[k]:=size[x];
fi[k]:=fi[x];
se[k]:=se[x];
clear(root[k]);
root[k]:=root[x];
update(x);
x:=k;
end; procedure rt(var x:longint);
var
k:longint;
begin
k:=left[x];
left[x]:=right[k];
right[k]:=x;
size[k]:=size[x];
fi[k]:=fi[x];
se[k]:=se[x];
clear(root[k]);
root[k]:=root[x];
update(x);
x:=k;
end; procedure insert(var x:longint;y,z:longint);
begin
if x= then begin
x:=new1;
value[x]:=z;
key[x]:=random(number);
left[x]:=;
right[x]:=;
add(root[x],z);
fi[x]:=z;
se[x]:=;
size[x]:=;
exit;
end;
if y<=size[left[x]]+ then begin
insert(left[x],y,z);
if key[left[x]]>key[x] then rt(x);
end
else begin
insert(right[x],y-size[left[x]]-,z);
if key[right[x]]>key[x] then lt(x);
end;
add(root[x],z);
inc(size[x]);
calc(fi[x],se[x],z);
end; function change(x,y,new:longint):longint;
var
old:longint;
begin
if y=size[left[x]]+ then begin
old:=value[x];
del(root[x],maxd,old);
add(root[x],new);
value[x]:=new;
up(x);
exit(old);
end;
if y<=size[left[x]] then old:=change(left[x],y,new)
else old:=change(right[x],y-size[left[x]]-,new);
del(root[x],maxd,old);
add(root[x],new);
up(x);
exit(old);
end; function find(x,y:longint):longint;
begin
if y=size[left[x]]+ then exit(value[x]);
if y<=size[left[x]] then exit(find(left[x],y))
else exit(find(right[x],y-size[left[x]]-));
end; function delete(var x:longint;y:longint):longint;
var
old:longint;
begin
if y=size[left[x]]+ then begin
old:=value[x];
if left[x]= then x:=right[x]
else
if right[x]= then x:=left[x]
else begin
if key[left[x]]>key[right[x]] then begin
rt(x);
delete(right[x],y-size[left[x]]-);
end
else begin
lt(x);
delete(left[x],y);
end;
del(root[x],maxd,old);
end;
up(x);
exit(old);
end;
if y<=size[left[x]] then old:=delete(left[x],y)
else old:=delete(right[x],y-size[left[x]]-);
del(root[x],maxd,old);
up(x);
exit(old);
end; procedure before(x,l,r:longint);
var
lsum:longint;
begin
if x= then exit;
lsum:=size[left[x]]+;
if r<lsum then before(left[x],l,r)
else
if l>lsum then before(right[x],l-lsum,r-lsum)
else
if (l=) and (r=size[x]) then begin
inc(tot1);
p1[tot1]:=x;
calc(big1,big2,fi[x]);
calc(big1,big2,se[x]);
end
else begin
inc(tot2);
p2[tot2]:=value[x];
calc(big1,big2,value[x]);
if l<lsum then before(left[x],l,lsum-);
if r>lsum then before(right[x],,r-lsum);
end;
end; function query(l,r:longint):longint;
var
ll,rr,mid,ans,i:longint;
begin
tot1:=;
tot2:=;
big1:=;
big2:=;
before(sroot,l,r);
ans:=;
//writeln(big2);
if big2= then exit();
for i:= to tot1 do p1[i]:=root[p1[i]];
for i:= to tot1 do ans:=max(ans,ask(p1[i],big2));
for i:= to tot2 do ans:=max(ans,p2[i] xor big2);
exit(ans);
end; procedure into;
var
i,j:longint;
begin
//randomize;
readln(n,m);
tot:=;
sroot:=;
for i:= to n do begin
read(j);
insert(sroot,i,j);
end;
end; procedure work;
var
last,x,y:longint;
ch:char;
begin
last:=;
readln;
while m> do begin
dec(m);
read(ch);
case ch of
'I':begin
readln(x,y);
//x:=x mod n+;
x:=(x+last mod n) mod n+;
y:=(y+last mod mm) mod mm;
//writeln(x,' ',y);
insert(sroot,x,y);
inc(n);
end;
'C':begin
readln(x,y);
//x:=x mod n+;
x:=(x+last mod n) mod n+;
y:=(y+last mod mm) mod mm;
//writeln(x,' ',y);
change(sroot,x,y);
end;
'D':begin
readln(x);
//x:=x mod n+;
x:=(x+last mod n) mod n+;
//writeln(x);
delete(sroot,x);
dec(n);
end;
'F':begin
readln(x,y);
//x:=x mod n+;
//y:=y mod n+;
x:=(x+last mod n) mod n+;
y:=(y+last mod n) mod n+;
if x>y then swap(x,y);
//writeln(x,' ',y);
last:=query(x,y);
writeln(last);
end;
end;
end;
end; begin
into;
work;
end.
14.12.13……竟然没发现云神比较神奇的build操作(之前还以为慢了呢!)
procedure build(var x:longint;ll,rr:longint);
var
mid,i:longint;
begin
mid:=(ll+rr)>>;
x:=mid;
value[x]:=num[mid];
key[x]:=random(number);
left[x]:=;
right[x]:=;
if ll<mid then begin
build(left[x],ll,mid-);
if key[left[x]]>key[x] then swap(key[left[x]],key[x]);
end;
if rr>mid then begin
build(right[x],mid+,rr);
if key[right[x]]>key[x] then swap(key[right[x]],key[x]);
end;
update(x)
end;
结果还是tle……(搞到数据了……云14s蒟蒻18s……)
bzoj 3217: ALOEXT的更多相关文章
- BZOJ 3217: ALOEXT (块状链表套trie)
第一次写块状链表,发现还挺好写的,但是一点地方写错加上强制在线就会各种姿势WA/TLE/RE爆- 想法就是分块后,在每一个块上维护最大值和次大值,还在每一个块上维护一棵trie树来求异或最大值.散块直 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- 只需两步,rails支持CSV格式导出
一.Controller最上方添加 require 'csv' 二.方法里面添加 format.csv do csv_string = CSV.generate do |csv| csv <&l ...
- 调用bash的时候出现curl command not found
调用bash的时候出现curl command not found 解决办法: apt-get install curl
- Oracle DELETE和TRUNCATE 的区别
语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...
- PLSQL-包函数存储过程
包: 包是PLSQL中多个单元的逻辑组合,他将过程组合在一个包内容,以供用户调用,使用后,不需要程序员频繁的修改程序,可以保持程序的逻辑完整性,对包中的过程重新定义或者编译,以便修改部分功能,从而更好 ...
- Python中一些糟糕的语法!你遇到过吗?还知道那些?
Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言. 其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL ...
- leetcode-前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...
- lintcode50 数组剔除元素后的乘积
数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 您在真实的面试中是 ...
- JAVA基础学习之路(七)对象数组的定义及使用
两种定义方式: 1.动态初始化: 定义并开辟数组:类名称 对象数组名[] = new 类名称[长度] 分布按成:类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度]: 2 ...
- vivado使用感想
寒假学了一学期vivado也没有学出什么名堂:为了调试龙芯的五级流水CPU,今天肝了一下午结果还把vivado给摸清楚了,果然是以目标为导向最能出成绩. vivado开发硬件的流程 写代码 模拟仿真s ...
- DeepLearning - Forard & Backward Propogation
In the previous post I go through basic 1-layer Neural Network with sigmoid activation function, inc ...