一些代码在压缩路径同时合并距离_第1页
一些代码在压缩路径同时合并距离_第2页
一些代码在压缩路径同时合并距离_第3页
一些代码在压缩路径同时合并距离_第4页
一些代码在压缩路径同时合并距离_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

intfind_set(int{if(pre[x]==x)returnelsereturnpre[x]=}voidunion_set(intx,int{intxx=find_set(x);intyy=if(xx!=yy)pre[yy]=}intFind(int{returnintreturnparent[x]=tmp;}intUnion(intu,intv,intintreturn0;}void{for(inti=2;i<N;i++){if(!pt[i])pr[pn++]=i,pt[i]=i;for(intj=0;j<pn&&pr[j]*i<N;j++){pt[pr[j]*i]=pr[j];if(i%pr[j]==0)}}}intsolve(int{intans=1;while(n!=1){intintk=pt[n];//ptwhile{}}return}Primvoid{intintmin_id,now=0;doublemin_edge;doubledist[N];inti,for(i=0;i<n;{fa[i]=-dist[i]=}fori0;in1;i++)//{min_edge=forj0;jnj++)//{if(mm[now][j]>{if(mm[now][j]<{dist[j]=mm[now][j];fa[j]=now;}}}dist[now1.0;//已经加入生成树的点的距离置为-1for(j=0;j<n;j++){ifdist[j]>0&&dist[jmin_edge)//{min_edge=dist[j];min_id=j;}}nowmin_id;//更新新加进来的点sum+=min_edge;}}SPFA邻接链表#include<iostream>#include<queue>usingnamespacestd;constlonglmax constlongedge_maxn=10005; constlongpoint_maxn=105; structnode{/*node边,一个edge代表一条边*/intv; int intnext; //同一起点的下一条边在edge数组中的位置(理解了这个静态邻接表就int //以该点为起点的第一条边在edge数组中的位intn;//点的数量intm;//边的数量queue<int>Q;intdirs[point_maxn];boolvis[point_maxn];voidInit(){intIndex=1;inti,j,flag;intx,y,w;{if(y=={if(w<edge[j].w=w;flag=1;}}if(flag==edge[Index].v=y;edge[Index].w=edge[Index].next //xedgepre[x]=Index++; edge[Index].v=y;edge[Index].w=edge[Index].next=pre[x];pre[x]=Index++;}}voidprint(int{}void{intstart=1;intend=n;{}dirs[start]=vis[start]=1;{inttopQ.front();边的起点vis[top]={inteedge[j].v;if(dirs[e]>edge[j].w+{dirs[e]=edge[j].w+dirs[top];{vis[e]=}}}}}int{while(scanf("%d%d",&n,&m)!=EOF&&(n!=0||{}return}struct{doublejung(juaa,jubb,int{jucc;doubleans;{{{}}}return}{{ans=}oo=}0for(i=0;i<n;for(j=0;j<n;if(a[i][j]==0)continue;for(k=0;k<n;{c[i][k]+=a[i][j]*}}}TarjanvoidInit_Tarjan(intn){for(inti=1;i<=n;i++){dfn[i]=low[i]=Belong[i]=0;}}voidTarjan(intu){intv;} }}}intfor(i=1;i<=n;i++)if(!dfn[i])Tarjan(i);for(i=1;i<=n;i++)for(j=0;j<G[i].size();{k=if(Belong[i]!=}#include<stdio.h>#definemaxint64int64voidMerge(longlonga[],intstart,intmid,int{inti=start,j=mid+1,k=start;while(i<=mid&&j<=end){if(a[i]<={}{}}

b[k++]=count+=j-k;b[k++]=a[j++];while(i<={b[k++]=}while(j<={b[k++]=}for(inti=start;i<=end;{a[i]=}}voidMergeSort(longlonga[],intstart,int{if(start<{intmid=(start+end)/2;}}intmain(intargc,charconst{int64{count0;//记录逆序数个数for(inti=0;i<m;i++){}}return}constintmod vector<int64> int64 //初始化的时候要for(i=0;i< ;i++)ha[i].clear();voidinsert(int64x){intp=abs(x)%mod;}intfind(int64{intp=abs(x)%for(inti=0;i<ha[p].size();i++)if(ha[p][i]==x)return1;return0;}while{inttmp=word[i]-if(now->next[tmpNULL)//{}{}

trie*nextnewtrie();//newnow->next[tmp]=nownow->next[tmp];//dfs}}intsearch(trie*root,char*{trie*now=root;inti=0;while{inttmp=word[i]-if(now->next[tmpNULL)return0;//如果没有下一个那么就没有要找的前缀now=now->next[tmp];}returnnow->count;//return0}int{trie*rootnewtrie();//}struct{intx,}nn[510],e[510],intcmp(nodea,node{if(a.x==b.x)returna.y<b.y;returna.x<b.x;}intcross(nodea,nodeb,nodec)//{return(a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-}{sort(e,e+n,intm0,i,jk;////mi,则向量(m-2,i)必定要在(m-2,m-1)的逆时针方向m-1点不在凸包上。for(i=0;i<n;{while(m>1&&cross(res[m-1],e[i],res[m-2])<=0)m--;res[m++]=e[i];}k=m;//求得上凸包forin2;i0;i--){while(m>k&&cross(res[m-1],e[i],res[m-2])<=0)m--;res[m++]=e[i];}ifn>1)m--;//returnm;(处理完后凸包上的点的个数}for(i=0;i<marki;{for(j=0;j<len;{if(cross(res[j],e[i],res[(j1len])0)//e[i]}}constintMAX_M=201;constintMAX_N=201;vector<int>g[MAX_M+MAX_N];//这里最大一定要设置两个值得和intmatch[MAX_MMAX_N];//1~N和N+1~N+M两部分intuse[MAX_M+MAX_N];intv,n,voidadd_edge(intu,int{g[u].push_backg[v].push_back(u);//}intdfs(intx)//dfs{inti,j;use[x]=1;for(i=0;i<g[x].size();{intu=g[x][i],w=if(w<0||!use[w]&&dfs{match[x]=u;match[u]=x;return1;}}return}inthungary{

intdfs(intx)//{inti,for(i=0;i<g[x].size();{intu=g[x][i],w=match[u];if(use[u])continue;use[u]=if(w<0||{match[u]=x;return1;}}return}intres=memset(match,1,sizeof(match));//单方匹配去掉这个for(v=1;v<=n+m;v++){if(match[v]==-{memset(use,0,sizeof(use));if(dfs(v))res++;}}return}intmain()中要注意的地方:fori0;iMAX_MMAX_N;i++)g[i].clearadd_edge(n+u,i);constintMAX_N100010;/mnconstintMAX_M11;/nintmm[MAX_N][MAX_M],match[MAX_M][MAX_N],use[MAX_M],limit[MAX_M],has[MAX_M];intv,n,m;match[MAX_M][MAX_Nmimatch[MAX_M][MAX_Nmiuse[MAX_M]nmlimit[MAX_M]mnhas[MAX_M]mn{inti,for(i=0;i<m;{if(mm[x][i]&&{use[i]=if(has[i]<{match[i][has[i]++]=x;return1;}for(j=0;j<limit[i];{if{match[i][j]=x;return1;}}}}return}inthungary()inthungary(){intres=memset(has,0,memset(match,-1,sizeof(match));for(v=0;v<n;v++){memset(use,0,sizeof(use));if(dfs(v))res++;}return}{memset(has,0,memset(match,-1,sizeof(match));for(v=0;v<n;v++){memset(use,0,sizeof(use));if(!dfs(v)){return}}return}intdfs(int{for(inti=0;i<bg[x].size();{intv=if{vis[v]=if(match[v]==-1||{match[v]=x;return1;}}}return}void{intcnt=memset(match,-1,sizeof(match));for(inti=1;i<=CNT;i++){memset(vis,0,sizeof(vis));if(dfs(i))cnt++;}printf("%d\n",CNT-}最大流,Dinicvoidbfs(int{memset(level,-1,queue<int>que;level[st]=0;que.push(s);while(!que.empty()){intv=que.front();que.pop();for(inti=0;i<n+2;i++){if(flow_map[v][i]>0&&level[i]<{level[i]=level[v]+1;que.push}}}}intdfs(intvintuintf)//u{if(v==u)returnfor(inti=0;i<n+2;{if(flow_map[v][i]>0&&level[v]<{intd=dfs(i,u,min(f,flow_map[v][i]));if(d>0){flow_map[v][i]-=d;flow_map[i][v]+=d;return}}}return}intmax_flowintst,inted)//Dinic{intflow=0;for(;;){bfsif(level[ed]<0)returnflow;intf;while((f=dfs(st,ed,inf))>0)flow+=}}最大流,Dinicintlevel[边最大];intiter[边最大];structedge{intto,cap,voidadd_edge(intfrom,intto,int{edgee;e.to=to;e.cap=e.rev=G[to].sizeG[from].push_back(e);e.to=from;e.cap=e.rev=G[from].size()-}voidbfs(int{memset(level,-1,sizeof(level));queue<int>que;level[s]=0;que.push(s);while{intv=que.front();que.pop();for(inti=0;i<G[v].size();i++){edge&e=if(e.cap>0&&level[e.to]<{level[e.to]=level[v]+1;que.push(e.to);}}}}intdfs(intv,intt,int{if(v==t)returnfor(int&i=iter[v];i<G[v].size();{edge&e=if(e.cap>0&&level[v]<{intd=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=G[e.to][e.rev].cap+=d;returnd;}}}return}intmax_flow(ints,int{intflow=0;for(;;){bfsif(level[t]<0)returnmemset(iter,0,sizeof(iter));;intf;while((f=dfs(s,t,inf))>0){flow+=f;}}KMPvoidgetNxt()nxt[0]=-inti=0,j=-while(i<p.size())if(j==-1||p[i]==p[j])ijnxt[i]=}}}

j=intkmp()inti=0,j=0,ans=0;while(i<s.size()){if(j==-1||s[i]==p[j])ij}j=if(j==ans}return}intn,intindegree[maxn0};//每个点的入边条数vector<int>v[maxn];//邻接链表set<int>intans[maxn];voidreadin(){intscanf("%d%d",&n,&m);for(i=1;i<=n;i++)while(m--)scanf("%d%d",&i,&jv[i].push_back(j);indegree[j]++;}}int{inti,pos=0;for(i=1;i<=n;i++if(indegree[i]==0)s.insert(i);while(!s.empty(){i=*s.begin();s.erase(s.begin()while(!v[i].empty(){if(--indegree[v[i].back()]==0s.insert(v[i].back());v[i].pop_back();}}ifreturn}

returnconstintMAX_N=200010;#definelson(x)((x)<<1)#definerson(x)((x)<<1|1)struct{intl,r,}nn[MAX_N*3];intintbuild_tree(intleft,intright,int{intnn[i].l=left;nn[i].r=right;if(left==right){returnnn[i].maxx=}mid=(left+right)/returnnn[i].maxx=max(build_tree(left,mid,lson(i)),build_tree(mid+1,right,}voidupdate(intcid,intva,int{intmid=(nn[i].l+nn[i].r)/if(nn[i].l=={}{}}

nn[i].maxx=va;if(cid<=mid)update(cid,va,lson(i));elseupdate(cid,va,rson(i));nn[i].maxx=max(nn[lson(i)].maxx,intquery(intleft,intright,int{intif(nn[i].l==left&&nn[i].r==right)returnnn[i].maxx;mid=(nn[i].l+nn[i].r)/2;if(right<=mid)returnquery(left,right,elseif(left>mid)return query(left,right,rson(i));{inta=query(left,mid,intb=query(mid+1,right,rson(i));returnmax(a,b);}}query(l,r,change(cid,va,lazyconstintMAX_N100010;#definelson(x)((x)<<1)#definerson(x)((x)<<1|1)intstruct{intl,r,sum;intlazy;}nn[MAX_N*4];voidpush_up(inti){nn[i].sum=nn[lson(i)].sum+}voidpush_down(int{if{nn[lson(i)].lazy=nn[rson(i)].lazy=nn[lson(i)].sum=(nn[lson(i)].r-nn[lson(i)].l+nn[rson(i)].sum=(nn[rson(i)].r-nn[rson(i)].l+1)*nn[rson(i)].lazy;nn[i].lazy=0;}}voidbuild_tree(intleft,intright,int{intnn[i].l=left;nn[i].r=right;nn[i].lazy0;//lazy0,不单单叶子节点if(left==right){nn[i].sum=1;}mid=(left+right)/2;build_tree(left,mid,lson(i));build_tree(mid+1,right,rson(i));}voidupdate(intleft,intright,intva,int{intmid=(nn[i].l+nn[i].r)/if{nn[i].lazy=nn[i].sum=(nn[i].r-nn[i].l+1)*va;}if(right<=mid)update(left,right,va,lson(i));elseif(left>mid)update(left,right,va,rson(i));{update(left,mid,va,lson(i));update(mid+1,right,va,rson(i));}}voidquery(intleft,intright,int{intif(nn[i].l==left&&nn[i].r=={ans+=nn[i].sum;}mid=(nn[i].l+nn[i].r)/if(right<=mid)query(left,right,elseif(left>mid)query(left,right,rson(i));{query(left,mid,lson(i));query(mid+1,right,rson(i));}}HDU48932014(可作为线段树模板)n0的k kl lrlr 改变从l到r所有元素,都为原元素最近的Fibonacci数,差值相等时取较小值处理的方案就是提前对每一段的区间和都找到相应的Fibonacci#include<cstdio>#include<cmath>usingnamespacestd;#defineN100010structnodeintL,longlongsum,intflag;//1vsumsumlazy}tree[N<<2];longlonglonglongffib(longlongval){longlongx=0,y=1;intfor(i=0;i<100;++i){y=x+y;x=y-if(y>=}if(fabs(y-val)<fabs(x-val))returny;return}voidPushUP(intp)if(tree[p].L==tree[p].R)tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;tree[p].vsum=tree[p<<1].vsum+tree[p<<1|1].vsum;}voidPushDown(intp)if(tree[p].flag&&tree[p].Ltree[p].R是叶子节点就不用往下更了tree[p].sum=tree[p].vsum;tree[p].flag=0;}if(tree[p].flag)tree[p1].flagtree[p1|1].flag1;//儿子要继续往下更tree[p<<1].sum=tree[p<<1].vsum;tree[p<<1|1].sum=tree[p<<1|1].vsum;tree[p].flag0;//0}}voidbuild(intL,intR,intp){tree[p].L=L;tree[p].R=R;tree[p].flag=0;if(L==R){tree[p].sum0;//0tree[p].vsum=1;//0fib1fibsum1}intmid=(L+R)>>1;build(L,mid,p<<1);build(mid+1,R,p<<1|1);PushUP(p);//sum和vsumvsum,sum}voidadd(intpos,intval,intp)if(tree[p].Ltree[p].R)确定要叶子节点,也就是要加的那个点时tree[p].sum+=val;tree[p].vsumffib(tree[p].sum);//fibsumtree[p].flag=0;}intmid=(tree[p].L+tree[p].R)>>1;if(mid>=pos)add(pos,val,p<<1);elseadd(pos,val,p<<1|1);}voidupdate(intL,intR,intp)if(L<=tree[p].L&&R>=tree[p].R)tree[p].flag1;//1tree[p].sum=tree[p].vsum;}PushDown(p);//三个函数都要有PushDown和PushUpflagupdate的时候1intmid=(tree[p].L+tree[p].R)>>1;if(mid>=R)update(L,R,p<<1);elseif(mid+1<=L)update(L,R,p<<1|1);else{update(L,mid,p<<1);update(mid+1,R,p<<1|1);}voidquery(intL,intR,intp)if(L<=tree[p].L&&R>=tree[p].R){ans+=tree[p].sum;}intmid=(tree[p].L+tree[p].R)>>1;if(mid>=R)query(L,R,p<<1);elseif(mid+1<=L)query(L,R,p<<1|1);else{query(L,mid,p<<query(mid+1,R,p<<1|}intmain()//freopen("in.txt","r",stdin);intn,m,i;intop,x,while(scanf("%d%d",&n,&m)!=EOF){build(1,n,1);for(i=0;i<m;++i)scanf("%d%d%d",&op,&x,&y);if(op==1){add(x,y,}elseif(op==2){ans=0;query(x,y,printf("%I64d\n", //}elseif(op==3){update(x,y,1);}}}return}HDU49712014多校赛一共有n个任务,m个技术,完成一个任务可一些钱,学个#include<cstdio>#include<cstring>#include<vector>#include<algorithm>#definesz1000#defineinf0x3fffffffusingnamespacestd;intn,m;inta[sz],b[sz];vector<int>p[sz];vector<int>g[sz],intlow[sz],dfn[sz],stack[sz],instack[sz],belong[sz],cost[sz];intdeep,top,kinds;voidtarjan(ints)//tarjan模{low[s]=dfn[s]=deep++;stack[++top]=s;instack[s]=1;for(inti=0;i<g[s].size();{intt=if(dfn[t]==-{tarjanlow[s]=min(low[t],}elseif{low[s]=min(dfn[t],}}if(low[s]=={intintct=0;{t=stack[top--belong[t]=kinds;//每个属于哪个缩点后的点instack[t]=0;ct+=b[t];}while(t!=cost[kinds]ct;//cost记录缩点后的点集中包含的几个技术的花费和}}structnode{ints,t,v,nxt;}e[sz*inthd[sz],dis[sz],cur[sz],que[sz],cnt,S,T;voidinsert(ints,intt,intv){e[cnt].s=s,e[cnt].t=t,e[cnt].v=v,e[cnt].nxt=hd[s],hd[s]=e[cnt].s=t,e[cnt].t=s,e[cnt].v=0,e[cnt].nxt=hd[t],hd[t]=}boolbfs(ints,intt,intn){inthead=0,tail=0,i;memset(dis,-1,sizeof(dis[0])*(n+1)),dis[s]=0;que[tail++]=s;whilefor(i=hd[que[head++]];i!=-1;i=if(e[i].v>0&&dis[e[i].t]==-dis[e[i].t]=dis[e[i].s]+1;if(e[i].t==t)return1;que[tail++]=e[i].t;}}return}intdinic(ints,intt,intn){//最大流模板,这个无视,暂时还只会套模板,有点看不懂inti,mf=0,tp;while(bfs(s,t,for(i=0;i<n;i++)cur[i]=hd[i];intu=s,tail=0;while(cur[s]!=-if(u!=t&&cur[u]!=-1&&e[cur[u]].v>0&&dis[u]+1==dis[e[cur[u]].t]){que[tail++]=cur[u];u=e[cur[u]].t;}elseif(u==for(tp=inf,i=tail-1;i>=0;i--)tp=min(tp,e[que[i]].v);for(mf+=tp,i=tail-1;i>=0;i--){e[que[i]].v-=tp;e[que[i]^1].v+=tp;if(e[que[i]].v==0)tail=i;}u=}elsewhile(u!=s&&cur[u]==-1)u=e[que[--tail]].s;cur[u]=e[cur[u]].nxt;}}}return}voidmake_map{for(inti=0;i<kinds+n;i++)ng[i].clear();for(inti=0;i<m;for(intj=0;j<g[i].size();{intt=if(belong[i]!={ng[belong[i]].push_back}}for(inti0;i<n;i++)//下标[0,kinds)是技术的缩点,[kinds,kinds+n)是项目的{intid=i+for(intj=0;j<p[i].size();ng[id].push_back//项目和技术之间建边,belong[p[i][j]]技术所属缩点后点}for(inti=0;i<kinds+n;{sort(ng[i].begin(),ng[i].endng[i].resize(unique(ng[i].begin(),ng[i].end())-ng[i].begin//一个项目可能用到的多个技术缩点后在同一个点集中,所以取}memset(hd,-1,sizeof(hd));cnt=0;S=kinds+T=S+for(inti0;i<n;i++)//源点s往所有的项目建流量为收益的边insert(S,i+kinds,a[i]);for(inti=0;i<n+kinds;for(intj0;j<ng[i].sizej++)//中间的点的流量全是infinsert(i,ng[i][j],inf);for(inti0;i<kinds;i++)//所有技术往汇点t建权值为花费的insert(i,T,cost[i]);}intmain{intscanf("%d",for(intcas=1;cas<=cs;{scanf("%d%d",&n,&m);intsum=0;for(inti=0;i<n;scanf("%d",&a[i]),sum+=a[i];for(inti=0;i<m;i++)scanf("%d",&b[i]);intnum,c;for(inti=0;i<n;{scanf("%d",p[i].clearfor(intj=0;j<num;{scanf("%d",p[i].push_back(c);//p用来记录每个项目需要哪些技}}for(inti=0;i<m;{g[i].clearfor(intj=0;j<m;{scanf("%d",&c);if(c)g[i].push_back(j);//有向图记录各个技术之间的先后关}}memset(dfn,-1,sizeof(dfn));top=deep=kinds=0;for(inti=0;i<m;i++)if(dfn[i]==-1)tarjan(i);//技术成环,所以缩点make_map最大闭合权图,建图是个关键intret=sum-dinic(S,T,T+1);printf("Case#%d:%d\n",cas,ret);}return}等于k,则这样称为法。给定n,k,L,求方案数。11(10表示不能)第2为2d[1<<n]DPnk位为1的就可以加上方法数。状态表示111:1能得到,2能得到,3101:1能得到,2得不到,3#include<iostream>#defineLLlonglong#defineMOD#definedebug(x)printf(#x"=%d\n",x);usingnamespacestd;intint{inttt,n,k,L;{intw=(1<<k)-1;//w1inttot=0;if(L>k)//totk能取的数l超过(k,L]这部分用不上,{}while(n--)//n{{intLL(k,L]的个数,k>l0{intsta=i|(1<<(j-加上一个值就是下一个状态能达到的那些数。(1<<(j-1))是从0开始加j因为0位没法位移,1位移然后或上去。最后&w是截掉超过最大状态的那一部分}}}intif((i>>(k-1))&1)//k{}}}n41#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<iostream>#include<algorithm>usingnamespacestd;typedefint64LL;constLLNUM=10;//运算次数,Miller_Rabin2^(-NUM);LLt,f[100];LLmul_mod(LLa,LLb,LLn)//a*b%nab{LLs=0;{}return}LLpow_mod(LLa,LLb,LLn)//{LL{}return}boolcheck(LLa,LLn,LLr,LL{LLans,p,i;{if(ans==1&&p!=1&&p!=n-1)returntrue;}if(ans!=1)returntrue;returnfalse;}boolMiller_Rabin(LLn)//Miller_Rabinn{if(n<2)returnfalse;if(n==2)returntrue;LLi,r,s,a;{return}return}LL(LLa,LL{returnb==0?a:}LLPollard_rho(LLn,LLc)//Pollard_rh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论