IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> CSP 区块链 100分 -> 正文阅读

[区块链]CSP 区块链 100分

节点,边构成了图

通过邻接数组存储边集。

题意可知 ,更新会将自己的主链转发出去。

而更新有两种情况

1.添加一个新块

2.邻居传过来的主链,如果符合题目中的要求,则进行更新

重点就是如何进行更新。

可以构造一个结构体,包含到达日期,发送的主链,以及发送的对象

发送的对象是个数组比较好,这样一次转发只需要拷贝一次主链就可以了。

开始的时候80分,时间超时,改成这样后就100分,1.8s过了。

至于怎么存储这些需要更新的链,我用的multiset(因为如果根据截止日期排序,set的话会把截止日期相同的节点视作同一个节点,然后不予添加),根据截止日期进行排序

现在想想,其实链表就行,根本没必要通过set,因为是有序的。

还有一点要注意,就是题目中的bi可能跨度比较大,两个相邻的bi之间隔了很长时间,我们需要每隔一个时间单位统一接收一次可以接收的全部主链。

代码如下

#include<iostream>

#include<vector>

#include<string>

#include<map>

#include<set>

#include<queue>

#include<algorithm>

#include<cstdio>

#include<sstream>

#include<list>

using?namespace?std;

typedef?long?long?ll;

typedef?pair<ll,ll>?pa;

int?n,m;

int?t,k;

vector<int>?gra[505];

vector<int>?ls[505];//链

struct?unit{

????int?ddl;//到达的时间

????vector<int>?mlist;//发送的主链

????vector<int>?to;

????bool?operator?<(const?unit&t)const{

????????return?ddl<t.ddl;

????}

};

multiset<unit>?upd;

int?curtime=0;

void?init()

{

????cin>>n>>m;

????for(int?i=1;i<=n;i++)

????????ls[i].push_back(0);

????for(int?i=1;i<=m;i++){

????????int?from,to;

????????cin>>from>>to;

????????gra[from].push_back(to);

????????gra[to].push_back(from);

????}

????cin>>t>>k;

????getchar();

}

void?send(int?a,int?b);

void?recv(int?b)//当前时间

{

????while(1){

????????auto?it=upd.begin();

????????if(!upd.empty()&&it->ddl<=b){//比较,然后接收

????????????for(auto?to:it->to){

????????????if(ls[to].size()<it->mlist.size())

????????????????{ls[to]=it->mlist;

????????????????send(to,b);

????????????????}

????????????else?if(ls[to].size()==it->mlist.size()){

????????????????if(it->mlist.back()<ls[to].back())

????????????????????{ls[to]=it->mlist;

????????????????????send(to,b);

????????????????????}

????????????}

????????????}

????????????upd.erase(it);

????????}

????????else?break;

????}

}

void?send(int?a,int?b)//当前时间

{

????unit?temp;

????temp.ddl=b+t;

????temp.mlist=ls[a];

????for(auto?to:gra[a])

????????temp.to.push_back(to);

????upd.insert(temp);

}

void?create(int?a,int?b,int?c)

{

????ls[a].push_back(c);

????send(a,b);

}

int?main()

{???

????while(k--){

????????string?str;

????????getline(cin,str);

????????istringstream?ss(str);

????????int?tmp;

????????vector<int>?temv;

????????while(ss>>tmp)temv.push_back(tmp);

????????int?a,b,c;

????????a=temv[0],b=temv[1];

????????if(curtime!=b){

????????????for(int?i=curtime;i<=b;i++)

????????????????recv(i);

????????????curtime=b;

????????}

????????if(temv.size()==2){

????????????cout<<ls[a].size();

????????????for(auto?&tmp:ls[a])

????????????????cout<<"?"<<tmp;

????????????cout<<"\n";

????????}

????????else{

????????????c=temv[2];

????????????create(a,b,c);

????????}

????}

}

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 00:01:17  更:2021-07-07 00:01:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:43:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码