2020杭电多校第四场补题

1004.Deliver the Cake

赛时死都找不出bug,赛后看了题解,发现只要建2*n的边就可以了

#include
using namespace std;
#define ll long long
#define pf printf
#define pi acos(-1)
#define pb push_back
const int mod=1e9+7;
const int N=1e6+10;
int n,m,st,en,x;
struct node
{
    int u,val;
};
struct nod
{
    ll d;
    int id;
    bool operator < (const nod &b) const {
    return d > b.d;
  }
};
vectorg[N];
char a[N];
ll dis[N];
int vis[N];
ll spfa()
{
    for(int i=1;i<=2*n+2;i++)
        dis[i]=1e16,vis[i]=0;
    nod s,t;
    priority_queueq;
    s.id=st;s.d=0;
    dis[st]=0;
    q.push(s);
    while(!q.empty())
    {
        t=q.top();
        q.pop();
        if(vis[t.id])continue;
        vis[t.id]=1;
        for(int i=0;it.d+v){
                dis[j]=t.d+v;
                q.push({dis[j],j});
            }
        }
    }
    ll aa=min(dis[en],dis[en+n]);
    for(int i=1;i<=2*n+2;i++)
        dis[i]=1e16,vis[i]=0;
    s.id=st+n;s.d=0;
    dis[st+n]=0;
    q.push(s);
    while(!q.empty())
    {
        t=q.top();
        q.pop();
        if(vis[t.id])continue;
        vis[t.id]=1;
        for(int i=0;it.d+v){
                dis[j]=t.d+v;
                q.push({dis[j],j});
            }
        }
    }
    ll bb=min(dis[en],dis[en+n]);
    return min(aa,bb);
}
int main()
{
    int t;cin>>t;
    while(t--)
    {
        ll ans=5e18;
        scanf("%d %d %d %d %d",&n,&m,&st,&en,&x);
        for(int i=1;i<=2*n+2;i++)
            g[i].clear();
        scanf("%s",a+1);
        for(int i=1;i<=m;i++)
        {
            int u,v,c;
            int u1=0,u2=0,v1=0,v2=0;
            scanf("%d %d %d",&u,&v,&c);
            if(a[u]=='M')
            {
                u1=1;
                u2=1;
            }
            else if(a[u]=='L')
                u1=1;
            else
                u2=1;
            if(a[v]=='M')
            {
                v1=1;
                v2=1;
            }
            else if(a[v]=='L')
                v1=1;
            else
                v2=1;
            if(u1==v1)
            {
                g[u].pb({v,c});
                g[v].pb({u,c});
            }
            if(u2==v2)
            {
                g[u+n].pb({v+n,c});
                g[v+n].pb({u+n,c});
            }
            if(u1==v2)
            {
                g[u].pb({v+n,c+x});
                g[v+n].pb({u,c+x});
            }
            if(v1==u2)
            {
                g[u+n].pb({v,c+x});
                g[v].pb({u+n,c+x});
            }
        }
        ans=spfa();
        pf("%lld\n",ans);
    }
    return 0;
}

1007.Go Running

比赛时作为我们队唯一会网络流的并没有觉得这是到网络流题,赛后听大佬说了思路,又找了大概一个小时bug发现没初始化qaq我太菜了

#include
using namespace std;
typedef long long ll;
const int N=200000+10;
ll n,s,s1,t,h[N],cur[N],cnt=1,vis[N];
pairU,V;
map,ll>m;
struct node{
    ll to,nt,w;
}e[N*5];
void add(ll u,ll v,ll w)
{
    e[++cnt]={v,h[u],w};
    h[u]=cnt;
}
queueq;
bool bfs()
{
    memset(vis,0,sizeof vis);
    vis[s]=1;
    q.push(s);
    while(!q.empty())
    {
        ll u=q.front();
        q.pop();
        cur[u]=h[u];
        for(ll i=h[u];i;i=e[i].nt)
        {
            ll v=e[i].to,w=e[i].w;
            if(w&&!vis[v])
            {
                vis[v]=vis[u]+1;
                q.push(v);
            }
        }
    }
    return vis[t];

}
ll dfs(ll u,ll flow)
{
    if(u==t)
        return flow;
    ll res=flow;
    for(ll i=cur[u];i;i=e[i].nt)
    {
        ll v=e[i].to,w=e[i].w;
        if(w&&vis[u]+1==vis[v])
        {
            ll now=dfs(v,min(res,w));
            if(!now)
                vis[v]=1;
            else
            {
                e[i].w-=now;
                e[i^1].w+=now;
                res-=now;
            }
        }
        if(!res)
        return flow;
    }
    return flow-res;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%lld",&n);
        memset(cur,0,sizeof cur);
        memset(h,0,sizeof h);
        s=1;
        t=2;
        cnt=1;
        m.clear();
        s1=2;
        for(int i=1;i<=n;i++)
        {
            int y,x;
            scanf("%d %d",&y,&x);
            U.first=1;
            U.second=y-x;
            int flag=0;
            if(m[U]==0)
            {
                s1++;
                m[U]=s1;
                add(s,m[U],1);
                add(m[U],s,0);
                flag=1;
            }
            V.first=-1;
            V.second=y+x;
            if(m[V]==0)
            {
                s1++;
                m[V]=s1;
                add(m[V],t,1);
                add(t,m[V],0);
                flag=1;
            }
            //if(flag==1)
            {
                add(m[U],m[V],1);
                add(m[V],m[U],0);
            }

        }
        ll ans=0;
        //cout<

1012. Last Problem

爆搜。。。直接构造就行。。。看完题解发现挺简单的,但问题是想不到啊。。。

#include
using namespace std;
typedef long long ll;
const int N=2000+10;
ll n,s,s1,t,h[N],cur[N],cnt=0,vis[N];
int b[5][2]={0,0,0,-1,-1,0,1,0,0,1};
int f[N][N];
void dfs(int x,int y,int k)
{
	if(k<=0)
		return;
	for(int i=1;i<=4;i++)
	{
		int xx=x+b[i][0],yy=y+b[i][1];
		if(f[xx][yy]!=k-i)
			dfs(xx,yy,k-i);
	}
	f[x][y]=k;
	printf("%d %d %d\n",x,y,k);
}
int main()
{
	cin>>n;
	dfs(1000,1000,n);
    return 0;
}

 

你可能感兴趣的:(ACM,杭电)