いろいろがんばりたいブログ

情報科学科の人がいろいろ書きます。

SRM 581 div1

o-- (+0/-0) 135.38pts (172/557) 1270 -> 1378 (+108)

easyだけしか解けなかったけど、まぁまぁ。
考え方は、まず同じ範囲を見られるようなカメラの数を数えておく。
もしも、どのように配置したとしてもカバーされるような時には、+,
配置次第ではカバーされるような場合には?を置けばいい。
どのようにも〜の判定式は、(ec[i] > lp-myrepo[rei])と書ける。
ただし、+は?よりも強いので、maxを取ることを忘れずに。

以下ソース

#include <iostream>
#include <vector>
#include <utility>
#include <string>

using namespace std;

class SurveillanceSystem {
    public:
        string getContainerInfo(string containers, vector <int> reports, int L) {
            int N = containers.size();
            vector<int> myrepo(L+1);
            for(int i=0;i<reports.size();i++){
                myrepo[reports[i]]++;
            }

            vector<int> levels(containers.size(),0);
            for(int rei=0;rei<(int)myrepo.size();rei++){
                if(myrepo[rei] == 0) continue;
                vector<int> vec(N);
                int lp = 0;
                for(int s=0;s<N-L+1;s++){
                    int e = s + (L-1);
                    int cnt = 0;
                    for(int i=s;i<=e;i++){
                        if(containers[i] == 'X') cnt++;
                    }
                    if(rei == cnt){
                        lp++;
                        for(int i=s;i<=e;i++){
                            vec[i]++;
                        }
                    }
                }

                if(lp > 0){
                    for(int i=0;i<(int)vec.size();i++){
                        if(vec[i] > lp-myrepo[rei]){
                            levels[i] = 2;
                        }else if(vec[i] > 0){
                            levels[i] = max(1,levels[i]);
                        }
                    }
                }
            }
            string ret = "";
            for(int i=0;i<levels.size();i++){
                if(levels[i] == 0){
                    ret.push_back('-');
                }else if(levels[i] == 1){
                    ret.push_back('?');
                }else{
                    ret.push_back('+');
                }
            }
            return ret;
        }

};