搞了不多……线段树和spfa已添加。
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
struct Edge
{
int from,next,dist,to;
int flow,cap;
};
struct SPFA
{
int m,n,tot,dist[200010],head[200010];//m是点数,n是边数
int s,t;
bool passby[200010];
Edge edge[400010];
void init()
{
for(int i=0;i<=m+5;i++)dist[i]=0x7fffffff;
}
void add(int ff,int tt,int dd)
{
edge[++tot].from=ff;
edge[tot].to=tt;
edge[tot].dist=dd;
edge[tot].next=head[ff];
head[ff]=tot;
}
queue<int>q;
void spfa()
{
dist[s]=0;
passby[s]=1;
q.push(s);
while(!q.empty())
{
int x=q.front();
passby[x]=0;
q.pop();
for(int i=head[x];i;i=edge[i].next)
{
Edge e=edge[i];
if(dist[e.to]>dist[x]+e.dist)
{
dist[e.to]=dist[x]+e.dist;
if(!passby[e.to])
{
passby[e.to]=1;
q.push(e.to);
}
}
}
}
}
};
struct Segtree
{
int num[1000010]
int l[1000010<<2],r[1000010<<2];
ll sum[1000010<<2],add[1000010<<2],sett[1000010<<2];
inline void update(int p)
{
sum[p]=sum[p<<1]+sum[p<<1|1];
}
inline int SZ(int x)
{
return r[x]-l[x]+1;
}
void gett(int l,int r,int p)
{
l[p]=l;
r[p]=r;
if(l==r)
{
sum[p]=num[l];
return;
}
int midd=(l+r)>>1;
gett(midd+1,r,p<<1|1);
gett(l,midd,p<<1);
update(p);
}
void spread(int p)
{
if(add[p])
{
add[p<<1]+=add[p];
add[p<<1|1]+=add[p];
sum[p<<1]+=add[p]*(ll)SZ(p<<1);
sum[p<<1|1]+=add[p]*(ll)SZ(p<<1|1);
add[p]=0;
}
if(sett[p])
{
sett[p<<1]=sett[p];
sett[p<<1|1]=sett[p];
sum[p<<1]=sett[p]*(ll)SZ(p<<1);
sum[p<<1|1]=sett[p]*(ll)SZ(p<<1|1);
sett[p]=0;
}
}
void add(int l,int r,int p,int v)
{
if(l<=l[p]&&r[p]<=r)
{
add[p]+=(ll)v;
sum[p]+=(ll)v*(ll)SZ(p);
return;
}
spread(p);
int mid=(l[p]+r[p])>>1;
if(l<=mid) add(l,r,p<<1,v);
if(r>mid) add(l,r,p<<1|1,v);
update(p);
}
void minu(int l,int r,int p,int v)
{
add(l,r,p,-v);
}
void sett(int l,int r,int p,int v)
{
if(l<=l[p]&&r[p]<=r)
{
add[p]=0;
sett[p]=v;
sum[p]=v*SZ(p);
return;
}
spread(p);
int mid=(l[p]+r[p])>>1;
if(l<=mid)sett(l,r,p<<1,v);
if(r>mid)sett(l,r,p<<1|1,v);
update(p);
}
ll ask(int l,int r,int p)
{
if(l<=l[p]&&r[p]<=r)
return sum[p];
spread(p);
int mid=(l[p]+r[p])>>1;
ll ans=0;
if(l<=mid)
ans+=ask(l,r,p<<1);
if(r>mid)
ans+=ask(l,r,p<<1|1);
return ans;
}
};
int main()
{
return 0;
}
请自行修改数据范围233