ACM 算法模板
皮
一
下
很
开
心
原创模板
1、 快速幂&GCD
int gcd(int a,int b){return a?gcd(a,a%b):b;}
typedef long long ll;
ll quickmod(ll a,ll b,ll mod)//快速幂
{
ll ans = 1;
while(b)
{
if(b&1)
ans = (ans*a)%mod;
a = (a*a)%mod;
b >>= 1;
}
return ans;
}
2、 Kruskal算法
3、 #include
4、 using namespace std;
5、 #define maxn 50005
6、 #define INF 0x3f3f3f3f
7、 int par[maxn],rank[maxn];
8、 struct edge//边的信息
9、 {
10、 int u,v,cost;
11、 }es[maxn];
12、 bool cmp(edge a,edge b)
13、 {
14、 return a.cost
2. #include
3. #include
4. using namespace std;
5. int main()
6. {
7. long long n,t;
8. cin>>t;
9. while(t--)
10. {
11. cin>>n;
12. if(n==1) cout<<"1"<
2. using namespace std;
3. int a[10][10];//地图
4. int b[10][10];//障碍
5. int sx,sy;//起点
6. int ex,ey;//终点
7. int zx,zy;
8. int s=0;
9. int dx[4]={-1,1,0,0};
10. int dy[4]={0,0,1,-1};
11. void dfs(int x,int y)
12. {
13. if(x==ex&&y==ey)
14. {
15. s++;
16. return ;
17. }
18. for(int i=0;i<=3;i++)
19. {
20. if(a[x+dx[i]][y+dy[i]]==0&&b[x+dx[i]][y+dy[i]]==1)
21. {
22. a[x][y]=1;
23. dfs(x+dx[i],y+dy[i]);
24. a[x][y]=0;
25. }
26. }
27. }
28. int main()
29. {
30. int n,m,t;
31. cin>>n>>m>>t;
32. for(int i=1;i<=n;i++)
33. {
34. for(int j=1;j<=m;j++)
35. {
36. b[i][j]=1;//无障碍物
37. }
38. }
39. cin>>sx>>sy>>ex>>ey;
40. for(int i=1;i<=t;i++)
41. {
42. cin>>zx>>zy;
43. b[zx][zy]=0;
44. }
45. dfs(sx,sy);
46. cout<
2. #include
3. using namespace std;
4. const double eps=1e-6;
5. struct point
6. {
7. double x,y;
8. };
9. bool panduan(point a,point b,point c,point d)
10. {
11. if(min(a.x, b.x) > max(c.x, d.x) || min(a.y, b.y) > max(c.y, d.y) || min(c.x, d.x) > max(a.x, b.x) || min(c.y, d.y) > max(a.y, b.y) )//快速排斥实验
12. return 0;
13. double h, i, j, k;
14. h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);//c.b.a//跨立实验
15. i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);//d.b.a
16. j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);//a.d.c
17. k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);//b.d.c
18. return h*i<=eps&&j*k<=eps;
19.
20.
21. }
22. int main()
23. {
24. point a,b,c,d;
25. int t;
26. cin>>t;
27. while(t--)
28. {
29. cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
30. if(panduan(a,b,c,d))
31. {
32. cout<<"Yes"<
2. using namespace std;
3. long long a[200005];
4. int n;
5. long long maxsum(long long a[],long long n)
6. {
7. long long ms,mh;
8. ms=mh=a[0];
9. for(int i=1;ims)
20. {
21. ms=mh;
22. }
23. }
24. return ms;
25. }
26. int main()
27. {
28. int n;
29. cin>>n;
30. for(int i=0;i>a[i];
33. }
34. cout<
2. #include
3. using namespace std;
4. int a[300005];
5. int dp[300005];
6. int main()
7. {
8. int n;
9. while(cin>>n)
10. {
11. for(int i=0;i>a[i];
14. dp[i]=1;
15. }
16. for(int i=n-1;i>=0;i--)
17. {
18. for(int j=i+1;jmaxx)
30. {
31. maxx=dp[i];
32. }
33. }
34. cout<
2. #include
3. using namespace std;
4. #define MAXN 120
5. const int mod=1e9+7;
6. typedef long long ll;
7. int n;
8. struct mat
9. {
10. ll m[MAXN][MAXN];//矩阵结构体
11. }unit;//unit为单位矩阵,即主对角线全部为1,这样任何矩阵与单位矩阵相乘都为它本身
12.
13. mat msub(mat a,mat b)//矩阵相乘函数
14. {
15. mat ret;
16. ll x;
17. for(int i=0;i>=1;
49. }
50. return ans;
51. }
52.
53. int main()
54. {
55. ll x;
56. init_unit();
57. cin>>n>>x;
58. mat a,ans;
59. for(int i=0;i>a.m[i][j];
64. }
65. }
66. ans=qpow(a,x);
67. for(int i=0;i
2. #include
3. #include
4. using namespace std;
5. #define MAXN 1005
6. char a[MAXN],b[MAXN];
7. int dp[MAXN][MAXN];
8. int d[MAXN][MAXN];
9. void dfs(int l1,int l2)
10. {
11. if(l1==0||l2==0)
12. {
13. return ;
14. }
15. if(d[l1][l2]==0)
16. {
17. dfs(l1-1,l2-1);
18. cout<>a>>b;
34. int l1=strlen(a);
35. int l2=strlen(b);
36. for(int i=1;i<=l1;i++)
37. {
38. for(int j=1;j<=l2;j++)
39. {
40. if(a[i-1]==b[j-1])
41. {
42. dp[i][j]=dp[i-1][j-1]+1;
43. d[i][j]=0;
44. }
45. else if(dp[i][j-1]>=dp[i-1][j])
46. {
47. dp[i][j]=dp[i][j-1];
48. d[i][j]=1;
49. }
50. else
51. {
52. dp[i][j]=dp[i-1][j];
53. d[i][j]=-1;
54. }
55. }
56. }
57. dfs(l1,l2);
58. cout<
2. #include
3. #include
4. using namespace std;
5. #define MAXN 1005
6. char a[MAXN],b[MAXN];
7. int dp[MAXN][MAXN];
8. int d[MAXN][MAXN];
9. void dfs(int l1,int l2)
10. {
11. if(l1==0||l2==0)
12. {
13. return ;
14. }
15. if(d[l1][l2]==0)
16. {
17. dfs(l1-1,l2-1);
18. cout<>a>>b;
34. int l1=strlen(a);
35. int l2=strlen(b);
36. for(int i=1;i<=l1;i++)
37. {
38. for(int j=1;j<=l2;j++)
39. {
40. if(a[i-1]==b[j-1])
41. {
42. dp[i][j]=dp[i-1][j-1]+1;
43. d[i][j]=0;
44. }
45. else if(dp[i][j-1]>=dp[i-1][j])
46. {
47. dp[i][j]=dp[i][j-1];
48. d[i][j]=1;
49. }
50. else
51. {
52. dp[i][j]=dp[i-1][j];
53. d[i][j]=-1;
54. }
55. }
56. }
57. dfs(l1,l2);
58. cout<
2. #include
3. #include
4. using namespace std;
5. #define MAXN 10005
6. int c[MAXN];
7. int a[MAXN];
8. int n;
9. int lowbit(int x)
10. {
11. return x&(-x);
12. }
13. void add(int x,int p)//对x位置增加p;
14. {
15. while(x<=n)
16. {
17. c[x]+=p;
18. x+=lowbit(x);
19. }
20. }
21. int getsum(int x)//1-x的和 ;
22. {
23. int res=0;
24. while(x)
25. {
26. res+=c[x];
27. x-=lowbit(x);
28. }
29. return res;
30. }
31.
32. int main()
33. {
34. cin>>n;
35. for(int i=1;i<=n;i++)
36. {
37. cin>>a[i];
38. }
39. memset(c,0,sizeof(c));
40. for(int i=1;i<=n;i++)
41. {
42. add(i,a[i]);//构造树状数组
43. }
44. int l,r;
45. while(cin>>l>>r)
46. {
47. cout<
2. #include
3.
4. using namespace std;
5. #define maxn 100005
6. int par[maxn];
7. int rank1[maxn];
8. int a[maxn],b[maxn];
9. char c[maxn];
10. int n,k;
11. void init(int n)//模板
12. {
13. for(int i=0;ia
16、多边形面积
1. #include
2. struct point{double x,y;};
3.
4.
5. //计算cross product (P1-P0)x(P2-P0)
6. double xmult(point p1,point p2,point p0){
7. return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
8. }
9. double xmult(double x1,double y1,double x2,double y2,double x0,double y0){
10. return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
11. }
12.
13.
14. //计算三角形面积,输入三顶点
15. double area_triangle(point p1,point p2,point p3){
16. return fabs(xmult(p1,p2,p3))/2;
17. }
18. double area_triangle(double x1,double y1,double x2,double y2,double x3,double y3){
19. return fabs(xmult(x1,y1,x2,y2,x3,y3))/2;
20. }
21.
22.
23. //计算三角形面积,输入三边长
24. double area_triangle(double a,double b,double c){
25. double s=(a+b+c)/2;
26. return sqrt(s*(s-a)*(s-b)*(s-c));
27. }
28.
29.
30. //计算多边形面积,顶点按顺时针或逆时针给出
31. double area_polygon(int n,point* p){
32. double s1=0,s2=0;
33. int i;
34. for (i=0;i
2. #include
3. using namespace std;
4. #define MAXN 1000005
5. typedef long long ll;
6. ll m[MAXN],a[MAXN];
7. ll n;
8. void exgcd(ll a,ll b,ll &x,ll &y)
9. {
10. if(!b)
11. {
12. x=1;
13. y=0;
14. return ;
15. }
16. exgcd(b,a%b,x,y);
17. ll t=x;
18. x=y;
19. y=t-(a/b)*y;
20. }
21.
22. ll crt(ll a[],ll m[],ll n)
23. {
24. ll M=1;
25. ll ans=0;
26. ll x,y;
27. for(ll i=0;i>n;
43. for(ll i=0;i>m[i]>>a[i];
46. }
47. cout<
2. #include
3. #include
4. using namespace std;
5. #define MAXN 1000050
6. char s[MAXN];
7. char t[MAXN];
8. int l1,l2;
9. int nxt[MAXN];
10. void getnxt()
11. {
12. int j,k;
13. j=0;
14. k=-1;
15. nxt[0]=-1;
16. while(j0&&s[i]!=t[j])
40. {
41. j=nxt[j];
42. }
43. if(s[i]==t[j])
44. {
45. j++;
46. }
47. if(j==l2)
48. {
49. ans++;
50. j=nxt[j];
51. }
52. }
53. return ans;
54. }
55. int main()
56. {
57. ios::sync_with_stdio(0);
58. cin.tie(0);
59. int T;
60. cin>>T;
61. while(T--)
62. {
63. cin>>t>>s;
64. l1=strlen(s);
65. l2=strlen(t);
66. cout<
2. #include
3. #include
4. using namespace std;
5. #define MAXN 1000500
6. int s[MAXN];
7. int t[MAXN];
8. int n,m;
9. int nxt[MAXN];
10. void getnxt()
11. {
12. int k,j;
13. j=0;
14. k=-1;
15. nxt[0]=-1;
16. while(j>T;
52. while(T--)
53. {
54. memset(nxt,0,sizeof(nxt));
55. cin>>n>>m;
56. for(int i=0;i>s[i];
57. for(int j=0;j>t[j];
58. cout<
2. #include
3. using namespace std;
4. int ans[200][3000];
5. void ktl()//卡特兰打表
6. {
7. ans[1][0]=1;
8. ans[2][0]=1;
9. ans[1][1]=1;
10. ans[2][1]=2;
11. int len=1;
12. int carry;
13. for(int i=3;i<=102;i++)
14. {
15. carry=0;//余数
16. for(int j=1;j<=len;j++)
17. {
18. int t=ans[i-1][j]*(4*i-2)+carry;//先求分子
19. carry=t/10;
20. ans[i][j]=t%10;
21. }
22. while(carry)
23. {
24. ans[i][++len]=carry%10;
25. carry/=10;
26. }
27. for(int j=len;j>=1;j--)
28. {
29. int t=ans[i][j]+carry*10;
30. ans[i][j]=t/(i+1);
31. carry=t%(i+1);
32. }
33. while(!ans[i][len])
34. {
35. len--;
36. }
37. ans[i][0]=len;
38. }
39. }
40. int main()
41. {
42. ktl();
43. int n;
44. while(cin>>n)
45. {
46. for(int i=ans[n][0];i>0;i--)
47. {
48. cout<
2. #include
3. #include
4. using namespace std;
5. #define MAXN 1000050
6. #define INF 0x3f3f3f3f
7. int dp[MAXN],n;
8. struct city
9. {
10. int p,r;
11. }s[MAXN];
12. bool cmp(city a,city b)
13. {
14. return a.p>n)
20. {
21. printf("Case %d:\n",cnt++);
22. for(int i=0;i
2. #include
3. #include
4. using namespace std;
5. #define MAXN 1000500
6. char s[MAXN];
7. char str[MAXN];
8. int p[MAXN];
9. int l1,l2;
10. void init()
11. {
12. str[0]='$';
13. str[1]='#';
14. for(int i=0;ii) p[i]=min(p[2*id-i],mx-i);
29. else p[i]=1;
30. for(;str[i+p[i]]==str[i-p[i]];p[i]++)
31. {
32. if(mx>s)
43. {
44. l1=strlen(s);
45. init();
46. manacher();
47. int ans=0;
48. for(int i=0;i
2. #include
3. #include
4. #include