• CSP-201912-4 区块链


     题目很鸡儿长,就是个模拟,时间给了10s,数据的话不是特别大,考虑用vector来模拟这个'链'。

    数据给的也很规整,可以说很良心了,时间都是按序给出的。

    做法是维护一个更新队列q,里面的信息是在t时刻有一个对cur号节点的更新操作,来自于fa号节点,且fa号节点对应的链为id号。显然q里面t是递增的。

    维护一个‘链’的vector h,h里面每一个元素就是一个'链',好处在于我们根据下标就可以定位到链,且保存了每个节点所有‘链’的状态,保证了后面的更新操作。

    每次询问/add之前都要看下q里面对于当前时间之前的更新是否都考虑完了才可以。特别要提示的是,更新操作具有传递性,例如1->2->3,假如1号节点在cur时刻更新了,

    那么2号在cur+t,3号在cur+t+t时刻考虑更新,我们只需在2号考虑完之后在传递给他的邻居就完成了这一点。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 #define inf 0x3f3f3f3f
     5 #define pii pair<int,int>
     6 struct node{
     7     int t,id,cur,fa;
     8 };
     9 const int maxn=505;
    10 int f[maxn][maxn];
    11 vector<int>g[maxn];
    12 int N,M;
    13 int a,b,c,t,k;
    14 int data[maxn];
    15 vector<vector<int> > h;
    16 queue<node>q;//<ti,id>
    17 int main(){
    18     int u,v;
    19     ios::sync_with_stdio(false);
    20     memset(f,0,sizeof(f));
    21     cin>>N>>M;
    22     h.push_back(vector<int>(1,0));
    23     for(int i=1;i<=N;++i)data[i]=0;
    24     for(int i=1;i<=M;++i){
    25         cin>>u>>v;
    26         f[u][v]=f[v][u]=1;
    27     }
    28     for(int i=1;i<=N;++i){
    29         for(int j=1;j<=N;++j){
    30             if(i!=j&&f[i][j]){
    31                 g[i].push_back(j);
    32             }
    33         }
    34     }
    35     cin>>t>>k;
    36     string str;getline(cin,str);
    37     while(k--){
    38         bool update=0;
    39         c=-1;
    40         getline(cin,str);
    41         stringstream ss(str);
    42         ss>>a;ss>>b;
    43         if(ss.str().size())ss>>c;
    44     //处理b时刻之前的操作
    45         while(!q.empty() && q.front().t<=b){
    46             node nd=q.front();q.pop();
    47             int ti=nd.t,id=nd.id,v=nd.cur,fa=nd.fa;
    48             if(h[id].size()<h[data[v]].size() ||
    49                (h[id].size()==h[data[v]].size() && h[id].back()>=h[data[v]].back()) )continue;
    50             else{
    51                 data[v]=id;
    52                 update=1;
    53             }
    54             for(int vv:g[v]){
    55                 if(vv==fa)continue;
    56                 q.push(node{ti+t,id,vv,v});
    57             }
    58         }
    59         if(c==-1){
    60             cout<<h[data[a]].size();
    61             for(int v:h[data[a]])cout<<' '<<v;cout<<endl;
    62         }else{
    63             vector<int>tmp=h[data[a]];
    64             tmp.push_back(c);
    65             h.push_back(tmp);
    66             data[a]=h.size()-1;
    67             update=1;
    68         }
    69         if(update){
    70             for(int v:g[a]){
    71                 q.push(node{b+t,data[a],v,a});
    72             }
    73         }
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    野心和实力的磨合
    tpm
    菜猫学习linux笔记(1)
    调试理解过程
    TSS学习记录
    RSA加密算法理解(整理自网络)
    *args和**kwargs在python中的作用
    在 Ubuntu 16.04 中安装谷歌 Chrome 浏览器
    ubuntu安装微信客户端
    ubuntu 桌面操作系统安装WPS办公软件的方法
  • 原文地址:https://www.cnblogs.com/zzqc/p/12409426.html
Copyright © 2020-2023  润新知