Zerojudge f607

首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信zhuastor@gmail.com

解題心得

一開始我想用二分搜尋找前後,結果一直RE
後來改成模擬並記錄前後的鄰居,結果TLE
只好乖乖看別人的題解,發現原來是我的lower_bound出錯
遞迴部份炸了,那我就乖乖地寫while迴圈QQ

解題想法

一個vector(不需要優先順序,用insert直接使他有優先順序性,由小到大)
一個lower_bound函式(解題主要關鍵),至於結構加自定義sort就不另外講解
最開始我們先在vector裡面加入”0”跟”m”方便後面判斷
再來對於當前第一刀,我們提取結構中的ga[x].a(位置)
透過lower_bound找到第一個大於等於的元素位置
接著一連串判斷後插入(在此省略,這裡自己想會比較有幫助)
然後加總就好(習慣性加long long int ,int也會過喔)

非最佳解!好多人在0.1s之下,只是提供一種粗淺的解題方向

AC code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct job{
    int a,b;
};
job ga[200005];
vector<int> v;
bool cmp(job g,job t){
    return g.b<t.b;
}
int lower_bound(int left,int right,int pa){
    int mid;
    int pos;
    while(left<right){
        mid=(left+right)/2;
        if(v[mid]<pa){
            left=mid+1;
            pos=left;
        }
        else{
            right=mid;
            pos=right;
        }
    }
    return pos;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    ll int sum=0;
    cin >> n >> m;
    for(int x=0;x<n;x++){
        cin >> ga[x].a >> ga[x].b;
    }
    sort(ga,ga+n,cmp);
    v.push_back(0);
    v.push_back(m);
    int k;
    for(int x=0;x<n;x++){
        k=lower_bound(0,v.size(),ga[x].a);
        if(k!=v.size() && ga[x].a!=m){
            if(v[k]==ga[x].a)
            sum+=v[k+1]-v[k-2];
            else{
                sum+=v[k]-v[k-1];
            }
        v.insert(v.begin()+k,ga[x].a);
        }
        else if(ga[x].a==m){
            sum+=v[v.size()-1]-v[v.size()-2];
        }
        // cout << sum << endl;
    }
    cout << sum << endl;
    return 0;
}

題目連結 : 2021年1月APCS 3.切割費用