問了yxz後做的。。。
這個是我一般寫線段樹的方法,才覺得感覺有點麻煩,還是yxz的寫法安逸些
#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="typedef
long
long ll;
const ll maxn=5e5+5;
int n,m;
int b[maxn];
struct aaa
;aaa tree[maxn<<2];
void build(int
id,int l,int r)
int mid=l+r>>1;
build(id
<<1,l,mid);
build(id
<<1|1,mid+1,r);
tree[id].min=min(tree[id
<<1].min,tree[id
<<1|1].min);
}void pushup(int
id)void pushdown(int
id)void add(int
id,int l,int r,int v)
if(tree[id].l==tree[id].r)//不能計算答案的區間已經過濾掉了,現在只用計算每個答案了
}pushdown(id);
int mid=tree[id].l+tree[id].r>>1;
if(r<=mid)add(id
<<1,l,r,v);
else
if(l>mid)add(id
<<1|1,l,r,v);
else
pushup(id);
}ll query(int
id,int ql,int qr)
}void print()//列印出線段樹
else }}
}
yxz的寫法
#include"bits/stdc++.h"
using namespace std;
typedef
long
long ll;
const ll maxn=1e5+5;
int b[maxn];
int lazy[maxn<<2]; //用來記錄對答案的貢獻
int mi[maxn<<2],sum[maxn<<2];
int n,m;
void build(int
id,int l,int r)
int mid=l+r>>1;
build(id
<<1,l,mid);
build(id
<<1|1,mid+1,r);
mi[id]=min(mi[id
<<1],mi[id
<<1|1]);
}void pushdown(int
id)void pushup(int
id)void add(int
id,int l,int r,int ql,int qr,int v)
if(l==r) //如果到了最底層,就計算答案
}pushdown(id);
int mid=l+r>>1;
if(ql<=mid)add(id
<<1,l,mid,ql,qr,v);
if(qr>=mid+1)add(id
<<1|1,mid+1,r,ql,qr,v);
pushup(id);
}int query(int
id,int l,int r,int ql,int qr)
int main()
else }}
}
2019杭電多校第二場
今天也是一條鹹魚orz 場上三題 e,j,k e everything is generated in equal probability 題解 乙個長度為n的排列的逆序期望為c n,2 2 因為每一對下標的貢獻都是1 2.然後設dp i dp i dp i 為長度為i ii的隨機排列的culcul...
2019杭電多校第二場
給定乙個 n 從 1,n 中等概率取出乙個數,再等概率生成乙個 n 的全排列,再計算這個全排列的函式值,求這個函式值的期望。函式表達為輸入乙個全排列,計算其逆序數,再等概率取出乙個子串行 可以是空,可以是原序列 遞迴計算該子串行的函式值,累加返回。include using namespace st...
2019 杭電多校第二場 string
題意 找到所有的回文串滿足它的前一半也是回文串。思路 回文自動機 樹上倍增 我們要處理兩件事情,第一件是每種回文串出現了多少次。我們回想回文自動機的構造過程,發現fail指標只會由標號大的指向標號小的。這樣我們只需要標號從大到小遍歷即可處理出每種回文串出現的次數。第二件是倍增的寫法,倍增是不需要初始...