[코드트리/C++] 코드트리 메신저

채린·2024년 10월 12일
1

코드트리 메신저

틀림~
1. power가 짧다고 아랫것도 push안함 (testcase없으면 어떻게 알아낼건데)
2. OFF한 본인은 아랫것들 알림 받을수가 있었음;;
3. 아예 수신가능 알림 수를 계속 업데이트 해서 사용. 500 호출 시 for문돌리면 시간초과남
근데 dp 로직 자체가 답을 봐도 이해가 안돼서 오답 포기.. 강해져서 돌아오자

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int N;


int val[21];
int info[100001][21];


struct node {
    int data;
    int parent;
    int authority;
    int alarm;
};
vector <node> Chat;

void update (int start){
    for(int i=start;i<=N;i++){
        int curr=i;
        int x=Chat[curr].authority;
        while(Chat[curr].parent!=0&&x!=0){
            curr=Chat[curr].parent;
            x--;
            if(x>0) val[curr]++;
            nx[curr][x]++;
        }
    }

}



void alarmOn(int c){
    if(Chat[c].alarm==1)Chat[c].alarm=0;
    else Chat[c].alarm=1;
}
void powerChange(int c, int power){
    Chat[c].authority=power;
}
void changeParents(int c1, int c2){
    int tmp=Chat[c1].parent;
    Chat[c1].parent=Chat[c2].parent;
    Chat[c2].parent=tmp;
}
void checkAlarm(int c){
    int cnt=0;
    queue <pair<int,int>> check;
    check.push(make_pair(c,1));
    while(!check.empty()){
        int front_data=check.front().first;
        int front_length=check.front().second;
        check.pop();
        for(node n:Chat){
            if(n.parent==front_data&&n.alarm==1){
                if(n.authority>=front_length){
                    cnt++;
                }
                check.push(make_pair(n.data,front_length+1));
            }
        }
    }
    cout<<cnt<<endl;

}

int main() {
    int order,Q,value1, value2;
    cin>>N>>Q;
    Chat.resize(1+N);

    // 100 준비 
    cin>>order;
    for(int i=1;i<=N;i++){
        cin>>Chat[i].parent;
        Chat[i].data=i;
        Chat[i].alarm=1;
    }
    for(int i=1;i<=N;i++){
        cin>>Chat[i].authority;
    }

    // 명령 입력
    int num=1;
    while(num++<Q){
        cin>>order;
        if(order==200){
            cin>>value1;
            alarmOn(value1);
        }
        else if (order == 300){
            cin>>value1>>value2;
            powerChange(value1,value2);
        }
        else if (order == 400){
            cin>>value1>>value2;
            changeParents(value1,value2);
        }
        else if (order == 500){
            cin>>value1;
            checkAlarm(value1);
        }
    }



    
    return 0;
}

0개의 댓글