抓夢腳的一天。。。
給你乙個長為n 的序列:a1; a2; : : : ; an
你需完成q 個操作,操作分兩種:
• modify l r d 表示將l 到r 這個區間的數加上d
• query p 表示詢問p 這個位置的值
input
第一行乙個整數n。
第二行n 個整數表示a1; a2; : : : ; an。
第三行乙個整數q。
接下來q 行,每行乙個操作。
output
對於每個詢問操作,輸出結果。
#include#include#include#includeusing namespace std;
const int maxn=400005;
int n,q;
int a[maxn],tag[maxn],f[maxn];
bool flag[maxn];
void update(int o)
void build(int o,int lf,int rg)
int mid=(lf+rg)>>1;
build(o*2,lf,mid);
build(o*2+1,mid+1,rg);
update(o);
}void push_down(int o,int lf,int rg)
}void modify(int o,int lf,int rg,int l,int r,int de)
push_down(o,lf,rg);
int mid=(lf+rg)>>1;
if (l<=mid)
modify(o*2,lf,mid,l,r,de);
if (r>mid)
modify(o*2+1,mid+1,rg,l,r,de);
update(o);
}int query(int o,int lf,int rg,const int l,const int r)
int main()
if (s1[0]=='q')
}return 0;}/*
31 2 3
3query 2
modify 1 3 -2
query 2
*/
給你乙個序列,需要你執行兩種操作:
• modify l r a b 將區間[l; r] 中每個數ai 修改為aai + b。
• query l r 詢問區間[l; r] 中所有數的和,輸出和對109 + 7 取模的結果。
input
第1 行,乙個整數n,表示序列長度。
第2 行,有n 個整數:a1; a2; : : : ; an 表示序列。
接下來1 行,乙個整數q,表示詢問數。
接下來q 行,每行乙個操作。
output
對於每個詢問,輸出結果。
#include#include#include#includeusing namespace std;
const int mod=1e9+7;
const int maxn=4000005;
long long tagadd[maxn],tagmul[maxn],a[maxn],f[maxn];
bool flag[maxn];
int n,q;
void update(int o)
void build(int o,int lf,int rg)
int mid=(lf+rg)>>1;
build(o*2,lf,mid);
build(o*2+1,mid+1,rg);
update(o);
}void push_down(int o,int lf,int rg)
}void modify(int o,int lf,int rg,const int l,const int r,long long ch,long long he)
push_down(o,lf,rg);
int mid=(lf+rg)>>1;
if (l<=mid)
modify(o*2,lf,mid,l,r,ch,he);
if (r>mid)
modify(o*2+1,mid+1,rg,l,r,ch,he);
update(o);
}long long query(int o,int lf,int rg,const int l,const int r)
int readint()
while(xy!=' '&&xy!='\n')
return cc*pd;
}long long readlong()
while(xy!=' '&&xy!='\n')
return cc*pd;
}int main()
for (int i=1;i<=maxn-1;i++)
tagmul[i]=1;
build(1,1,n);
q=readint();
for (int i=1;i<=q;i++)
if (s1[0]=='m')
}return 0;}/*
31 2 3
3query 1 3
modify 2 3 2 3
query 1 3
*/
給你乙個長度為n 的序列,有m 個操作,操作有兩種型別,如下所示:
• d pos 表示刪除位置為pos 的數。
• q pos 表示詢問位置為pos 的數是什麼。
input
第1 行,兩個整數n;m;
第2 行,n 個整數:a1; a2; : : : ; an 表示初始序列;
接下來m 行,每行是上面兩種操作之一。
output
對於每個詢問,輸出其對應結果。
#include#include#include#includeusing namespace std;
const int n=400005;
int val[n],fa[n],n,idc,a[n],son[n][2],size[n],root;
char s1[15];
void update(int o)
int build(int f,int o,int l,int r)
void init(int o)
void rotate(int o,int d)
void splay(int nd,int top=0)
else
} }
}int find(int pos)
else if(lf<=pos-2)
else return s;
}} void del(int pos)
int readint()
while(xy!=' '&&xy!='\n')
return cc*pd;
}long long readlong()
while(xy!=' '&&xy!='\n')
return cc*pd;
}int main()
if(s1[0]=='d')
}
return 0;
}
讀入優化真的跑的飛快
splay 文藝平衡樹 資料結構
題目大意 略 splay維護區間翻轉裸題,為了減少不必要的麻煩,多插入兩個點,分別是0和n 1 每次找區間的第k個值,就在splay上二分即可 順便學了一下splay的完美建樹,而且splay有一些小函式可以巨集定義或者用inline,跑得飛快 最後跑一遍中序遍歷即可 1 include 2 inc...
資料結構 Splay伸展樹 普通平衡樹
題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入 第一...
資料結構入門6 文藝平衡樹(Splay)
早就聽說 splay 就是不管幹什麼都splay一下就可以了,但是聽說傻可開腦洞打 打了250行,驚恐。於是先學treap結果沒想到一除錯就搞了三個月。但是其實寫過treap再學splay就相對容易一些了。那就先學只有區間翻轉的文藝平衡樹。一開始一直弄不懂它的翻轉操作,感覺很迷。但是其實和treap...