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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM