平衡樹的問題,很容易想到中序遍歷
那麼我們給每乙個節點記錄一下中序遍歷中它子樹所在的區間,一次旋轉顯然只會改變兩個節點的值
對於詢問我們用線段樹區間求積就可以了
#pragma gcc optimize("o3")
#pragma g++ optimize("o3")
#include
#include
#include
#define n 200010
#define m 1000000007
#define ll long long
#define mid (l+r>>1)
#define ls l,mid,x<<1
#define rs mid+1,r,x<<1|1
using
namespace
std;
int clk,n,m,l[n],r[n],v[n];
int w[n],wl[n],wr[n],p[n],s[n],rk[n],rt;
int t[n<<2];
inline
void ps(int x)
inline
void dfs(int x)
inline
void build(int l,int r,int x)
build(ls);
build(rs);
t[x]=((ll)t[x<<1]*t[x<<1|1])%m;
}inline
void update(int l,int r,int x,int p,int k)
if(p<=mid) update(ls,p,k); else update(rs,p,k);
t[x]=((ll)t[x<<1]*t[x<<1|1])%m;
}inline ll query(int l,int r,int x,int l,int r)
int main()
for(int i=1;i<=n;++i) if(!p[i]) rt=i;
dfs(rt);
build(1,n,1);
for(int o,x,y;m--;) else rt=y;
ps(x); ps(y);
update(1,n,1,rk[x],s[x]);
update(1,n,1,rk[y],s[y]);
} else
if(o&&r[x]) else rt=y;
ps(x); ps(y);
update(1,n,1,rk[x],s[x]);
update(1,n,1,rk[y],s[y]);
}} }
}
命令提示OJ Problem 566
命令提示 執行時限 1000 ms 記憶體限制 256 mb 總提交 251次 通過 57次 題目描述 用過linux的shell的同學都知道,如果敲命令敲了一半,可以按tab鍵進行自動補全 條件是已經敲的字串是字典裡的某個字串字首 當然如果有多個候選項,那麼就不會補全。這種情況下,你多按幾次,sh...
566 重塑矩陣
在matlab中,有乙個非常有用的函式reshape,它可以將乙個矩陣重塑為另乙個大小不同的新矩陣,但保留其原始資料。給出乙個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。如果具有給定引數的reshape...
566 重塑矩陣
在matlab中,有乙個非常有用的函式 reshape,它可以將乙個矩陣重塑為另乙個大小不同的新矩陣,但保留其原始資料。給出乙個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。如果具有給定引數的reshap...