what is quay wall'sontheleftwall

708366 人聚集在这个小组
(D.Paradox)
第三方登录:云南省中考英语题分类解题思路与突破(学生)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
云南省中考英语题分类解题思路与突破(学生)
上传于||暂无简介
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩27页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢turn leftandit’sontheriget_百度知道依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题,
感觉他那个传下标的方法太暴力了..应该可以优化
1 //BZOJ 1552
2 //by Cydiater
4 #include &iostream&
5 #include &cstdio&
6 #include &cstring&
7 #include &string&
8 #include &algorithm&
9 #include &queue&
10 #include &map&
11 #include &ctime&
12 #include &cmath&
13 #include &iomanip&
14 #include &cstdlib&
15 using namespace
16 #define ll long long
17 #define up(i,j,n)
for(int i=j;i&=n;i++)
18 #define down(i,j,n)
for(int i=j;i&=n;i--)
19 const int MAXN=1e6+5;
20 const int oo=0x3f3f3f3f;
21 inline int read(){
char ch=getchar();int x=0,f=1;
while(ch&'9'||ch&'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch&='0'&&ch&='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
27 int N,cnt=0,root=0,tol=0,ValuetoNode[MAXN],q[MAXN],head,
28 struct _data{
30 }a[MAXN];
31 struct SplayTree{
int son[2],fa,siz,v,
33 }t[MAXN];
34 namespace solution{
inline int get(int node){return t[t[node].fa].son[1]==}
inline bool cmp(_data x,_data y){return x.v==y.v?x.id&y.id:x.v&y.v;}
inline bool re_cmp(_data x,_data y){return x.id&y.}
void updata(int node){
t[node].siz=1;
if(t[node].son[0])t[node].siz+=t[t[node].son[0]].
if(t[node].son[1])t[node].siz+=t[t[node].son[1]].
void downit(int node){
if(t[node].tag){
int leftson=t[node].son[0],rightson=t[node].son[1];
if(leftson)t[leftson].tag^=1;if(rightson)t[rightson].tag^=1;
swap(t[node].son[0],t[node].son[1]);
t[node].tag=0;
void rotate(int node){
int old=t[node].fa,oldf=t[old].fa,which=get(node);
t[old].son[which]=t[node].son[which^1];t[t[old].son[which]].fa=
t[old].fa=t[node].son[which^1]=t[node].fa=
if(oldf)t[oldf].son[old==t[oldf].son[1]]=
updata(old);updata(node);
void build(int leftt,int rightt,int node,int fa){
if(leftt==rightt){
t[node].v=a[leftt].v;t[node].fa=t[node].son[1]=t[node].son[0]=0;
t[node].siz=1;ValuetoNode[a[leftt].v]=t[node].tag=0;
t[node].tag=0;
t[node].fa=int mid=(leftt+rightt)&&1;
t[node].v=a[mid].v;ValuetoNode[a[mid].v]=
if(mid-1&=leftt){
t[node].son[0]=++build(leftt,mid-1,tol,node);
if(mid+1&=rightt){
t[node].son[1]=++build(mid+1,rightt,tol,node);
updata(node);
void splay(int node,int aim){
for(int(fa=t[node].fa);rotate(node)){
if(node==aim)break;
if(t[node].fa==aim){
rotate(node);
if(t[fa].fa==aim){
rotate(get(node)==get(fa)?fa:node);
rotate(node);
if(t[fa].fa!=aim)rotate(get(node)==get(fa)?fa:node);
if(aim==root)root=
int find(int num){
downit(now);
int tmp=(t[now].son[0]?t[t[now].son[0]].siz:0);
if(num&=tmp)now=t[now].son[0];
if(num==tmp+1)return
num-=(tmp+1);
now=t[now].son[1];
void init(){
a[1].v=a[1].id=1;
up(i,2,N+1){
a[i].v=read();
a[i].id=i;
a[++N].v=a[N].id=N;
sort(a+1,a+N+1,cmp);
up(i,1,N)a[i].v=++//sort by value
sort(a+1,a+N+1,re_cmp);
build(1,N,root,0);
void slove(){
up(i,1,N-2){
int node=ValuetoNode[i];
head=1;tail=0;q[++tail]=int right_siz=0;
int tmp=t[node].
while(tmp!=root){
q[++tail]=
tmp=t[tmp].
}q[++tail]=
while(head&=tail){
tmp=q[tail--];
downit(tmp);
splay(node,root);right_siz=t[t[root].son[0]].siz+2;
printf("%d",right_siz-2);if(i!=N-2)printf(" ");
int leftt=find(i),rightt=find(right_siz);
splay(leftt,root);splay(rightt,t[root].son[1]);
int Son=t[rightt].son[0];
t[Son].tag^=1;
144 int main(){
//freopen("input.in","r",stdin);
using namespace
阅读(...) 评论()

我要回帖

更多关于 mac soncwall 的文章

 

随机推荐