目錄各種分治
資料結構
數學,數論
博弈論圖論
網路流字串
其它**不能摺疊,不過就這樣吧。有目錄也還好。
wdm好多。。
可能要下輩子才能全填上✔了。✘✘✘
update:模板不複習,考場兩行淚。
我要是複習millerrabin和快速乘就多十八分了啊tat
不過感謝複習了可持久化trie。
最近才寫了,過了過了。雖然應該忘得差不多了。
旋轉卡殼:經常要找和當前直線平行的直線切在**,注意用底相同,平行線之間高也相同,以及叉積有正負的性質,求叉積。
將dp式子寫成\(y_j=kx_j+b\)的形式,其中\(k\)是與\(i\)有關的係數,\(b\)是要求的\(f_i\)及\(i\)的其他項。
若\(f\)滿足四邊形不等式,則決策單調,有\(p[i][j-1]\leq p[i][j]\leq p[i+1][j]\)或\(p[i-1][j]\leq p[i][j]\leq p[i][j+1]\),可根據需要使用。
具體看這裡。
實際上更大的用處是水過某些dp題...
nmd這東西根本寫不出來的啊。
//6196kb 688ms(308ms 5560kb)
的時候不要寫//#include #include #include #define gc() getchar()
#define maxin 300000
//#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)
typedef long long ll;
const int n=1e5+5,m=2e5+5;
int ans[n];
char in[maxin],*ss=in,*tt=in;
struct node
while(p2<=r) q[p2].ans+=t.query(q[p2].z), tmp[p++]=q[p2++];
for(int i=l; i過。
//2740kb 132ms
////原數列的值,要在樹狀陣列上減掉啊。
#include #include #include //#define gc() getchar()
#define maxin 400000
#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)
typedef long long ll;
const int n=1e5+5,m=n*3;
int a[n],ans[n];
char in[maxin],*ss=in,*tt=in;
struct operation
q[m];
struct bit
inline int query(int p)
inline void clear(int p)
}t;inline int read()
inline char getopt()
void solve(int l,int r,int h,int t)
bool fg=0;
for(int i=h; i<=t; ++i) if(q[i].id)
if(!fg) return;
int m=l+r>>1,t1=0,t2=0;
for(int i=h; i<=t; ++i)
if(q[i].id)
else if(q[i].r<=m) t.add(q[i].l,q[i].k), q1[t1++]=q[i];
else q2[t2++]=q[i];
for(int i=h; i<=t; ++i) if(!q[i].id&&q[i].r<=m) t.clear(q[i].l);
for(int i=h,p=0; p
線段樹、樹狀陣列、trie樹、樹剖、二維線段樹、主席樹略
樹分塊...我還不會卡不掉的樹分塊。。。
merge
update(x)
就好了...查詢區間\(k\)的倍數時,對於整塊加\(val\),可以變成求這塊模\(k=k-val\)的數的個數,這樣只需要維護乙個模數標記(初始為\(0\)),這樣就將整塊加轉化成了標記的\(o(1)\)修改。
這個思路挺好的,應該能拓展。
//520ms 2984kb
//#include #include #include #define gc() getchar()
#define maxin 300000
//#define gc() (ss==tt&&(tt=(ss=in)+fread(in,1,maxin,stdin),ss==tt)?eof:*ss++)
typedef long long ll;
const int n=3e5+5;
char in[maxin],*ss=in,*tt=in;
struct lct
inline bool n_root(int x)
inline void rev(int x)
inline void pushdown(int x)
void rotate(int x)
void splay(int x)
update(x);
} void access(int x)
void makeroot(int x)
void split(int x,int y)
int findroot(int x)
void link(int x,int y)
void cut(int x,int y)
}t;inline int read()
int main()
return 0;
}
#include #include #include #include #define gc() getchar()
typedef long long ll;
const int n=(1<<21)+5;
const double pi=acos(-1);
int rev[n];
struct complex
inline complex operator +(const complex &a)const
inline complex operator -(const complex &a)const
inline complex operator *(const complex &a)const
}f[n],g[n],w[n];
inline int read()
void fft(complex *a,int lim,int opt)
inline int fp(int x,int k)
void ntt(int *a,int lim,int opt)
inline int find(int x,int n)
void insert(int c,int n)
++val[las=son[p][c]];
} void solve()
}pam;
int main()
//297ms 15228kb
#include #include #include #include #define gc() getchar()
typedef long long ll;
const int n=1e6+5;
struct suffix_array
for(int i=1; i<=n; ++i) rk[sa[i]]=i;
ht[1]=0;
for(int i=1,k=0; i<=n; ++i)
}void solve()
}sa;
int main()
常搭配分塊使用(莫隊本身\(o(n\sqrt n)\)次修改,\(o(n)\)次查詢)。
優化什麼的(分奇偶),不管惹。
還是將所有詢問按\((左端點所在塊,\ 右端點)\)排序。對於左右端點在同一塊裡的詢問,暴力查詢。
否則,把左端點在同一塊\(i\)裡的詢問一起處理。這時右端點一定是遞增的。
令\(l\)為第\(i+1\)塊(下一塊)的左端點,\(r\)為第\(i\)塊(該塊)的右端點。將\(r\)移動到當前詢問的右端點處並更新答案,記錄此時答案\(tmp=now\)。
將\(l\)移動到當前詢問的左端點處並更新答案,得到當前詢問的答案\(now\)。
將\(l\)移回到下一塊左端點位置,並消除影響(減掉加的次數之類的),並令\(now=tmp\)。
移動金幣 SDOI2019
乙個 1 times n 的棋盤上最初擺放有 m 枚金幣。其中每一枚金幣佔據了乙個獨立的格仔,任意乙個格仔內最多只有一枚金幣。alice 和 bob 將要進行如下的一場遊戲。二人輪流操作,且 alice 先行。當輪到乙個玩家的時候,他可以選擇一枚金幣,並將其向左移動任意多格,且至少移動一格。金幣不能...
SDOI 2019 快速查詢
傳送門 day1 t1 給定乙個長度為 n nn 的整數數列 有 q qq 次操作,操作有 6 66 種,分別為 單點賦值,全域性加,全域性乘,全域性賦值,單點查值,全域性求和。操作的讀入有點鬼畜啊,建議仔細讀一下。資料範圍 1 n 109 1 n 10 9 1 n 10 9,1 q 10 71 l...
SDOI 2019 移動金幣 題解
題目傳送門 題目大意 乙個長度為 n nn 的序列上有 m mm 個金幣,兩個人輪流操作,乙個人可以將乙個金幣向左移動任意格,但是不能越過別的金幣,問有多少種局面先手必勝。感覺像這兩題 1,2 的合體,不過合的也很巧妙。轉化一下這個博弈 相當於有 m 1 m 1m 1 堆石子,每次可以將一堆石子中的...