切棍子

Posted on Thu, Nov 18, 2021 題解 進階程設課程
f607. 3. 切割費用 - 高中生程式解題系統

記憶體限制: 512 MB 公開 測資點#0 (5%): 2.0s , <1M 公開 測資點#1 (5%): 2.0s , <1M 公開 測資點#2 (5%): 2.0s , <1M 公開 測資點#3 (5%): 2.0s , <1M 公開 測資點#4 (5%): 2.0s , <1M 公開 測資點#5 (5%): 2.0s , <1M 公開 測資點#6 (5%): 2.0s , <1M 公開 測資點#7 (5%): 2.0s ,

#include <bits/stdc++.h>

using namespace std;

struct pos{
    int pos;
    int th;
};

bool cmp(pos a,pos b){
    return a.th<b.th;
}

void print(vector<int> v){
    for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
    cout<<endl;
}

int main()
{
    long long int n,L,sum=0;
    cin>>n>>L;
    vector<pos> cut(n);
    vector<int> log;
    for(int i=0;i<n;i++){
        cin>>cut[i].pos>>cut[i].th;
    }
    sort(cut.begin(),cut.end(),cmp);
    log.push_back(0);
    log.push_back(L);
    vector<int>::iterator low;
    for(int i=0;i<cut.size();i++){
        low=lower_bound(log.begin(),log.end(),cut[i].pos);
        //cout<<*low<<" "<<*(low-1)<<endl;
        //print(log);
        sum+=*low-*(low-1);
        log.insert(low,cut[i].pos);
    }
    cout<<sum<<endl;
    return 0;
}
2021-11-25更新set做法
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int N,L,sum=0;
    cin>>N>>L;
    set<int> s={0,L};
    pair<int,int> p[N];
    for(int i=0;i<N;i++){
        cin>>p[i].second>>p[i].first;
    }
    sort(p,p+N);
    for(int i=0;i<N;i++){
        s.insert(p[i].second);
        auto it=s.find(p[i].second);
        sum+=*next(it)-*prev(it);
    }
    cout<<sum;
    return 0;
}