ACM模板
ACM模版

大数除法16进制#include <stdio.h>#include <string.h>#define max 200int i;char jinzhi[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int chu(char a[],char b[]){int shan, yu;for(yu = i = 0; a[i]; i++){yu = yu * 10 + a[i] - '0';shan = yu / 16;yu = yu % 16;b[i] = shan + '0';}b[i] = 0;return yu;}int judge(char a[]){for(i = 0; a[i]; i++)if(a[i] != '0')return 0;return 1;}void f(char a[]){int newbig;if(!judge(a)){char b[max];newbig = chu(a,b);f(b);printf("%c",jinzhi[newbig]);}}int main(void){char bigint[max];while(scanf("%s", bigint) == 1){if(strlen(bigint) == 1 ){if(bigint[0] == '0')return 0;}f(bigint);printf("\n");memset(bigint,'0',sizeof(bigint));}return 0;}最大公约数int GCD(int num1,int num2)//最大公约数{if ( num1 % num2 == 0){return num2;}elsereturn GCD( num2,num1 % num2) ;}最小公倍数int LCM(int a,int b)//最小公倍数{int temp_lcm;temp_lcm=a*b/GCD(a,b); //最小公倍数等于两数之积除以最大公约数return temp_lcm;}//求至少多少天相遇,同时出发,至少多少长方形堆正方体,分元宝类问题都是运用最小公倍数最小生成树#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int inf = ( 1 << 20 ) ;int p[27]; // 并查集,用于判断两点是否直接或间接连通struct prog{int u;int v;int w;}map[80];//存储边的信息,包括起点/终点/权值bool cmp ( prog a , prog b){//排序函数,将边根据权值从小到大排return a.w<b.w;}int find(int x){//并查集的find,不解释return x==p[x]?x:p[x]=find(p[x]);}//减枝void join(int x,int y,int i){int fx=find(x),fy=find(y);if(fx!=fy){pre[fx]=fy;if(i!=-1) fee+=a[i].x;}return;}int main(){int n;while ( cin >> n , n ){int i , j ;for ( i = 0 ; i < 27 ; i ++ )p[i] = i ;//并查集初始化int k = 0 ;for ( i = 0 ; i < n - 1 ; i ++ ){//构造边的信息char str[3];int m;cin >> str >> m ;for ( j = 0 ; j < m ; j ++ ,k ++ ){char str2[3];int t;cin >> str2 >> t ;map[k].u=(str[0]-'A');map[k].v=(str2[0]-'A');map[k].w=t;}}sort ( map , map + k , cmp );//将边从小到大排序int ans=0; //所要求的答案for ( i = 0 ; i < k ; i ++ ){int x = find(map[i].u);int y = find(map[i].v);printf("%d%d\n",x,y);if( x!=y){//如果两点不在同一连通分量里,则将两点连接,并存储该边ans+=map[i].w;p[x]=y;}}cout<<ans<<endl;}return 0;}最大连续子序列-1235#include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>int a[10010],maxsum,t,e,n;void ff(){int i,l,j,sum;for(i = 0; i < n; i++){sum = 0;for(l = i; l < n; l++){sum += a[l];if(sum > maxsum){maxsum = sum;t = i;e = l;// printf("%d\n",maxsum);}// printf("%d %d %d\n",i,l,sum);}}}int main(){//freopen("1235input.txt","r",stdin);int f,i;while(scanf("%d",&n)&&n){memset(a,0,sizeof(a));f =0;maxsum = -10000;for(i = 0; i < n; i++){scanf("%d",&a[i]);if(a[i] < 0)f++;}if(f == n){maxsum = 0;t = 0;e = n-1;}elseff();printf("%d %d %d\n",maxsum,a[t],a[e]);}return 0;}素数表int a[10000];//1为素数void ff(){memset(a,1,sizeof(a));for(i=2;i<=10000;i++){if(a[i]==1){printf("%d ",i);for(l=i;l<=10000;l++){if(a[l]==1)if(l%i==0)a[l]=0;}}}}================int a[10000];void ff(){memset(a,1,sizeof(a));for(int i = 2; i < 10000; i++){if(a[i] == 0){int l = i;while(i * l < 10000){a[i*l]=0;l++;} }}}BFSinclude <stdio.h>#include <string.h>int x, y, mx, my,step;char map[110][110];int move[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};int recode[110][110];int f[110][110];struct duili{int x;int y;}a[110*110];bool judge(int m, int n){if(map[m][n]== '.' &&f[m][n]==2&& m>0 &&n>0&&m<y+1&&n<x+1) return 1;elsereturn 0;}int bfs(int i,int j){int front = 0,rear = 1;step = -1;recode[i][j] = 0; f[i][j]=1;a[front].x = i;a[front].y = j;while(front < rear){int xx = a[front].x, yy = a[front].y;front++;for(i = 0; i < 8; i++ ){if(judge(xx + move[i][0],yy + move[i][1])){f[xx + move[i][0]][yy + move[i][1]] =1 ;recode[xx + move[i][0]][yy + move[i][1]] = recode[xx][yy] + 1;a[rear].x = xx + move[i][0];a[rear].y = yy + move[i][1];rear++;if (recode[xx + move[i][0]][yy + move[i][1]] > step)step = recode[xx + move[i][0]][yy + move[i][1]];}}// for(int i = y; i > 0; i--)// {// for(int j = 1; j <= x; j++)// printf("%d",f[i][j]);// printf("\n");// }// printf("\n");}return step;}int main(){scanf("%d%d%d%d",&x, &y, &mx, &my);memset(map,0,sizeof(map));memset(f,0,sizeof(f));memset(recode,0,sizeof(recode));getchar();for(int i = y; i > 0; i--){for(int j = 1; j <= x; j++){scanf("%c",&map[i][j]);if(map[i][j]=='.')f[i][j]=2;}getchar();}// for(int i = y; i > 0; i--)// {// for(int j = 1; j <= x; j++)// printf("%c",map[i][j]);// printf("\n");// }printf("%d\n",bfs(mx,my));return 0;}CD_ROOM#include <stdio.h>int maxn;int n;int arr[20];int tempmax;void ff(int cur, int sum){if (sum > maxn)return;if (cur == n){tempmax >?= sum;return;}ff(cur + 1, sum);sum += arr[cur];ff(cur + 1, sum);}int main(void){while (tempmax = 0, scanf("%d", &n) == 1) {scanf("%d", &maxn);for (int i = 0; i < n; i++)scanf("%d", arr + i);ff(0, 0);printf("%d\n", tempmax);}return 0; }Floyed(最短路径)(可以有圈)#include <iostream>#include <string>#include <map>using namespace std;const int MAXN = 31;typedef double ValueType;//数据类型void Floyed(ValueType g[][MAXN],int n)//佛洛依德算法{for(int k=0;k<n;++k)for(int i=0;i<n;++i)for(int j=0;j<n;++j)if(g[i][j]<g[i][k]*g[k][j]) g[i][j] = g[i][k]*g[k][j];//尽可能使汇率大,这里是乘法(*)}int main(){int n,m,i,Case=0;string name,sour,dest;V alueType value;map<string,int> Currency; //用map实现name和index之间的转换V alueType graph[MAXN][MAXN];while(cin>>n){if(n==0) break;Currency.clear();memset(graph,0,sizeof(graph));for(i=0;i<n;++i)//n个顶点{cin>>name;Currency[name] = i;graph[i][i] = 1;}cin>>m;//m条边for(i=0;i<m;++i)//输入边信息创建图{cin>>sour>>value>>dest;graph[Currency[sour]][Currency[dest]] = value;}Floyed(graph,n);//佛洛依德求各个节点之间的bool ok = false;for(int i=0;i<n;++i)//求自身到自身的汇率(回路) if(graph[i][i]>1){ok=true;break;}cout<<"Case "<<++Case<<": ";if(ok) cout<<"Yes\n";else cout<<"No\n";}return 0;}3个for#include<stdio.h>#define MAX 100000000int main(){int n,m,a,b,t,i,j,k,map[202][202];while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++)for(j=1;j<=n;j++)map[i][j]=MAX;while(m--){scanf("%d%d%d",&a,&b,&t);map[a][b]=t;map[b][a]=t;}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(map[i][k]+map[k][j]<map[i][j])map[i][j]=map[i][k]+map[k][j];scanf("%d%d",&a,&b);if(map[a][b]==MAX||b>n||a<1)printf("-1\n");elseprintf("%d\n",map[a][b]);}}Dijkstra算法+注释#include <iostream>#include <string.h>#include <limits.h>#include <stdio.h>//hdu1874using namespace std;int map[1002][1002];int main(){int n,m;while(~scanf("%d%d",&n,&m)){int visted[205],dis[205];memset(visted,0,sizeof(visted)); //访问数组初始化for(int i=1;i<=n;++i){dis[i]=INT_MAX; //初始化两点之间的最短路径!!for(int j=1;j<=n;++j)map[i][j]=INT_MAX; //初始化两点间距离!!map[i][i]=0;}int a,b,c;while(m--){scanf("%d%d%d",&a,&b,&c);//输入两点间最短距离if(c<map[a][b])map[a][b]=map[b][a]=c;}int begin ,end ,pos;scanf("%d%d",&begin,&end);pos=begin;visted[pos]=1;//访问初始起始点。
ACM模板

我的ACM算法模板

ACM模板[王克纯2020年9月21日最大子串int maxSum(int * a,int n){int sum = a[0],b = 0;for(int i=0;i<n;++i){if(b>0) b += a[i];else b = a[i];if(b > sum) sum = b;}return sum;}int Kadane(const int array[], size_t length, unsigned int& left, unsigned int& right){unsigned int i, cur_left, cur_right;int cur_max, max;cur_max = max = left = right = cur_left = cur_right = 0;for(i = 0; i < length; ++i){cur_max += array[i];if(cur_max > 0){cur_right = i;if(max < cur_max){max = cur_max;left = cur_left;right = cur_right;}}else{cur_max = 0;cur_left = cur_right = i + 1;}}return max;} 快速幂void js(int &a,int &b,int num) {b=1;while(num){if(num&1) b*=a;num>>=1;a*=a;}}矩阵乘法struct mat{int n,m;//n行m列int data[MAX][MAX];};void mul(const mat& a,const mat& b,mat& c) //c=a*b{int i,j,k;if (a.m!=b.n); //报错c.n=a.n,c.m=b.m;for (i=0;i<c.n;i++){for (j=0;j<c.m;j++){for (c.data[i][j]=k=0;k<a.m;k++) {c.data[i][j]+=a.data[i][k]*b.dat a[k][j]%m;//m为余数}c.data[i][j]%=m;}}}Bit位操作(宏定义,内联函数,stl)} #define bitwrite(a,i,n)(n)?(a)[(i)/8]|=1<<(i)%8:(a)[(i)/8]&=~(1<<(i)%8)//数组a的第i位写入n;#define bitread(a,i)((a)[(i)/8]>>((i)%8))&1//读取数组a的第i位inline void write(int i,int n){n?a[i/8]|=1<<i%8:a[i/8]&=~(1<<i% 8);}inline int read(int i){return (a[i/8]>>(i%8))&1;}#include<bitset>bitset<MAX> b;错排公式为M(n)=n!(1/2!-1/3!+…..+(-1)^n/n!)M(n)=n!-n!/1!+n!/2!-n!/3!+…+(-1)^n*n!/n!=sigma(k=2~n) (-1)^k*n!/k!Dn=[n!/e+0.5]容斥原理M(n)=n![1/0!-1/1!+1/2!-1/3!+1/4! +..+(-1)^n/n!]二分模板LL findr(LL array, LL low, LL high,LL target){while(low <= high){LL mid = (low + high)/2;if (array[mid] > target) high = mid - 1;else if (array[mid] < target) low = mid + 1;else return mid;}return -1;复用代码#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 10void print(mat t){printf("*****************\n") ;for(int i=0;i<t.n;i++){for(int j=0;j<t.m;j++){printf("%d",t.data[i][j]);}putchar('\n');}}一些常量和函数:最大Long long __int64 INF = ~(((__int64)0x1)<<63);ceil()向上取整(math.h)floor()向下取整c字符串处理函数1)提取子串--strstr函数原型:char* strstr(char*src,char*find)函数说明:从字符串src中寻找find第一次出现的位置(不比较结束符NULL)返回值:返回指向第一次出现find位置的指针,如果没有找到则返回NULL2)接尾连接--strcat函数原型:char* strcat(char*dest,char*src)函数说明:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'3)部分连接--strncat函数原型:char* strncat(char*dest,char*src,int n);函数说明:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’’\0’.返回值:返回指向dest的指针。
acm常用板子题

acm常用板子题
ACM常用模板题包括但不限于:
字符串操作:如字符串匹配、字符串排序、字符串还原等题目,需要熟练掌握字符串的基本操作和常用算法。
数组操作:如数组排序、数组查找、数组分割等题目,需要熟练掌握数组的基本操作和常用算法。
树形结构:如二叉树、AVL树、红黑树等题目,需要熟练掌握树形结构的基本操作和常用算法。
图论算法:如最短路径、最小生成树、拓扑排序等题目,需要熟练掌握图论算法的基本操作和常用算法。
动态规划:如背包问题、最长公共子序列、最长递增子序列等题目,需要熟练掌握动态规划的基本操作和常用算法。
搜索算法:如深度优先搜索、广度优先搜索等题目,需要熟练掌握搜索算法的基本操作和常用算法。
数据结构:如哈希表、并查集、线段树等题目,需要熟练掌握数据结构的基本操作和常用算法。
以上是一些常见的ACM模板题,当然还有很多其他的题目类型。
要提高自己的ACM水平,需要多做题、多思考、多总结,不断拓宽自己的算法和数据结构知识面。
acm模板整理和使用方法

acm模板整理和使用方法[acm模板整理和使用方法]ACM模板指的是计算机科学中常用的算法模板,是计算机专业的学生在学习算法和数据结构时必需掌握的内容。
ACM模板整理和使用方法主要包括以下问题:一、为什么要使用ACM模板?ACM模板能使算法实现变得更简单、更方便、更快捷。
尤其在ACM竞赛中,使用优秀的模板可以节省编程时间,避免出现冗余代码,使得编程效率大幅提升。
二、哪些算法需要掌握?许多常见的算法,如快速排序、线段树、并查集、Kruskal算法、Dijkstra算法、最小生成树问题等,都需要掌握。
因此,算法学习和掌握是使用ACM模板的前提。
三、如何整理和使用ACM模板?1.整理ACM模板将常用的算法的代码整理,以函数或者类的形式存放在一个文件中。
注意代码要有良好的注释,易于阅读和理解。
2.旧的代码调试如果有其他ACM竞赛选手或者教练的旧代码,需要先将其调试通过。
因为在ACM比赛中,时间十分宝贵。
如果没有调试好的代码可以使用,建议可以使用OJ网站上的代码进行练习。
3.在比赛中使用和修改模板在ACM比赛中,选手需要快速编写正确的程序并提交到OJ网站。
使用模板可以节省时间和精力,但有时候需要针对具体的问题进行修改。
在修改时需要小心,一定要保证修改后的代码与原始模板的代码所实现的算法是等效的。
4.维护和更新模板ACM模板需要不断地维护和更新,特别是在涉及到新的算法或者数据结构时。
保证ACM模板的有效性和及时性非常重要,这需要持续的学习和探索。
四、如何学习和掌握ACM模板?1.选择学习和观察别人的代码一个好的方式是看国内和国际大佬们的代码,学习他们的代码风格和思考方式。
了解其他人的ACM模板如何实现,可以帮助你提高代码风格和技术水平。
2.探索自己不熟悉的算法和数据结构ACM竞赛中考察的算法不限于常见的算法,还包括各种数论、图论、动态规划等。
掌握这些算法和数据结构可以提高解题的速度和质量。
在掌握新算法之前,阅读相关论文或文章,掌握其基本原理和实现方法。
核心算法——ACM模板

一、贪心算法 (2)1、区间选点 (2)2、区间覆盖 (2)3、不相交区间 (2)4、哈夫曼编码 (2)5、最小值最大化、最大值最小化(二分查找) (2)二、动态规划 (5)1、最长公共子序列(LCS) (5)2、最长上升公共子序列(LIS) (7)3、子段和 (9)4、DAG上的动态规划 (13)5、区间DP (17)6、状态压缩DP (24)7、双线DP (30)8、背包问题(见背包九讲) (32)三、数据结构 (32)1、并查集 (32)2、树状数组 (34)3、(字符串)KMP匹配 (37)四、最小生成树算法 (41)Prime核心算法 (41)Kruskal算法 (44)五、单源最短路径 (50)Dijkstra核心算法 (50)Bellman_Ford算法 (54)SPFA算法(Bellman_Ford的队列实现) (58)六、二分图匹配 (61)1、匈牙利算法 (61)七、网络流 (63)1、SAP算法 (64)2、Dinic算法 (68)一、贪心算法1、区间问题区间选点选取尽量少的点覆盖所有的区间,是每个区间至少包含一个点。
对区间右端点进行排序。
区间覆盖选取尽量少的区间覆盖整个区域。
对左端点进行排序。
不相交区间选取尽量多的不相交区间。
对区间右端点进行排序。
2、哈夫曼编码3、最小值最大化、最大值最小化(二分查找)NYOJ 疯牛问题(最小值最大化)农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。
为了不让牛互相伤害。
John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int n, c;int pos[100005];bool judge(int k){int cnt = 1;int st = pos[0];for(int i = 1; i < n; ++i){if(pos[i] - st >= k){++cnt;if(cnt >= c)return true;st = pos[i];}}return false;}int Binary_search(int left, int right) /// 二分枚举满足条件的最大距离{while(left <= right){int mid = (left + right) >> 1;if(judge(mid)) /// 所求距离 >= mid,可以继续增大试探left = mid+1;else /// 所求距离 < mid,所以必须减小来试探right = mid-1;}return left-1;}int main(){while(~scanf("%d%d", &n, &c)){for(int i = 0; i < n; ++i)scanf("%d", &pos[i]);sort(pos, pos+n);printf("%d\n", Binary_search(0, pos[n-1] - pos[0]));}return 0;}NYOJ 摘枇杷(最大值最小化)理工学院的枇杷快熟了,ok,大家都懂得。
数据结构ACM模板

<数据结构>闭散列法整数hash#define max 4000037int hash[max],c[max];//hash存关键字,c存该位置关键字出现的次数bool use[max];int n,m,ans;int k[6],p[6];int locate(int k)//hash函数{int tmp;tmp = k;while(tmp<0)tmp+=max;while(tmp>=max)tmp-=max;while(use[tmp]&&hash[tmp]!=k){tmp++;if(tmp>=max)tmp-=max;}return tmp;}void insert(int k){int pos = locate(k);hash[pos] = k;use[pos] = 1;c[pos]++;}int onlyfind(int k){int pos = locate(k);if(hash[pos]==k)return c[pos];else return -1;}整数hash,开散列#include <stdio.h>#include <memory.h>#define MAX 3400000#define M 28999999int head[M],next[MAX];int lkey[MAX],up,ans;int n,m;int k[6],p[6];int hash(int key){int h;//h = ((key>>16)&&key)^(key>>8);h = ((~key)>>8)&&key ||( (key<<16) );h%=M;return h;}int find(int key){int h,p;h = hash(key);for(p=head[h];p>=0;p=next[p])if(lkey[p]==key)return 1;lkey[up] = key;next[up] = head[h];head[h] = up++;return -1;}int onlyfind(int key){int h,p;h = hash(key);for(p=head[h];p>=0;p=next[p])if(lkey[p]==key)return 1;return -1;}字符串hashint ELFhash(char *key) {unsigned h=0;while(*key) {h=(h<<4) + *key++;unsigned g=h & 0Xf0000000L;if(g) h^=g>>24;h &= ~g;}return h% M;}堆int heap[MAX+1],heapsize;void push(int key){int pos;pos = ++heapsize;while(pos>0&&heap[pos>>1]>key){heap[pos] = heap[pos>>1];pos>>=1;}heap[pos] = key;}void pop(){int key = heap[heapsize--];int pos,npos;pos = 1;npos = pos<<1;while(npos<=heapsize){if(npos+1<=heapsize&&heap[npos+1]<heap[npos])npos+=1;if(heap[npos]>=key)break;heap[pos] = heap[npos];pos = npos;npos = pos<<1;}heap[pos] = key;}二维树状数组int lowbit(int x){return x&(-x);}void updata(int x,int y,int w){int i,j;for(i=x;i<=n;i+=lowbit(i)){for(j=y;j<=n;j+=lowbit(j)){c[i][j]+=w;}}}int sum(int x,int y){int t=0,i,j;for(i=x;i>0;i-=lowbit(i)){for(j=y;j>0;j-=lowbit(j)){t+=c[i][j];}}return t;}Trie树#include<iostream>#define keyNum 26#define MaxN 50struct trie...{struct trieNode...{//trie结点的结构trieNode *link[keyNum];//下标为 'A' , 'B' , 'C' , , 'Z' 的指针数组 int num[keyNum];//插入key的次数trieNode()...{memset(num,0,sizeof(num));memset(link,NULL,sizeof(link));}void init()...{memset(link,NULL,sizeof(link));memset(num,0,sizeof(num));}};trieNode* root;trie()...{root=(trieNode*)malloc(sizeof(trieNode));//初始化时为root申请了空间 root->init();}bool Search(char *);void Insert(char []);void Delete(trieNode*);};bool trie::Search(char * x)...{if(*x==0)return false;trieNode* current=root;x++;while(*x)...{if(current->link[*(x-1)-'a'])current=current->link[*(x-1)-'a'];else break;x++;}if(*x==0&¤t->num[*(x-1)-'a'])return true;else return false;}void trie::Delete(trieNode* t)...{int i;for(i=0;i<keyNum;i++)if(t->link[i])Delete(t->link[i]);memset(t->num,0,sizeof(t->num));delete(t);}void trie::Insert(char x[])...{trieNode *current=root;int i=1;while(x[i])...{if(current->link[x[i-1]-'a']==NULL)...{current->link[x[i-1]-'a']=(trieNode*)malloc(sizeof(trieNode)); (current->link[x[i-1]-'a'])->init();}current=current->link[x[i-1]-'a'];i++;}(current->num[x[i-1]-'a'])++;}char c[ 50000 ][MaxN],tmp;int main()...{trie a;int i=0,j,num;while(scanf("%s",c[i])!=EOF)a.Insert(c[i++]);num=i;for(i=0;i<num;i++)for(j=1;c[i][j];j++)...{tmp=c[i][j];c[i][j]=0;if(a.Search(c[i]))...{c[i][j]=tmp;if(a.Search(&c[i][j]))...{ printf("%s ",c[i]);break;}}else c[i][j]=tmp;}a.Delete(a.root);return 0;}二叉查找树//key是字符串#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct BiTNode{char data[31];struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree p=NULL;void InorderBST(BiTree T){if(T->lchild) InorderBST(T->lchild);printf("%s\n",T->data);if(T->rchild) InorderBST(T->rchild);}int SearchBST(BiTree T,char key[],BiTree f){int tmp1,tmp2;tmp1=tmp2=0;if(!T) {p=f;return 0;}\\找不到返回路径上最后一点else if(!strcmp(key,T->data)) {p=T;return 1;}else if(strcmp(key,T->data)<0) tmp1=SearchBST(T->lchild,key,T); else tmp2=SearchBST(T->rchild,key,T);if(tmp1||tmp2) return 1;else return 0;}BiTree InsertBST(BiTree T,char e[]){BiTree s;if(!SearchBST(T,e,NULL))//查找不到,(若已经存在则放弃){s=(BiTree)malloc(sizeof(BiTNode));strcpy(s->data,e);s->lchild=s->rchild=NULL;if(!p) return s;else{if(strcmp(e,p->data)<0) p->lchild=s;else p->rchild=s;}}//else //若出现过做相应处理}/*int main(){BiTree T=NULL;char key[31];while(gets(key)!=NULL){if(T==NULL)T=InsertBST(T,key);//空树将返回指向根节点的指针else InsertBST(T,key);}InorderBST(T);return 0;}*/线段树#include<stdio.h>#include<memory.h>#define MAX 100001int up;int count[31];struct NODE{int l,r,flag;NODE *lcd,*rcd;void build(int i,int j);void insert(int i,int j,int k);void get(int i,int j);}node[MAX*4],*root=&node[0];void NODE::build(int i,int j){l=i;r=j;flag=1;if(l==r){lcd=rcd=NULL;}else{lcd=&node[up++];rcd=&node[up++];lcd->build(l,(l+r)/2);rcd->build((l+r)/2+1,r);}}void NODE::insert(int i,int j,int k) {if(i>r||j<l)return;if(i<=l&&j>=r){flag=k;return;}else{if(flag!=-1){lcd->insert(l,r,flag);rcd->insert(l,r,flag);}lcd->insert(i,j,k);rcd->insert(i,j,k);flag=-1;}}void NODE::get(int i,int j){if(i>r||j<l)return;if(flag!=-1){count[flag]=1;}else{lcd->get(i,j);rcd->get(i,j);}}int main(){int l,t,o,i,j,k,ans;char s[5];// freopen("in.txt","r",stdin);scanf("%d%d%d",&l,&t,&o);up=1;root->build(1,l);while(o--){scanf("%s",s);if(s[0]=='C'){scanf("%d%d%d",&i,&j,&k);root->insert(i,j,k);}else{scanf("%d%d",&i,&j);memset(count,0,sizeof(count));root->get(i,j);ans=0;for(i=1;i<=t;i++){if(count[i]){ans++;}}printf("%d\n",ans);}}return 0;}线段树动态运用#include<stdio.h>#include<memory.h>#include<algorithm>using namespace std;#define MAXN 1000001#define MAXM 50001int value[MAXN],dog[MAXN],b[MAXM],e[MAXM],rank[MAXM],ans[MAXM],ind[MAXM]; int up=1;struct NODE{int now,count;NODE *rcd,*lcd;void build(int i,int j);void insert(int key);void dele(int key);int get(int k);}node[MAXN*4],*root=&node[0];bool cmp(int p,int q){return b[p]<b[q]||b[p]==b[q]&&e[p]<e[q];}void NODE::build(int i,int j){now=(i+j)/2;if(i==j){lcd=rcd=NULL;}else{lcd=&node[up++];rcd=&node[up++];lcd->build(i,(i+j)/2);rcd->build((i+j)/2+1,j);}}void NODE::insert(int key){count++;if(lcd==NULL)return;if(key<=value[now]){lcd->insert(key);}else{rcd->insert(key);}}void NODE::dele(int key){count--;if(lcd==NULL)return;if(key<=value[now]){lcd->dele(key);}else{rcd->dele(key);}}int NODE::get(int k){if(lcd==NULL)return value[now];if(lcd->count>=k){return lcd->get(k);}else{return rcd->get(k-lcd->count);}}int main(){int n,m,i,j;// freopen("d:/in.txt","r",stdin);scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%d",&dog[i]);value[i]=dog[i];}sort(value,value+n);n=unique(value,value+n)-value;root->build(0,n-1);for(i=0;i<m;i++){scanf("%d%d%d",&b[i],&e[i],&rank[i]);b[i]--;e[i]--;ind[i]=i;}sort(ind,ind+m,cmp);for(i=b[ind[0]];i<=e[ind[0]];i++){root->insert(dog[i]);}ans[ind[0]]=root->get(rank[ind[0]]);for(i=1;i<m;i++){for(j=b[ind[i-1]];j<b[ind[i]];j++){root->dele(dog[j]);}for(j=e[ind[i-1]]+1;j<=e[ind[i]];j++){root->insert(dog[j]);}ans[ind[i]]=root->get(rank[ind[i]]);}for(i=0;i<m;i++){printf("%d\n",ans[i]);}return 0;}RMQvoid RMQ(int M[MAXN][LOGMAXN], int A[MAXN], int N){int i, j;//initialize M for the intervals with length 1for (i = 0; i < N; i++)M[i][0] = i;//compute values from smaller to bigger intervalsfor (j = 1; 1 << j <= N; j++)for (i = 0; i + (1 << j) - 1 < N; i++)if (A[M[i][j - 1]] < A[M[i + (1 << (j - 1))][j - 1]]) M[i][j] = M[i][j - 1];elseM[i][j] = M[i + (1 << (j - 1))][j - 1];}//产生的M[i][j]为[ i , j ]中最小的数//查询:[ l , r ]//k:=ln((r-l+1)/ln(2)); ans:=min(M[l,k],M[r-2^k+1,k]);LCA+RMQ#include <stdio.h>#include <math.h>#include <memory.h>#define MAX 1000int tree[MAX][MAX],first[MAX];int len[MAX],count[MAX];int node[2*MAX],deep[2*MAX],top;int M[MAX][32],in[MAX];int N;void dfs(int u,int pre,int d){int i,t;node[top] = u;deep[top] = d;if(first[u]==-1)first[u] = top;top++;for(i=0;i<len[u];i++){t = tree[u][i];if(pre==t)continue;dfs(t,u,d+1);node[top] = u;deep[top] = d;top++;}}void RMQ_init(){int i,j;for(i=0;i<top;i++)M[i][0] = i;for(j=1;(1<<j)<=top;j++)for(i=0;i+(1<<j)-1<top;i++)if(deep[M[i][j-1]]<deep[M[i+(1<<(j-1))][j-1]]) M[i][j] = M[i][j-1];elseM[i][j] = M[i+(1<<(j-1))][j-1];}int RMQ_query(int u,int v){int l,r,t;l = first[u];r = first[v];if(l>r){t = l;l = r;r = t;}t = log((double)(r-l+1))/log(2.0);if(deep[M[l][t]]<=deep[M[r-(1<<t)+1][t]]) return node[M[l][t]];elsereturn node[M[r-(1<<t)+1][t]];}int main(){//freopen("in.txt","r",stdin);int i,u,v,k,j,T,s;char ch;while(scanf("%d",&N)!=EOF){memset(len,0,sizeof(len));memset(in,0,sizeof(in));for(i=1;i<=N;i++){scanf("%d",&u);while((ch=getchar())!=':');while((ch=getchar())!='(');scanf("%d",&k);while((ch=getchar())!=')');for(j=1;j<=k;j++){scanf("%d",&v);in[v]++;tree[u][len[u]++] = v;//tree[v][len[v]++] = u;}}top = 0;memset(first,-1,sizeof(first));for(i=1;i<=N;i++)if(in[i]==0){s = i;break;}dfs(s,-1,0);RMQ_init();scanf("%d",&T);memset(count,0,sizeof(count));for(i=1;i<=T;i++){while((ch=getchar())!='(');scanf("%d%d",&u,&v);while((ch=getchar())!=')');s = RMQ_query(u,v);count[s]++;}for(i=1;i<=N;i++)if(count[i]>0)printf("%d:%d\n",i,count[i]);}return 0;}SB-Tree#include <stdio.h>int n,f;void solve(int a,int b,int c,int d){ //0,1,1,1if (b+d>n) return;solve(a,b,a+c,b+d);if(f){printf("%d/%d",a+c,b+d);f=0;}elseprintf(",%d/%d",a+c,b+d);solve(a+c,b+d,c,d);};int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);f=1;solve(0,1,1,1);printf("\n");}return 0;}。
ACM常用模板代码

{
k=s[i]*m+add;
if (k>=10)
{
s[i]=k%10;
add=k/10;
flag=1;
}
else
{
s[i]=k;
flag=0;
add=0;
}
}
if (flag)
{
l=i+1;
s[i]=add;
}
else l=i;
for (i=0; i<l; i++)
{
p=pr[i-1]*pr[1];
q=pi[i-1]*pi[1];
s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i]=p-q;
pi[i]=s-p-q;
}
for (it=0; it<=n-2; it=it+2)
{
vr=fr[it];
vi=fi[it];
fr[it]=vr+fr[it+1];
s2[i-j]=c;
}
s2[i+1]='\0';
}
7.最大公约数、最小公倍数
语法:resulet=hcf(int a,int b)、result=lcd(int a,int b)
参数:
a:
int a,求最大公约数或最小公倍数
b:
int b,求最大公约数或最小公倍数
返回值:
返回最大公约数(hcf)或最小公倍数(lcd)
k=k+1;
sum=sum/10;
}
for (i=blen-2;i>=0;i--)