제출 #1299894

#제출 시각아이디문제언어결과실행 시간메모리
1299894chaitanyamehtaLasers (NOI19_lasers)C++20
100 / 100
255 ms17792 KiB
// https://static.oj.uz/problem/c014a9e7a8f56bc2f9f572b0bdc08fa0/statement/ddc244fdcd6f2b1a2747c6561b1319e7dff1edb43080c46bffcfc3e9c8b6bb86/statement_en.pdf

#include<bits/stdc++.h>
using namespace std;

#define int long long

signed main(){
    int L , R;
    cin>> L >> R;
    
    vector<pair<int , int>> global_unavoidable;

    for(int r1 = 0 ; r1 < R ; r1++){
        
        int n;
        cin>>n;
        vector<int> s(n+1) , p(n+1, 0);

        for(int i = 1 ;i <= n; i++){
            cin>>s[i];
            p[i] = p[i-1]+s[i];
        }
        int S = p[n];

        int F = L - S;

        if(F <= 0){
            cout<<L;
            return 0;
        }

        vector<pair<int ,int>> avoid;
        for(int i = 0 ; i <= n ; i++){
            int l = p[i] + 1;
            int r = p[i]+ F;
            
            if(l >= 1 && r <= L && l<= r){
                avoid.emplace_back(l , r);
            }
            
        }
        if(avoid.empty()){
            global_unavoidable.emplace_back(1 , L);
            continue;
        }
            vector<pair<int ,int>> merged_avoid;

            for(int i = 0 ; i < avoid.size() ;i++){
                int l = avoid[i].first;
                int r = avoid[i].second;

                if(merged_avoid.empty() || merged_avoid.back().second + 1 < l){
                    merged_avoid.emplace_back(l , r);
                }
                else{
                    if(r > merged_avoid.back().second){
                        merged_avoid.back().second = r;
                    }
                }
            }

            

            int cur = 1;
            // taking complement of merged_avoid;
            for(int i = 0 ; i < merged_avoid.size() ; i++){
                int l = merged_avoid[i].first;
                int r = merged_avoid[i].second;

                if(cur < l){
                    global_unavoidable.emplace_back(cur , l -1);
                }
                cur = max(cur ,r+1);
                if(cur > L)break;
            }

            if(cur <= L){
                global_unavoidable.emplace_back(cur  , L);
            }
    }

    sort(global_unavoidable.begin() , global_unavoidable.end());


    if(global_unavoidable.empty()){
        cout<<0;
        return 0;
    }

    pair<int ,int> cur = global_unavoidable[0];
    int ans = 0;
    for(int i = 1 ;i < global_unavoidable.size() ;i++){

        if(cur.second + 1 < global_unavoidable[i].first){
            
            ans+=(cur.second - cur.first + 1);
            cur = global_unavoidable[i];
        }
        else{
            cur.second = max(cur.second , global_unavoidable[i].second);
        }
    }

    
    ans += cur.second - cur.first + 1;
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...