NOIP2018退役总结

长存不灭的过去——逐渐消失的未来

退役前写了点模板,留作纪念,也祝我NOIP2018++RP

没时间了,就800行吧!

#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline int read()//读入优化 
{
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-f;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
priority_queueq;//优先队列 
int priorityqueue()
{
	q.push();
	q.top();
	q.pop();
	q.back();
	q.empty(); 
}
void add(int a,int b,int c)//建图 
{
	p++;
	to[p]=b;
	next[p]=last[a];
	last[a]=p;
	w[p]=c;
}
int find(int k)//find函数 
{
	if(fa[k]==k)return k;
	return fa[k]=find(fa[k]);
}
void merge(int a,int b)//合并两个集合 
{
	int a=find(a),b=find(b);
	if(a!=b)fa[a]=b;
}
int gcd(int a,int b)//求最大公约数 
{
	if(!b)return a;
	return gcd(b,a%b);
}
int exgcd(int a,int b,int &x,int &y)//求a在%b意义下的逆元 
{
	if(b)
	{
		exgcd(b,a%b,y,x);
		y-=(a/b)*x;
	}
	else
	{
		x=1;y=0;
	}
} 
int lcm(int a,int b)//求最小公倍数 
{
	return a/gcd(a,b)*b;
}
int erfen()
{
	l=0,r=max;
	while(l>1;
		if(check(mid))l=mid+1;
		else r=mid;
	}
	return l;
}
int ksm(int a,int b)//快速幂 
{
	int ans=1,c=a;
	while(b!=0)
	{
		if(b&1!=0)ans*=c;
		c*=c;
		b>>1;
	}
	return ans;
}
int ola(int n)//欧拉筛 
{
	int cnt=0;
	for(int i=2;i<=n;i++)
	{
		if(!v[i])p[cnt++]=i;
		for(int j=0;j'9')ch=getchar();
    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';x%=mod;ch=getchar();}
    return x;
}
int ylsqy()//有理数取余 
{
    a=read();b=read();
    if(b==0)
    {
        cout<<"Angry!";
        return 0;
    }
    exgcd(b,mod,x,y); 
    cout<<(a*(x+mod)%mod+mod)%mod;
}
int jcdp()//基础dp
{
	for(int i=1;i<=n;i++)//01背包 
	for(int j=m;j>=w[i];j--)
	f[j]=max(f[j],f[j-w[i]]+v[i]);
	
	for(int i=1;i<=n;i++)//完全背包 
	for(int j=w[i];j<=m;j++)
	f[j]=max(f[j],f[j-w[i]]+v[i]);
	
	for(int i=1;i<=n;i++)//最长不下降子序列(滚动数组优化) 
	{
		mx=0;
		for(int j=1;j<=a[i];j++)
		mx=max(mx,f[j]);
		f[a[i]]=mx+1;
	}
	
	for(int i=1;i<=n;i++)//最长公共子序列 
	for(int j=1;j<=n;j++)
	{
		f[i][j]=max(f[i][j-1],f[i-1][j]);
		if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
	}
} 
int spfa()//单源最短路径 
{
	n=read(),m=read(),s=read(),e=read();
	for(int i=1;i<=n;i++)
	{
		a=read(),b=read(),c=read();
		add(a,b,c);
		add(b,a,c);
	}
	for(int i=1;i<=n;i++)ans[i]=2147483647;
	ans[s]=0;v[s]=1;q[1]=s;h=0;t=1;
	while(hans[i]+w[pp])
			{
				ans[to[pp]]=ans[i]+w[pp];
				if(!v[to[pp]])
				{
					v[to[pp]]=1;
					t++;
					q[t]=to[pp];
				}
			}
			pp=next[pp];
		}
	}
}
int floyd()//多源最短路 
{
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
		map[i][j]=2147483647;
	for(int i=1;i<=n;i++)map[i][i]=0;
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		if(map[i][j]>map[i][k]+map[k][j])
		map[i][j]=map[i][k]+map[k][j];
	}
}
void add(int a,int b,int c)//次短路 
{
    p++;
    to[p]=b;
    next[p]=last[a];
    last[a]=p;
    w[p]=c;
    star[p]=a;
}
void spfa ()
{
    for(int i=1;i<=n;i++)
    ans[i]=20010129;   
    q[1]=1;
    ans[1]=0;
    v[1]=1;h=0;t=1;
    while(hw[pp]+ans[i])
            {
                ans[to[pp]]=w[pp]+ans[i];
                if(e!=1)per[to[pp]]=pp;
                if(!v[to[pp]])
                {
                    t++;
                    q[t]=to[pp];
                    v[to[pp]]=1;
                }
            }
            pp=next[pp];
        }
    }
    e=1;
}
int cdl()
{
    memset(per,-1,sizeof per );
    n=read(),m=read(); 
    for(int i=1;i<=m;i++)
    {
        a=read(),b=read(),c=read();
        add(a,b,c);
        add(b,a,c);
    }
    int tm=n;
    spfa();
    while(per[tm]!=-1)
    {
    	r=w[per[tm]];
    	w[per[tm]]=20010129;
    	spfa();
    	if(ans[n]!=20010129)
        mx=max(mx,ans[n]);
    	w[per[tm]]=r;
    	tm=star[per[tm]];
    }
    cout<q;//拓扑求最长路 
int topu()
{
	n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		a=read(),b=read(),c=read();
		add(a,b,c);ru[b]++;
	}
	for(int i=1;i<=n;i++)if(!ru[i])q.push(i);
	while(!q.empty())
	{
		x=q.front();q.pop();
		for(int i=last[x];i;i=next[i])
		{
			if(f[to[i]]d[y])x=fa[x][lg[d[x]-d[y]]-1];
    if(x==y)return x;
    for(int k=lg[d[x]];k>=0;k--)
    if(fa[x][k]!=fa[y][k])
    {
        x=fa[x][k];
        y=fa[y][k];
    }
    return fa[x][0];
}
int LCA()
{
	n=read();m=read();s=read();
    for(int i=1;in)return 1;
        v[i]=0;
        pp=last[i];
        while(pp)
        {
            if(ans[to[pp]]>ans[i]+w[pp])
            {
                ans[to[pp]]=ans[i]+w[pp];
                cnt[to[pp]]=cnt[i]+1;
                if(cnt[to[pp]]>n)return 1;
                if(!v[to[pp]])
                {
                    v[to[pp]]++;
                    t++;
                    q[t]=to[pp];
                }
            }
            pp=next[pp];
        }
    }
    return 0;
}
struct AC //最小生成树 
{
    int a,b,v;
}lxx[N];
bool cmp(AC const a,AC const b)
{
    return a.v q;//缩点,建DAG新图,求最大点权路径 
struct ac
{
    int to,next,last;
}e[500010];
void add(int a,int b)
{
	p++;
	e[p].to=b;
	e[p].next=e[a].last;
	e[a].last=p;
}
int tarjan(int x)
{
	low[x]=dfn[x]=++dep;
	stack[++top]=x;v[x]=1;
	for(int i=e[x].last;i;i=e[i].next)
	{
		if(!dfn[e[i].to])tarjan(e[i].to),low[x]=min(low[x],low[e[i].to]);
		else if(v[e[i].to])low[x]=min(low[x],low[e[i].to]);
	}
	if(low[x]==dfn[x])
	{
		now[x]=++tot;
		v[x]=0;
		while(stack[top]!=x)
		{
			now[stack[top]]=tot;
			v[stack[top--]]=0;
		}
		top--;
	}
}
void build()
{
	for(int i=1;i<=n;i++)
	{
		f[now[i]]=sum[now[i]];
		for(int j=e[i].last;j;j=e[j].next)
		{
			if(now[i]!=now[e[j].to])
			{
				next[j]=last[now[i]];
				last[now[i]]=j;
				ru[now[e[j].to]]++;
			}
		}
	}
}
void tuopu()
{
	for(int i=1;i<=n;i++)
	if(!ru[now[i]]&&!v[now[i]])q.push(now[i]),v[now[i]]=1;
	while(!q.empty())
	{
		int x=q.front();q.pop();
		for(int i=last[x];i;i=next[i])
		{
			f[now[e[i].to]]=max(f[now[e[i].to]],f[x]+sum[now[e[i].to]]);
			ru[now[e[i].to]]--;
			if(!ru[e[i].to]&&!v[e[i].to])q.push(now[e[i].to]),v[now[e[i].to]]=1;
		}
	}
}
int TARJAN()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)w[i]=read();
	for(int i=1;i<=m;i++)a=read(),b=read(),add(a,b);
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)sum[now[i]]+=w[i];
	build();tuopu();
	for(int i=1;i<=n;i++)ans=max(ans,f[now[i]]);
	cout<=ll&&s[i].r<=rr)
    {
        sum+=s[i].v;
        return;
    }
    int kk=i*2;
    if(s[kk].r>=ll)ask(kk,ll,rr);
    if(s[kk+1].l<=rr)ask(kk+1,ll,rr);
}
void add(int i,int ll,int rr,int x)
{
    if(s[i].l>=ll&&s[i].r<=rr)
    {
        s[i].ad+=x;
        return;
    }
    if(ll>=s[i].l&&rr<=s[i].r)s[i].v+=x*(rr-ll+1);
    else s[i].v+=x*(min(abs(s[i].r-ll+1),abs(rr-s[i].l+1)));
    if(s[i].ad!=0)
    {
        s[i].v+=(s[i].r-s[i].l+1)*s[i].ad;
        s[2*i].ad+=s[i].ad;
        s[2*i+1].ad+=s[i].ad;
        s[i].ad=0;
    }
    int kk=i*2;
    if(s[kk].r>=ll)add(kk,ll,rr,x);
    if(s[kk+1].l<=rr)add(kk+1,ll,rr,x);
}
int xds1()
{
	n=read(),m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int k;k=read();
        if(k==1)
        {
            int b,c,d;
            b=read(),c=read(),d=read();
            add(1,b,c,d);
        }
        if(k==2)
        {
            int b,c;
            b=read(),c=read();
            sum=0;
            ask(1,b,c);
            if(sum<=0)cout<<0<

愿这世界对你温柔以待!!!

你可能感兴趣的:(NOIP2018退役总结)