intさわだんのBlack History

刹那的レジェンドになりたい。

ICPC 国内予選2013C 階層民主主義 AOJ 1188

やるだけ。解法はICPC 国内予選2015C ICPC 計算機 AOJ1602 - intさわだんのBlack Historyと完全に同じ

#include <bits/stdc++.h>
#include <map>
#define chmin(a, b) ((a)=min((a), (b)))
#define chmax(a, b) ((a)=max((a), (b)))
#define fs first
#define sc second
#define eb emplace_back
using namespace std;
 
typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
 
const ll MOD=1e9+7;
const ll INF=1e18;
 
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};


char data[10010];
int poll[10010];
int sum[10010];

int main(){
    int z;
    cin >> z;
    for(int zz = 0;zz < z;zz++){
        cin >> data;
        int count = 0,k = 0;
        for(int i = 0;i < strlen(data);i++){
            if(data[i] == '['){
                k++;
                sum[count] = k;
                poll[count] = -1;
                count++;
            }else if(data[i] == ']'){
                k--;
            }else{ //数字の時
                int num = data[i] - '0';
                for(int j = i+1;j < strlen(data);j++){
                    if(data[j] != '[' && data[j] != ']'){
                        num = num * 10 + (int)(data[j] - '0');
                        i++;
                    }else{
                        break;
                    }
                }
                count--;
                poll[count] = num;
                count++;
            }
        }
        for(int i = 0;i < count;i++){
//            cout << sum[i] << " " << poll[i] << endl;
        }
        while(count > 1){
            int kmax = 0,o = 0;
            for(int i = 0;i < count;i++){
                if(sum[i] > kmax){
                    kmax = sum[i];
                    o = i;
                }
            }
            priority_queue<int, vector<int> , greater<int> >que;
            int len = 0;
            for(int i = o;i < count;i++){
                if(sum[i] == kmax && poll[i] != -1){
                    len++;
                    que.push(poll[i]);
                }else{
                    break;
                }
            }
            int ne = 0; // next
            for(int i = 0;i < (len+1)/2;i++){
                int q = que.top(); que.pop();
                ne += (q+1)/2;
            }
            poll[o-1] = ne*2 -1;
            for(int i = o+len;i < count;i++){
                poll[i-len] = poll[i];
                sum[i-len] = sum[i];
            }
            count -= len;
        }
        cout << (poll[0]+1)/2 << endl;
    }
}