小技巧

来源:互联网 发布:网络高级工程师认证 编辑:程序博客网 时间:2024/06/05 22:33
输入数据特别多时,读入优化,提高效率
inline int get() {     int a=0;     char s=getchar();     while(s<'0'||s>'9')         s=getchar();     while(s>='0'&&s<='9')         a=(a<<3)+(a<<1)+(s^'0'),s=getchar();     return a; }


简单的队列实现(借鉴洛谷):

const int MAXN=100000;//也可写成MAXN=1<<20
struct queue{int l,r,q[MAXN];queue() : l(1),r(0) {}inline void push(int x){q[++r]=x;//可以优化为q[++r & MAXN-1]=x;}inline void pop(){l++;}inline int front(){return q[1];//可以优化为retrun q[1 & MAXN-1];}inline bool size(){return l<=r;}};

手写栈(借鉴洛谷):

int top=0,st[100010];inline int top(){return st[top];}inline void pop(){top--;}inline void push(int x){st[++top]=x;//元素入栈 }

自定义排序对于求集体中的最大值以及有多个最大值时依靠字典序求最大值的题目应用较为方便:

以洛谷P1051谁拿了最多奖学金为例

bool mycmp(school x,school y){if(x.ans==y.ans)  return x.id<y.id;//字典序排序else              return x.ans>y.ans;}sort(a+1,a+1+n,mycmp);

地图类题目用到方向数组时,需要判断:

if(xx>0 &&x<m &&yy>0 &&y<n)//m行n列,xx和yy是坐标 

离散化基础(可减少排序次数)

a[0].val=-1;  int t=0;  for(int i=1;i<=n;i++)  {  if(a[i].val==a[i-1].val)  rank[a[i].id]=t;//val存数值,id是该数在原数据的位置 ,特判   else                      rank[a[i].id]=++t;  }

最大生成树:

void prim(){memset(dis,10,sizeof(dis));for(int i=1;i<=n;i++)  dis[i]=b[1][i];memset(vis,0,sizeof(vis));vis[1]=1;dis[1]=0;for(int i=2;i<=n;i++){int maxx=-100,c=0;for(int j=1;j<=n;j++)  if((!vis[j]) &&(dis[j]>maxx))  {  maxx=dis[j];  c=j;  }  vis[c]=1;  ans+=maxx;  for(int j=1;j<=n;j++)    if((b[c][j]>dis[j]) &&(!vis[j]))       dis[j]=b[c][j];}}

dfs判环:

void dfs(int k){for(int i=linkk[k];i;i=e[i].next){int t=e[i].y;if(t==root) end();//遍历到相同点,说明有环if(!vis[t]){++sum[root]; vis[t]=1;dfs(t);}}}void work(){for(int i=1;i<=n;i++){    memset(vis,0,sizeof(vis));vis[i]=1;root=i;//记录当前点 dfs(i);}}