长存不灭的过去——逐渐消失的未来
退役前写了点模板,留作纪念,也祝我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<
愿这世界对你温柔以待!!!