原题链接:CCF-CSP 201912-4 区块链
样例输入一:
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<int>
删掉改为void
了,真的很生气!!!写代码一定要小心!!!
但是代码只有80分,最后两个点超时了,先码在这,后面再想想怎么优化
#include <bits/stdc++.h>
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;
}