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栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- linux (rm指令) 及误删除解决
今天在群里看见这一幕: 看到这儿,我们学习一下 这个RM指令 rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件 ...
- Javascript闭包例子
闭包的概念 内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止.可理解为,闭包就是能够读取其他函数内部变量的函数. 表现形式是:定义在函数内部的函数. function f1() ...
- 基于Docker的UI自动化初探
本文来自网易云社区 前言 一直以来,项目迭代的时间都是比较紧张的,开发加班加点coding,测试加班加点提bug.都说"时间像海绵里的水,挤挤总会有的"(当然这里的"挤挤 ...
- dva框架之redux相关
dva封装了redux,减少很多重复代码比如action reducers 常量等,本文简单介绍dva redux操作流程. 利用官网的一个加减操作小实例来操作: dva所有的redux操作是放在mo ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范
第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...
- Window下部署MySql数据库
官网下载地址:https://dev.mysql.com/downloads/mysql/,MySQL Community(社区版) Server 5.7.21,下载完毕后,解压文件. (1)在mys ...
- python邮件服务-yagmail
下载安装 yagmail import yagmail #链接邮箱服务器 #此处的password是授权码 yag= yagmail.SMTP( user="843092012@qq.c ...
- 从零开始的Python学习Episode 2——运算符与while循环
一.算术运算符 加法:+,减法:-,乘法*,除法/,整除(地板除)//,取余%,乘方**. 二.逻辑运算符 且:and,或:or,非:not 优先级:not>and>or 短路原则: 对 ...
- C++clock()延时循环
函数clock(),返回程序开始执行后所用的系统时间,但是有两个复制问题. 1.clock()返回时间的单位不一定是秒 2.该函数的返回类型在某些系统上可能是Long,也可能是unsigned lon ...
- 【未完】训练赛20190304:KMP+树状数组+线段树+优先队列
头炸了啊,只做出L题,前两天刚看的Shawn zhou的博客学习的,幸亏看了啊,否则就爆零了,发现题目都是经典题,线段树,KMP,我都没看过,最近又在复习考研,真后悔大一大二没好好学习啊,得抽时间好好 ...