• 高精度

  1. #include <cstring>
  2. #include <cstdio>
  3.  
  4. #define max(a,b) (a>b?a:b)
  5.  
  6. inline void read(int &x)
  7. {
  8. x=; register char ch=getchar();
  9. for(; ch>''||ch<''; ) ch=getchar();
  10. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  11. }
  12. const int N(1e5+);
  13.  
  14. namespace Bignum_ {
  15. struct Bignum {
  16. int num[]; // num[0] 表示数字位数
  17.  
  18. void init() { memset(num,,sizeof(num)); num[]=; }
  19.  
  20. void Mul(int x) // 高精乗低精
  21. {
  22. for(int i=,ove=; i<=num[]; ++i)
  23. {
  24. num[i]=num[i]*x+ove;
  25. if(num[i]>)
  26. {
  27. num[]= max(num[],i+);
  28. ove=num[i]/;
  29. num[i] %=;
  30. }
  31. else ove=;
  32. }
  33. for(; !num[num[]]&&num[]>; ) num[]--;
  34. }
  35.  
  36. void Del(int x) //高精除低精
  37. {
  38. for(int tt,t=,i=num[]; i; --i)
  39. {
  40. tt=num[i];
  41. num[i]=(tt+t*)/x;
  42. t=(t*+num[i])%x;
  43. }
  44. for(; !num[num[]]&&num[]>; ) num[]--;
  45. }
  46.  
  47. void print()
  48. {
  49. for(int i=num[]; i; i--) printf("%d",num[i]);
  50. }
  51. }a,b;
  52.  
  53. Bignum Add(Bignum a,Bignum b) //高精加高精
  54. {
  55. Bignum c; c.num[]=max(a.num[],b.num[]);
  56. for(int x=,i=; i<=c.num[]; ++i)
  57. {
  58. c.num[i]=a.num[i]+b.num[i]+x;
  59. if(c.num[i]>)
  60. {
  61. x=c.num[i]/; c.num[i]%=;
  62. c.num[]=max(c.num[],i+);
  63. }
  64. }
  65. for(; !c.num[c.num[]]&&c.num[]>; ) c.num[]--;
  66. return c;
  67. }
  68.  
  69. inline bool judge(Bignum a,Bignum b)
  70. {
  71. if(a.num[]>b.num[]) return ;
  72. else if(a.num[]<b.num[]) return ;
  73. else for(int i=a.num[]; i; --i)
  74. if(a.num[i]>b.num[i]) return ;
  75. else if(a.num[i]<b.num[i]) return ;
  76. return ;
  77. }
  78.  
  79. Bignum Sub(Bignum a,Bignum b) // 高精-高精
  80. {
  81. Bignum c; bool flag=;
  82. c.num[]=max(a.num[],b.num[]);
  83. if(judge(a,b)) //判谁做减数
  84. for(int x=,i=; i<=c.num[]; ++i)
  85. {
  86. c.num[i]=a.num[i]-b.num[i];
  87. if(c.num[i]<) c.num[i+]--,c.num[i]+=;
  88. }
  89. else
  90. {
  91. for(int x=,i=; i<=c.num[]; ++i)
  92. {
  93. c.num[i]=b.num[i]-a.num[i];
  94. if(c.num[i]<) c.num[i+]--,c.num[i]+=;
  95. }
  96. flag=;
  97. }
  98. for(; !c.num[c.num[]]&&c.num[]>; ) c.num[]--;
  99. if(flag) c.num[c.num[]]=-c.num[c.num[]];
  100. return c;
  101. }
  102. }
  103.  
  104. int Presist()
  105. {
  106.  
  107. return ;
  108. }
  109.  
  110. int Aptal=Presist();
  111. int main(int argc,char**argv){;}

高精度

  • 数论知识

  1. #include <cstring>
  2. #include <cstdio>
  3. #include <cmath>
  4.  
  5. #define LL long long
  6.  
  7. inline void read(int &x)
  8. {
  9. x=; register char ch=getchar();
  10. for(; ch>''||ch<''; ) ch=getchar();
  11. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  12. }
  13.  
  14. const int mod(1e9+);
  15. const int N();
  16.  
  17. bool no_pri[N];
  18. LL fac[N],inv[N];
  19. int cnt,pri[N],phi[N];
  20.  
  21. namespace Number_Theory {
  22.  
  23. inline LL Mul(LL a,int b,int p) //慢速乗,防乗爆
  24. {
  25. LL ret=;
  26. for(; b; b>>=, a<<=,a%=p)
  27. if(b&) ret+=a, ret%p;
  28. return ret;
  29. }
  30.  
  31. inline LL Pow(LL a,int b,int p) // 快速幂
  32. {
  33. LL ret=;
  34. for(; b; b>>=, a*=a,a%=p)
  35. if(b&) ret*=a, ret%=p;
  36. return ret;
  37. }
  38.  
  39. inline bool judge_ss(int x) // 根x 判素数
  40. {
  41. if(x<) return ;
  42. for(int i=; i*i<=x; ++i)
  43. if(x%i==) return ;
  44. return ;
  45. }
  46.  
  47. inline void Euller(int n) // 欧拉筛素数和欧拉函数
  48. {
  49. /*
  50. (1) 若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
  51. (2) 若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);
  52. 其中a是N的质因数。
  53. 关于欧拉函数还有以下性质:
  54. (1) phi[p]=p-1; (p为素数);
  55. (2)若N=p^n(p为素数),则 phi[N]=(p-1)*p^(n-1);
  56. */
  57. for(int i=; i<=n; ++i)
  58. {
  59. if(!no_pri[i]) pri[++cnt]=i,phi[i]=i-;
  60. for(int j=; j<=cnt; ++j)
  61. {
  62. if(pri[j]*i>n) break;
  63. no_pri[pri[j]*i]=true;
  64. if(i%pri[j]==)
  65. {
  66. phi[i*pri[j]]=phi[i]*pri[j]; break;
  67. }
  68. else phi[i*pri[j]]=phi[i]*(pri[j]-);
  69. }
  70. }
  71. }
  72.  
  73. inline LL Phi(LL x) // 欧拉函数
  74. {
  75. LL ret=;
  76. for(int i=; i<=x; ++i)
  77. {
  78. if(x%i) continue;
  79. ret*=i-, x/=i;
  80. for(; x%i==; )
  81. ret*=i,x/=i;
  82. }
  83. if(x>) ret*=x-;
  84. return ret;
  85. }
  86.  
  87. inline LL exgcd(LL a,LL b,LL &x,LL &y) // 扩展欧几里得
  88. {
  89. if(!b) { x=,y=; return a;}
  90. LL ret=exgcd(b,a%b,x,y),tmp=x;
  91. x=y; y=tmp-a/b*y; return ret;
  92. }
  93.  
  94. inline LL Fermat(LL a,LL p) // p为素数 费马小定理 a^(p-1) = 1 mod p
  95. {
  96. return Pow(a,p-,p); // 逆元
  97. }
  98.  
  99. inline LL Pre_inv(int p) // a/b%mod --> a*inv(b,mod)
  100. {
  101. fac[]=fac[]=inv[]=;
  102. for(int i=; i<N; ++i)
  103. {
  104. fac[i]=1ll*fac[i-]%p*i%p;
  105. inv[i]=1ll*inv[p%i]*(p-p/i)%p; //线性求逆元
  106. /* 拓展欧几里得求逆元
  107. LL x,y,gcd=exgcd(i,mod,x,y);
  108. inv[i]= gcd==1 ?(x+mod)%mod :-1;
  109. */
  110. /* 欧拉函数求逆元
  111. Euller();
  112. inv[i]=Fermat(i,mod);
  113. */
  114. }
  115. }
  116.  
  117. inline LL CRT(LL *m,LL *p,int n) //中国剩余定理,互质不互质情况
  118. {
  119. LL x,y,tmp,gcd,b,c;
  120. LL ret=m[],a=p[],mod;
  121. for(int i=; i<=n; ++i)
  122. {
  123. tmp=m[i],b=p[i],c=tmp-ret;
  124. gcd=exgcd(a,b,x,y);
  125. if(c%gcd) return -;
  126. x*=c/gcd, mod=b/gcd;
  127. for(x+=mod; x>=mod; ) x-=mod;
  128. ret+=a*x, a*=mod;
  129. }
  130. return ret?ret:(ret+a);
  131. }
  132.  
  133. struct Matrix_fb { // 矩阵优化菲波那切数列
  134. LL e[][];
  135. void init_base()
  136. {
  137. e[][]=;
  138. e[][]=;
  139. e[][]=;
  140. e[][]=;
  141. }
  142. void init_ans()
  143. {
  144. e[][]=e[][]=;
  145. e[][]=e[][]=;
  146. }
  147. Matrix_fb operator * (Matrix_fb x) const
  148. {
  149. Matrix_fb ret;
  150. for(int i=; i<; ++i)
  151. for(int j=; j<; ++j)
  152. {
  153. ret.e[i][j]=;
  154. for(int k=; k<; ++k)
  155. ret.e[i][j]+=e[i][k]*x.e[k][j],ret.e[i][j]%=mod;
  156. }
  157. return ret;
  158. }
  159. }ans,base;
  160.  
  161. inline LL Fibonacci(int n)
  162. //斐波那契数列 gcd( f[a],f[b] )= f[ gcd(a,b) ], f[i]=f[i-1]+f[i-2]
  163. {
  164. double x=sqrt(5.0);
  165. return pow(((+x)/),n)/x - pow(((-x)/),n)/x; // 通式
  166. if(n==||n==) return ;
  167. for( n-=; n; n>>=,base=base*base)
  168. if(n&) ans=ans*base;
  169. return ans.e[][];
  170. }
  171. }
  172.  
  173. // 排列组合
  174. namespace Permutations {
  175.  
  176. inline void Pre_C(int n,int p) // 预处理组合数
  177. {
  178. LL C[n][n];
  179. memset(C,,sizeof(C));
  180. for(int i=; i<n; ++i)
  181. {
  182. C[i][i]=C[i][]=;
  183. for(int j=; j<i; ++j)
  184. C[i][j]=(C[i-][j]+C[i-][j-])%p;
  185. }
  186. }
  187.  
  188. LL C(LL n,LL m,LL p)
  189. {
  190. if(m>n) return ;
  191. LL t1=Number_Theory::Fermat(fac[m],p);
  192. LL t2=Number_Theory::Fermat(fac[n-m],p);
  193. return fac[n]%p*t1%p*t2%p;
  194. }
  195.  
  196. LL Luc(LL n,LL m,LL p)
  197. {
  198. if(n<m) return ;
  199. if(m==) return ;
  200. return (C(n%p,m%p,p))*Luc(n/p,m/p,p)%p;
  201. }
  202.  
  203. inline void Use_luc(int n,int m,int p)
  204. // Lucas定理 Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)
  205. {
  206. Number_Theory:: Pre_inv(p);
  207. printf("%lld\n",Luc(n,m,p));
  208. }
  209.  
  210. inline int Catelan(int n) //卡特兰数
  211. {
  212. int h[n]; memset(h,,sizeof(h));
  213. h[]=h[]=;
  214. for(int i=; i<=n; ++i)
  215. for(int j=; j<=i; ++j)
  216. h[i]=h[i-j]*h[j-]+h[i];
  217. return h[n];
  218. }
  219.  
  220. inline int stirling(int n,int m)
  221. {
  222. /*
  223. stirling数,递推公式s[i][j]=s[i-1][j]*j+s[i-1][j-1]
  224. S(p,k)的一个组合学解释是:
  225. 将p个物体划分成k个非空的不可辨别的(可以理解为盒子没有编号)集合的方法数。
  226. k!S(p,k)是把p个人分进k间有差别(如:被标有房号)的房间(无空房)的方法数。
  227. S(p,k)的递推公式是:S(p,k)=k*S(p-1,k)+S(p-1,k-1) ,1<= k<=p-1
  228. 边界条件:S(p,p)=1 ,p>=0 S(p,0)=0 ,p>=1
  229. 递推关系的说明:
  230. 考虑第p个物品,p可以单独构成一个非空集合,此时前p-1个物品构成k-1个非空的不可辨别的集合,方法数为S(p-1,k-1);
  231. 也可以前p-1种物品构成k个非空的不可辨别的集合,第p个物品放入任意一个中,这样有k*S(p-1,k)种方法。
  232. 注意:当m>n||m==0时直接输出0,!
  233. */
  234. int s[n][n]; memset(s,,sizeof(s));
  235. for(int i=; i<=n; ++i) s[i][i]=;
  236. for(int i=; i<=n; ++i)
  237. for(int j=; j<=i; ++j)
  238. s[i][j]=s[i-][j-]+s[i-][j]*j;
  239. return (!m||m>n)?:s[n][m];
  240. }
  241. }
  242.  
  243. int Presist()
  244. {
  245.  
  246. return ;
  247. }
  248.  
  249. int Aptal=Presist();
  250. int main(int argc,char**argv){;}

数论知识

  • 图论知识

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5.  
  6. #define min(a,b) (a<b?a:b)
  7. #define max(a,b) (a>b?a:b)
  8.  
  9. inline void read(int &x)
  10. {
  11. x=; register char ch=getchar();
  12. for(; ch>''||ch<''; ) ch=getchar();
  13. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  14. }
  15. const int INF(0x3f3f3f3f);
  16. const int N(1e5+);
  17. const int M(1e6+);
  18.  
  19. // Graph_theory
  20.  
  21. int sumedge,head[N];
  22.  
  23. struct Edge {
  24. int v,next,w;
  25. Edge(int v=,int next=,int w=):v(v),next(next),w(w){}
  26. }edge[M<<];
  27.  
  28. inline void ins(int u,int v,int w)
  29. {
  30. edge[++sumedge]=Edge(v,head[u],w),head[u]=sumedge;
  31. edge[++sumedge]=Edge(u,head[v],w),head[u]=sumedge;
  32. }
  33.  
  34. namespace The_short_circuit {
  35. inline void Floyd(int n,int m)
  36. {
  37. int dis[][];
  38. for(int i=; i<=n; ++i)
  39. for(int j=; j<=n; ++j)
  40. dis[i][j]=INF*(i!=j);
  41.  
  42. for(int k=; k<=n; ++k)
  43. for(int i=; i<=n; ++i)
  44. for(int j=; j<=n; ++j)
  45. dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  46. }
  47.  
  48. int dis[N];
  49. bool inq[N],vis[N];
  50.  
  51. inline void SPFA(int s,int n)
  52. {
  53. std::queue<int>que;
  54. for(int i=; i<=n; ++i)
  55. inq[i]=, dis[i]=INF;
  56. dis[s]=; que.push(s);
  57. for(int u,v; !que.empty(); )
  58. {
  59. u=que.front(); que.pop(); inq[u]=;
  60. for(int i=head[u]; i; i=edge[i].next)
  61. {
  62. v=edge[i].v;
  63. if(dis[v]>dis[u]+edge[i].w)
  64. {
  65. dis[v]=dis[u]+edge[i].w;
  66. if(!inq[v]) que.push(v),inq[v]=;
  67. }
  68. }
  69. }
  70. }
  71.  
  72. struct Node {
  73. int pos,dis;
  74. bool operator < (const Node&x)const
  75. {
  76. return dis>x.dis;
  77. }
  78. }u,v;
  79.  
  80. inline void Dijkstra(int s,int n)
  81. {
  82. std::priority_queue<Node>que;
  83. for(int i=; i<=n; ++i)
  84. vis[i]=, dis[i]=INF;
  85. u.dis=dis[s]=, u.pos=s; que.push(u);
  86. for(; !que.empty(); )
  87. {
  88. u=que.top(); que.pop();
  89. if(vis[u.pos]) continue;
  90. for(int i=head[u.pos]; i; i=edge[i].next)
  91. {
  92. v.pos=edge[i].v;
  93. if(dis[v.pos]>dis[u.pos]+edge[i].w)
  94. {
  95. dis[v.pos]=dis[u.pos]+edge[i].w;
  96. v.dis= dis[v.pos]; que.push(v);
  97. }
  98. }
  99. }
  100. }
  101. }
  102.  
  103. namespace Negative_ring {
  104. bool vis[N];
  105. int dis[N];
  106. bool DFS(int u)
  107. {
  108. vis[u]=;
  109. for(int v,i=head[u]; i; i=edge[i].next)
  110. {
  111. v=edge[i].v;
  112. if(dis[v]>dis[u]+edge[i].w)
  113. {
  114. dis[v]=dis[u]+edge[i].w;
  115. if(vis[v]||DFS(u))
  116. {
  117. vis[v]=;
  118. return ;
  119. }
  120. }
  121. }
  122. return vis[u]=;
  123. }
  124. }
  125.  
  126. namespace Tarjan_ {
  127.  
  128. int sumcol,col[N];
  129. int tim,dfn[N],low[N];
  130. int stack[N],instack[N],top;
  131. int cutpoint[N],cutedge[M];
  132.  
  133. void DFS(int u) //强联通分量,无向图加一个pre判断
  134. {
  135. low[u]=dfn[u]=++tim;
  136. stack[++top]=u, instack[u]=;
  137. for(int v,i=head[u]; i; i=edge[i].next)
  138. {
  139. v=edge[i].v;
  140. if(!dfn[v]) DFS(v), low[u]=min(low[u],low[v]);
  141. else if(instack[v]) low[u]=min(low[u],dfn[v]);
  142. }
  143. if(low[u]==dfn[u])
  144. {
  145. col[u]=++sumcol;
  146. for(; stack[top]!=u; top--)
  147. {
  148. col[stack[top]]=sumcol;
  149. instack[stack[top]]=false;
  150. }
  151. instack[u]=, top--;
  152. }
  153. }
  154.  
  155. void Tarjan(int u,int pre) //sumedge=-1 双联通
  156. {
  157. int sumtredge=; bool if_cutpoint=;
  158. low[u]=dfn[u]=++tim;
  159. for(int v,i=head[u]; i; i=edge[i].next)
  160. {
  161. if((i^)==pre) continue;
  162. if(!dfn[v])
  163. {
  164. sumtredge++; Tarjan(v,i);
  165. if(low[v]>=dfn[u]) if_cutpoint=;
  166. if(low[v]>dfn[u]) cutedge[i>>]=;
  167. low[u]=min(low[u],low[v]);
  168. }
  169. else low[u]=min(low[u],dfn[v]);
  170. }
  171. if(!pre)
  172. {
  173. if(sumtredge>) cutpoint[u]=;
  174. }
  175. else if(if_cutpoint) cutpoint[u]=;
  176. }
  177.  
  178. inline void work(int n)
  179. {
  180. tim=;sumcol=;top=;
  181. memset(dfn,,sizeof(dfn));
  182. memset(low,,sizeof(low));
  183. memset(stack,,sizeof(stack));
  184. memset(instack,,sizeof(instack));
  185.  
  186. for(int i=; i<=n; ++i)
  187. if(!dfn[i]) DFS(i);
  188. Tarjan(,);
  189. }
  190. }
  191.  
  192. namespace MST_ {
  193.  
  194. struct Edge {
  195. int u,v,w;
  196. bool operator < (const Edge&x)const
  197. {
  198. return w<x.w;
  199. }
  200. } road[M];
  201. int fa[N];
  202.  
  203. int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); }
  204.  
  205. inline void Kruskar(int m,int n)
  206. {
  207. for(int i=; i<=n; ++i) fa[i]=i;
  208. std:: sort(road+,road+m+);
  209. int cnt=, ret=;
  210. for(int fx,fy,i=; i<=m; ++i)
  211. {
  212. fx=find(road[i].u),fy=find(road[i].v);
  213. if(fx==fy) continue; fa[fx]=fy;
  214. ret+=road[i].w; if(++cnt==n-) break;
  215. }
  216. printf("%d\n",ret);
  217. }
  218.  
  219. inline void Prim(int n)
  220. {
  221. int ret=,minn,vis[N],dis[N/][N/],d[N];
  222. for(int i=; i<=n; ++i) vis[i]=,d[i]=dis[][i];
  223. vis[]=;
  224. for(int u,i=; i<=n; ++i)
  225. {
  226. minn=INF;
  227. for(int j=; j<=n; ++j)
  228. if(!vis[j]&&minn>d[j]) minn=d[u=j];
  229. if(minn=INF) break;
  230. ret+=minn; vis[u]=;
  231. for(int v=; v<=n; ++v)
  232. if(!vis[v]&&d[v]>dis[u][v]) d[v]=dis[u][v];
  233. }
  234. printf("%d\n",ret);
  235. }
  236.  
  237. }
  238.  
  239. namespace Bisection_Graph {
  240.  
  241. inline bool check(int s)
  242. {
  243. int col[N]; memset(col,-,sizeof(col));
  244. col[s]=; std::queue<int>que; que.push(s);
  245. for(int u,v; !que.empty(); )
  246. {
  247. u=que.front(); que.pop();
  248. for(int i=head[u]; i; i=edge[i].next)
  249. {
  250. v=edge[i].v;
  251. if(col[v]==-)
  252. {
  253. col[v]=col[u]^;
  254. que.push(v);
  255. }
  256. else if(col[v]==col[u]) return ;
  257. }
  258. }
  259. return true;
  260. }
  261.  
  262. int match[N],map[N/][N/];
  263. int sumvis,vis[N];
  264. bool Get(int u,int n)
  265. {
  266. for(int v=; v<=n; ++v)
  267. if(map[u][v]&&vis[v]!=sumvis)
  268. {
  269. vis[v]=sumvis;
  270. if(!match[v]||Get(match[v],n))
  271. {
  272. match[v]=u;
  273. return true;
  274. }
  275. }
  276. return false;
  277. }
  278. inline void Hungarian(int n)
  279. {
  280. int ans=;
  281. for(int i=; i<=n; ++i)
  282. sumvis++,ans+=Get(i,n);
  283. printf("%d\n",ans);
  284. }
  285. }
  286.  
  287. namespace Top_sort_ {
  288. inline void work(int n,int *rd)
  289. {
  290. std::queue<int>que;
  291. for(int i=; i<=n; ++i)
  292. if(!rd[i]) que.push(i);
  293. for(int u,v; !que.empty(); )
  294. {
  295. u=que.front(); que.pop();
  296. for(int i=head[u]; i; i=edge[i].next)
  297. if(--rd[edge[i].v]==) que.push(edge[i].v);
  298. }
  299. }
  300. }
  301.  
  302. int Presist()
  303. {
  304.  
  305. return ;
  306. }
  307.  
  308. int Aptal=Presist();
  309. int main(int argc,char**argv){;}

图论知识

  • 数据结构

  1. #include <cstring>
  2. #include <cstdio>
  3.  
  4. #define swap(a,b) {int c=a;a=b;b=c;}
  5. #define max(a,b) (a>b?a:b)
  6.  
  7. inline void read(int &x)
  8. {
  9. x=; register char ch=getchar();
  10. for(; ch>''||ch<''; ) ch=getchar();
  11. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  12. }
  13. const int N(1e5+);
  14.  
  15. /*
  16. Data_structure
  17. */
  18.  
  19. int sum[N];
  20. namespace Tree_array {
  21. #define lowbit(x) (x&((~x)+1))
  22. inline void Update(int i,int x)
  23. {
  24. for(; i<N; i+=lowbit(i)) sum[i]+=x;
  25. }
  26. inline int Query(int i)
  27. {
  28. int ret=;
  29. for(; i; i-=lowbit(i)) ret+=sum[i];
  30. return ret;
  31. }
  32. }
  33.  
  34. struct Tree {
  35. bool flag;
  36. int l,r,mid,val;
  37. }tr[N<<];
  38. namespace Line_segment_tree {
  39.  
  40. #define lc (now<<1)
  41. #define rc (now<<1|1)
  42. #define mid (tr[now].l+tr[now].r>>1)
  43.  
  44. void Update(int now)
  45. {
  46. tr[now].val=tr[lc].val+tr[rc].val;
  47. }
  48.  
  49. void Build(int now,int l,int r)
  50. {
  51. tr[now].l=l, tr[now].r=r;
  52. if(l==r)
  53. {
  54. read(tr[now].val);
  55. tr[now].flag=; return ;
  56. }
  57. Build(lc,l,mid),Build(rc,mid+,r);
  58. Update(now);
  59. }
  60.  
  61. void Pushdown(int now)
  62. {
  63. tr[lc].flag+=tr[now].flag;
  64. tr[lc].val+=tr[now].flag*(tr[lc].r-tr[lc].l+);
  65. tr[rc].flag+=tr[now].flag;
  66. tr[rc].val+=tr[now].flag*(tr[rc].r-tr[rc].l+);
  67. tr[now].flag=;
  68. }
  69.  
  70. void Change1(int now,int to,int x)
  71. {
  72. if(tr[now].l==tr[now].r)
  73. {
  74. tr[now].val=+x;
  75. tr[now].flag+=x;
  76. return ;
  77. }
  78. if(tr[now].flag) Pushdown(now);
  79. if(to<=mid) Change1(lc,to,x);
  80. else Change1(rc,to,x);
  81. Update(now);
  82. }
  83.  
  84. void Change2(int now,int l,int r,int x)
  85. {
  86. if(tr[now].l==l&&tr[now].r==r)
  87. {
  88. tr[now].val+=x*(tr[now].r-tr[now].l+);
  89. tr[now].flag+=x; return ;
  90. }
  91. if(tr[now].flag) Pushdown(now);
  92. if(r<=mid) Change2(lc,l,r,x);
  93. else if(l>mid) Change2(rc,l,r,x);
  94. else Change2(lc,l,mid,x),Change2(rc,mid+,r,x);
  95. Update(now);
  96. }
  97.  
  98. int Query(int now,int l,int r)
  99. {
  100. if(tr[now].l==l&&tr[now].r==r) return tr[now].val;
  101. if(tr[now].flag) Pushdown(now);
  102. if(r<=mid) return Query(lc,l,r);
  103. else if(l>mid) return Query(rc,l,r);
  104. else return Query(lc,l,mid)+Query(rc,mid+,r);
  105. Update(now);
  106. }
  107. }
  108.  
  109. int st[N][],log2[N],t=;
  110. namespace ST_ {
  111. inline void wokr(int n)
  112. {
  113. for(int i=; i<=n; ++i)
  114. read(st[i][]),log2[i]=(<<t+==i?++t:t);
  115. for(int j=; <<j<=n; ++j)
  116. for(int i=; i+(<<j)<=n+; ++i)
  117. st[i][j]=max(st[i][j-],st[i+(<<j-)][j-]);
  118. }
  119. }
  120.  
  121. int head[N],sumedge;
  122. struct Edge {
  123. int v,next;
  124. }edge[N<<];
  125.  
  126. int size[N],dep[N];
  127. namespace LCA_1 {
  128. int dad[N],son[N],top[N];
  129. void DFS(int u,int depth)
  130. {
  131. size[u]=;dep[u]=depth;
  132. for(int v,i=head[u]; i; i=edge[i].next)
  133. {
  134. v=edge[i].v;
  135. if(dad[u]==v) continue; dad[v]=u;
  136. DFS(v,depth+), size[u]+=size[v];
  137. if(size[son[u]]<size[v]) son[u]=v;
  138. }
  139. }
  140.  
  141. void DFS_(int u,int Top)
  142. {
  143. top[u]=Top; if(son[u]) DFS_(son[u],Top);
  144. for(int v,i=head[u]; i; i=edge[i].next)
  145. {
  146. v=edge[i].v;
  147. if(v!=son[u]&&v!=dad[u]) DFS_(v,v);
  148. }
  149. }
  150.  
  151. inline int LCA(int x,int y)
  152. {
  153. for(; top[x]!=top[y]; x=dad[top[x]])
  154. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  155. return dep[x]<dep[y]?x:y;
  156. }
  157.  
  158. }
  159.  
  160. namespace LCA_2 {
  161. int dad[N][];
  162.  
  163. void DFS(int u,int fa)
  164. {
  165. dep[u]=dep[fa]+;
  166. for(int i=; dad[u][i-]; ++i)
  167. dad[u][i]=dad[dad[u][i-]][i-];
  168. for(int v,i=head[u]; i; i=edge[i].next)
  169. if(!dep[edge[i].v]) dad[edge[i].v][]=u,DFS(v,u);
  170. }
  171.  
  172. int LCA(int x,int y)
  173. {
  174. if(dep[x]>dep[y]) swap(x,y);
  175. for(int i=; i>=; --i)
  176. if(dep[dad[y][i]]>dep[dad[x][i]]) y=dad[y][i];
  177. if(x==y) return x;
  178. for(int i=; i>=; --i)
  179. if(dad[x][i]!=dad[y][i]) x=dad[x][i],y=dad[y][i];
  180. return dad[x][];
  181. }
  182. }
  183.  
  184. namespace Dai_quan_bing_cha_ji {
  185. int fa[N],val[N];
  186. int find(int x)
  187. {
  188. if(fa[x]==x) return x;
  189. int dad=find(fa[x]);
  190. val[x]+=val[fa[x]];
  191. return fa[x]=dad;
  192. }
  193. inline void combine(int x,int y)
  194. {
  195. x=find(x),y=find(y);
  196. if(x!=y) val[x]+=val[y],fa[x]=y;
  197. }
  198. }
  199.  
  200. int trie[N<<][],tot;
  201. namespace Trie_Tree {
  202. inline void Build(char *s)
  203. {
  204. int len=strlen(s),now=;
  205. for(int x,i=; i<len; ++i)
  206. {
  207. x=s[i]-'a'+;
  208. if(trie[now][x])
  209. now=trie[now][x],trie[now][]++;
  210. else now=trie[now][x]=++tot,trie[now][]++;
  211. }
  212. }
  213. inline int find(char *s)
  214. {
  215. int len=strlen(s),now=,p=;
  216. for(; p<len; )
  217. if(trie[now][s[p]-'a'+])
  218. now=trie[now][s[p]-'a'+],++p;
  219. else return ;
  220. return trie[now][];
  221. }
  222. }
  223.  
  224. namespace The_monotonous_queue {
  225. int que[N],head=,tail,a[N];
  226.  
  227. inline void work(int n,int m)
  228. {
  229. for(int i=; i<=n; ++i)
  230. {
  231. read(a[i]);
  232. for(; head<=tail&&a[que[tail]]<=a[i]; ) tail--;
  233. for(que[++tail]=i; head<=tail&&i>m; ) head++;
  234. }
  235. }
  236. }
  237.  
  238. int Presist()
  239. {
  240.  
  241. return ;
  242. }
  243.  
  244. int Aptal=Presist();
  245. int main(int argc,char**argv){;}

数据结构

  • 字符串

  1. #include <cstring>
  2. #include <cstdio>
  3.  
  4. const int N(1e6+);
  5.  
  6. char s[N],a[N];
  7. int p[N];
  8.  
  9. namespace Kmp {
  10. inline void Get_next(char *s)
  11. {
  12. int len=strlen(s+);
  13. for(int j=,i=; i<=len; p[i++]=j)
  14. {
  15. for(; j&&s[i]!=s[j+]; ) j=p[j];
  16. if(s[i]==s[j+]) j++;
  17. }
  18. }
  19. // 字符串最短长度 len-p[len]
  20. inline void kmp(char *a,char *s)
  21. // 匹配子串位置
  22. {
  23. Get_next(s);
  24. int la=strlen(a+),ls=strlen(s+);
  25. for(int j=,i=,k=; i<=la; ++i)
  26. {
  27. for(; j&&a[i]!=s[j+]; ) j=p[j];
  28. if(a[i]==s[j+]) j++;
  29. if(j==ls) printf("%d\n",i-j+),j=p[j];
  30. }
  31. }
  32. }
  33.  
  34. #define ull unsigned long long
  35. const int P();
  36.  
  37. ull hs1[],hs2[];
  38.  
  39. namespace Hash_ {
  40. inline ull Pow(ull a,int b)
  41. {
  42. ull ret=;
  43. for(; b; b>>=,a*=a)
  44. if(b&) ret*=a;
  45. return ret;
  46. }
  47.  
  48. inline bool Compare(int l,int r)
  49. {
  50. return hs1[r]-hs1[l]*Pow(P,r-l+)==hs2[r-l+];
  51. }
  52.  
  53. inline void Get_hash(char *s)
  54. {
  55. int len=strlen(s+);
  56. for(int i=; i<=len; ++i)
  57. hs1[i]=hs1[i-]*P+s[i]-'a';
  58. }
  59. }
  60.  
  61. int Presist()
  62. {
  63.  
  64. return ;
  65. }
  66.  
  67. int Aptal=Presist();
  68. int main(int argc,char**argv){;}

字符串

【 模_板 】 for NOIP 2017的更多相关文章

  1. 「NOIP 2017」列队

    题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...

  2. NOIP 2017 解题报告

    ---恢复内容开始--- NOIP 2017 的题真的很难啊,怪不得当年我这个萌新爆零了(当然现在也是萌新)越学越觉得自己什么都不会. 想要成为强者要把这些好题都弄懂弄透 至少现在6道题我都比较陌生 ...

  3. NOIP 2017 列队 - Splay - 树状数组

    题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...

  4. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  5. NOIP 2017 小凯的疑惑

    # NOIP 2017 小凯的疑惑 思路 a,b 互质 求最大不能表示出来的数k 则k与 a,b 互质 这里有一个结论:(网上有证明)不过我是打表找的规律 若 x,y(设x<y) 互质 则 : ...

  6. 历年真题 未完成(Noip 2008 - Noip 2017)

    Noip 2008 :全部 Noip 2009 :全部 Noip 2010 :AK Noip 2011 :AK Noip 2012 : Vigenère 密码,国王游戏,开车旅行 Noip 2013 ...

  7. 洛谷 P3951 NOIP 2017 小凯的疑惑

    洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...

  8. u-boot启动流程分析(2)_板级(board)部分

    转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global dat ...

  9. [NOIp 2017]逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经 ...

随机推荐

  1. selenium 使用谷歌浏览器模拟wap测试

    /** * 使用谷歌浏览器模拟手机浏览器 * @param devicesName * @author xxx * 创建时间:2017-06-15,更新时间:2017-06-15 * 备注 */ pu ...

  2. 孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类尝试第一天

     孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类,尝试第一天 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 按上一天的规划,这是根据过去我自学其它编程语 ...

  3. JavaWeb笔记(八)JQuery

    三个版本 1.x:兼容 ie678,使用最为广泛的,官方只做BUG维护, 功能不再新增.因此一般项目来说,使用1.x版本就可以了 最终版本:1.12.4 2.x:不兼容ie678,很少有人使用,官方只 ...

  4. Struts2+DAO层实现实例02——搭建DAO基本框架并与Struts2组合

    实例内容 创建DAO(Data Access Oject)接口:BaseDAO 创建其实例化类:UserDAO 用于获取数据库struts中的userinfo表中的内容 创建User的Java Bea ...

  5. CodeForces Round #515 Div.3 D. Boxes Packing

    http://codeforces.com/contest/1066/problem/D Maksim has nn objects and mm boxes, each box has size e ...

  6. jQuery Ajax(load,post,get,ajax)

    1.load(url, [data], [callback]) 载入远程 HTML 文件代码并插入至 DOM 中. 默认使用 GET 方式 - 传递附加参数时自动转换为 POST 方式.jQuery ...

  7. 将MSHFlexGrid1中记录导出为Excel

    1.添加引用Microsoft Excel 14.0 Object Library 2.编写代码部分 Private Sub Output_Click() Dim i As Integer '定义变量 ...

  8. HTML5的JavaScript选择器介绍

    在HTML5出现之前使用JavaScript查找DOM元素,有以下三种原生的方法: getElementById:根据指定元素的id属性返回元素 getElementsByName:返回所有指定nam ...

  9. [bzoj] 1085 骑士精神 || ID-DFS

    原题 找到最少的步数成为目标状态. IDDFS(限制层数的dfs)即可 #include<cstdio> #include<algorithm> using namespace ...

  10. Codeforces Round #428 (Div. 2) B

    B. Game of the Rows(贪心) 题意: 有k种颜色,每种有\(a_i\)个,将这k种颜色放在一个\(n * 8格子里\) 放置规则不能出现两个不同颜色在相邻的格子里,相邻的定义为在同一 ...