CCF CSP2012-4 区块链[解决中0.8]

第一版拿到了60分,超时了,后面再学习探究 剪剪枝看看有没有希望.

用邻接链表换了bitset,无明显改善效果,去掉了结束后的指针保护无明显效果.手动处理输入无明显结果

第二版拿到了80分超时了, 减掉了消息队列中消息传递时相同的时候取消传递.

题目内容https://blog.csdn.net/best335/article/details/104097464

链的数据结构思考了好一会儿,最后每个节点保存一个自己分链的块指针,所有块哪怕是不要的块都先留着,查询的时候用栈逐个找父节点.

直接模拟了过程,使用消息队列来处理每个节点的更新.

当然如果四小时让我解决这一个题我是解不出来的.

#include "bits/stdc++.h"
#include 
#include 
#include 
#define mk(a,b) make_pair(a,b)
using namespace std;
#define M 502
struct BLOCK{
    BLOCK *parent;
    int len;
    int id;
    BLOCK(BLOCK *p,int l,int i):parent(p),len(l),id(i){}
    BLOCK(){};
};
list ADJ[M];//default is 0
int t;
int vcnt;
//          time vid pointer
typedef pair > TVB;
queue protectedram;
set event;//与优先队列效果一致小优先,pq默认大优先
BLOCK *MainChain[M];
BLOCK *curBlock[M];

void newEvent(int timestamp,int vid,BLOCK *p){
    event.insert(mk(timestamp,mk(vid,p)));
}
void broadcast(int vid,int curt){//time
//printf("will receive at%d,vid %d broadcast at %d to:",curt+t,vid,curt);
    for(auto &v:ADJ[vid]){
        if(curBlock[v]->len>curBlock[vid]->len)continue;
        else if(curBlock[v]==curBlock[vid])continue;
        newEvent(curt+t,v,curBlock[vid]);
    }

//cout<lenlen || b->len==p->len && b->id>p->id) return false;
    curBlock[vid]=b;
    return true;
}
void disposet(int curtime){//dispose msg before t
    TVB tvB;
    bool state=false;
    while(!event.empty()){
        tvB=*event.begin();
        if(tvB.first>curtime)break;
//printf("dispose vid %d received at %d\n",tvB.second.first,tvB.first);

        state=choseMainChain(tvB.second.first,tvB.second.second);
        if(state){
            broadcast(tvB.second.first,tvB.first);
        }

        event.erase(event.begin());

    }
}
void create(int a,int b,int c){
    //创建块
    //cout<len+1);
    curBlock[a]=p;
    broadcast(a,b);

}
void query(int a,int b){
    BLOCK *p=curBlock[a];
//printf("query %d %d :%d ",a,b,p->len);
printf("%d ",p->len);
    stack s;
    while(p){
        s.push(p->id);
        p=p->parent;
    }

    while(!s.empty()){
        printf("%d ",s.top());
        s.pop();
    }
    printf("\n");
}
int getnumber(char *&p){
    int cnt=-1;
    while(*p==' ')p++;
    if(isdigit(*p)){
        cnt=*p-'0';
        p++;
        while(isdigit(*p)){
            cnt=cnt*10+*p-'0';
            p++;
        }
    }
    return cnt;
}
void solve(){
/*
区块链模拟
*/

    int ecnt;
    cin>>vcnt>>ecnt;
    int k,ta,tb,tc;

    while(ecnt--){
        scanf("%d%d",&ta,&tb);
        ADJ[ta].push_back(tb);
        ADJ[tb].push_back(ta);
    }
    scanf("%d%d",&t,&k);
    char sin[40],*psin;
    gets(sin);
    BLOCK *origin=creatNewBlock(nullptr,0,1);
    for(int i=1;i<=vcnt;i++){
        curBlock[i]=origin;
        MainChain[i]=origin;
    }

    while(k--){
        gets(sin);psin=sin;
//cout<>
2 0 1
2 0 2
2 0 3
2 0 4
2 0 5
2 0 1
2 0 1
2 0 1
2 0 1
2 0 1
3 0 1 10
4 0 1 10 9
3 0 1 10
3 0 1 10
3 0 1 10
4 0 1 10 9
4 0 1 10 9
4 0 1 10 9
4 0 1 10 9
4 0 1 10 9

*/

 

你可能感兴趣的:(模拟)