CCF-CSP 201912-4 区块链 80分

原题链接:CCF-CSP 201912-4 区块链

CCF-CSP 201912-4 区块链 80分_第1张图片
样例输入一:

5 10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
1 27
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
1 1
2 1
3 1
4 1
5 1
1 2
2 2
3 2
4 2
5 2
1 10 10
2 11 9
1 11
2 11
3 11
4 11
5 11
1 12
2 12
3 12
4 12
5 12

样例输入二:

15 13
1 2
2 3
3 4
4 5
1 6
6 7
7 8
8 9
1 10
10 11
11 12
12 13
14 15
6 28
1 1 1
1 2 2
1 6
2 7
13 7
9 7
5 7
3 14
8 14
5 14
11 14
9 25
5 25
13 25
9 29 3
5 29 4
13 29 5
1 53
2 59 6
2 59
1 1000
3 1000
8 1000
9 1000
10 1000
13 1000
14 1000
15 1000

80分代码(超时):
在这里插入图片描述

很生气,整个代码写完了,一直交,一直错,但我仔细看,感觉逻辑是没有问题的,自己的codeblocks跑也没有问题,但是交上去就是运行错误,找错找了我一个多小时,硬是没找出来,最后发现是fun函数那里,我之前写的是返回vector的函数,但是最后调整逻辑的时候把他改为了无返回值的函数,却忘记把vector 删掉改为void了,真的很生气!!!写代码一定要小心!!!

但是代码只有80分,最后两个点超时了,先码在这,后面再想想怎么优化

#include 
using namespace std;
#define ll unsigned long long
int n,m,t,k;

struct node
{
    int a,b,c;
    node(int _a,int _b,int _c): a(_a),b(_b),c(_c) {}
};
queue<node> add;//添加块

struct receive
{
    int id;
    ll time;
    vector<int> v;
    receive(int _i,ll _t,vector<int> _v): id(_i),time(_t),v(_v) {}
    friend bool operator < (const receive& r1,const receive& r2)
    {
        return r1.time>r2.time;
    }
};
priority_queue<receive> pq;//接受链,接收时间早的优先级高
vector<int> links[510];//每个节点的主链
vector<int> g[510];

//主链更新,v1是本来的链,v2是接收的链
void Merge(vector<int>& v1,vector<int> v2)
{
    int n1=v1.size(),n2=v2.size();
    if(n2>n1) v1=v2;
    else if(n1==n2 && n1 &&n2 && v2.back()<v1.back()) v1=v2;
}

void update(int b)
{
    while(!pq.empty())
    {
        receive x=pq.top();
        int id=x.id,time=x.time;
        if(time>b) break;
        Merge(links[id],x.v);//链更新
        for(int i=0;i<g[id].size();i++)
        {
            int to=g[id][i];
            if(links[to]!=links[id]) pq.push(receive(to,time+t,links[id]));
        }
        pq.pop();
    }
}

void fun()
{
    while(!add.empty())
    {
        node x=add.front();
        int a=x.a,b=x.b,c=x.c;
        update(b);//先接收链 再更新
        links[a].push_back(c);
        for(int i=0;i<g[a].size();i++)
        {
            int to=g[a][i];
            pq.push(receive(to,b+t,links[a]));
        }
        add.pop();
    }
}

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    while(m--)
    {
        int u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    cin>>t>>k;
    while(k--)
    {
        int a,b,c,intmp;
        char ch;
        vector<int> in;
        while(cin>>intmp)
        {
            in.push_back(intmp);
            if((ch=cin.get())=='\n') break;
        }
        a=in[0],b=in[1];
        if(in.size()==3)
        {
            c=in[2];
            add.push(node(a,b,c));
        }
        else
        {
            fun();
            update(b);
            cout<<links[a].size()+1<<" "<<0;
            for(auto tmp:links[a]) cout<<" "<<tmp;
            cout<<endl;
        }
    }
	return 0;
}

你可能感兴趣的:(CCF-CSP,c++,算法)