SDOI2019 省選前模板整理

2022-04-02 14:03:36 字數 4388 閱讀 7732

目錄各種分治

資料結構

數學,數論

博弈論圖論

網路流字串

其它**不能摺疊,不過就這樣吧。有目錄也還好。

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 堆石子,每次可以將一堆石子中的...