社区讨论

求hack样例

P8820 [CSP-S 2022] 数据传输参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo2oqmhv
此快照首次捕获于
2023/10/23 17:18
2 年前
此快照最后确认于
2023/10/23 17:18
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

int fa[600000][26];
vector<int> bian[600000+10];
vector<int> child[600000+10];
int dep[600000];
long long zhi[600000];
vector<int> dp;
vector<long long> num;
vector<long long> dpf;
stack<int> t;
long long sumzhi[600000];
long long f[600000];
int n,m,s;



long long pushin(int x,int l)
{
	if(x==l)return 0;
    long long ans=0;
    while(x!=l)
    {
        ans+=zhi[x];
        x=fa[x][0];
    }
    return ans;
}

void pushin1(int x,int l)
{
    long long ans=0;
    if(x==l)return;
    while(x!=l)
    {
        dp.push_back(x);
        x=fa[x][0];
    }
}

void pushin2(int x,int l)
{
	if(x==l)return ;
    long long ans=0;
    while(x!=l)
    {
        t.push(x);
        x=fa[x][0];
    }
    while(!t.empty())
    {
    	dp.push_back(t.top());
    	t.pop();
	}
}

long long godp()
{
	if(dp.size()<s+2)
	{
		long long ans=zhi[dp[0]]+zhi[dp[dp.size()-1]];
		//cout<<dp[0]<<' '<<dp[dp.size()-1]<<' '<<zhi[dp[0]]<<' '<<zhi[dp[dp.size()-1]]<<endl;
		num.clear();
		dp.clear();
		return ans;
	}
	//for(auto v:dp)cout<<v<<' ';cout<<endl;
	num.push_back(zhi[dp[0]]);
	num.push_back(zhi[dp[1]]+zhi[dp[0]]);
	for(int i=2;i<dp.size();i++)num.push_back(min(num[i-1],num[i-2])+zhi[dp[i]]);
	long long ans=num[num.size()-1];
	num.clear();
	dp.clear();
	return ans;
}

long long godp3()
{	
	if(dp.size()<s+2)
	{
		long long ans=zhi[dp[0]]+zhi[dp[dp.size()-1]];
		//cout<<dp[0]<<' '<<dp[dp.size()-1]<<' '<<zhi[dp[0]]<<' '<<zhi[dp[dp.size()-1]]<<endl;

		num.clear();
		dp.clear();
		dpf.clear();
		return ans;
	}
	//for(auto v:dp)cout<<v<<' ';cout<<endl;
	//for(auto v:dp)cout<<zhi[v]<<' ';cout<<endl;
	//for(auto v:dp)cout<<f[v]<<' ';cout<<endl;
	num.push_back(zhi[dp[0]]);
	num.push_back(zhi[dp[1]]+zhi[dp[0]]);
	num.push_back(zhi[dp[2]]+zhi[dp[0]]);
	dpf.push_back(zhi[dp[0]]+f[dp[0]]);
	dpf.push_back(zhi[dp[0]]+f[dp[1]]);
	dpf.push_back(zhi[dp[0]]+f[dp[2]]);
	for(int i=2;i<dp.size();i++)
		num.push_back(min({num[i-1],num[i-2],num[i-3],dpf[i-1],dpf[i-2]})+zhi[dp[i]]),
		dpf.push_back(min({num[i-1],num[i-2],dpf[i-1]})+f[dp[i]]);
	long long ans=num[num.size()-1];
	num.clear();
	dp.clear();
	dpf.clear();
	return ans;
}

void Build(int f,int s)
{//cout<<f<<' '<<s<<endl; 
    for(auto v:bian[s])
    {
        if(v!=f)child[s].push_back(v),Build(s,v);
    }
}

void init(int f,int s)
{
    fa[s][0]=f;
    for(int i=1;i<25;i++)fa[s][i]=fa[fa[s][i-1]][i-1];
    dep[s]=dep[f]+1;
    sumzhi[s]=sumzhi[f]+zhi[s];
    for(auto v:child[s])
    {
        init(s,v);
    }
}

void oneclimb(int & x,int & y)
{
    if(dep[x]>dep[y])swap(x,y);
    if(dep[x]==dep[y])return;
    for(int i=24;i>=0;i--)
    {
        if(dep[fa[y][i]]<dep[x])continue;
        y=fa[y][i];
        if(dep[y]==dep[x])return;
    }
}

int twoclimb(int x,int y)
{
    if(x==y)return x;
    for(int i=24;i>=0;i--)
    {
        if(fa[x][i]!=fa[y][i])
            x=fa[x][i],y=fa[y][i];
    }
    return fa[x][0];
}

int lca(int x,int y)
{
    oneclimb(x,y);
   // cout<<x<<' '<<y<<'\n'; 
    return twoclimb(x,y);
}

int main()
{//freopen("transmit4.in","r",stdin);
// freopen("transmit.out","w",stdout);
ios::sync_with_stdio(0);
    cin>>n>>m>>s;int x,y;
    for(int i=1;i<=n;i++)cin>>zhi[i];
    for(int i=1;i<n;i++)
    {
        cin>>x>>y;
		bian[x].push_back(y);
		bian[y].push_back(x);
    }
    /*for(int i=1;i<=n;i++)
    {
        cout<<i<<':';
        for(auto v:bian[i])cout<<v<<' ';
        cout<<endl;
    }*/ 
	Build(0,s);
    
    for(int i=0;i<25;i++)fa[0][i]=0;
    init(0,s);
    if(s==3)
    	for(int i=1;i<=n;i++)
    	{
    		f[i]=zhi[bian[i][0]];
    		for(auto v:bian[i])
    			f[i]=min(f[i],zhi[v]);
		}
    while(m--)
    {
        int x,y; 
        cin>>x>>y;
        int l=lca(x,y);
       // cout<<endl;
        //cout<<l<<endl; 
        if(s==1)cout<<sumzhi[x]+sumzhi[y]-2*sumzhi[l]+zhi[l]<<endl;
        else {
        pushin1(x,l);
        dp.push_back(l);
        pushin2(y,l);
        
        cout<<(s==2?godp():godp3())<<endl;}
    }
    return 0;
}
要求:满足测试点 22 的限制。

回复

0 条回复,欢迎继续交流。

正在加载回复...