最後編輯時間: 2025/05/23

2025/05/22刷題心得整理

▌TF::OJ刷的題目

▌覺得有趣或值得紀錄的題目以及心得感想

腦汁耗盡了,寫不出感想了,主要底下程式蠻簡單的:)

▌程式

     例題 P-3-6. 砍樹 (APCS202001)

				
					#include <bits/stdc++.h>
using namespace std;
queue<int> q;
#define oo 1000000001
struct{
    int c,h;
    int ne,ba;
    bool y = false;
} t[100050];
void r(int i){
    if(t[i].y) return;
    int s=t[i].ne,w = t[i].ba;
    if(t[i].c+t[i].h<=t[s].c||t[i].c-t[i].h>=t[w].c){
        t[i].y=true;
        q.push(i);
        t[s].ba= w;
        t[w].ne = s;
    }
    return;
}
int main(){
    int n,k,ma=0,s=0;cin >> n >>k;
    for(int i=1;i<=n;i++) {
            cin >> t[i].c;
            t[i].ne=i+1;t[i].ba=i-1;
    }
    for(int i=1;i<=n;i++) cin >> t[i].h;
    t[0].c=0;t[n+1].c=k;t[0].y=false;
    t[0].h=oo;t[n+1].h=oo;t[n+1].y=false;
    for(int i=1;i<=n;i++) r(i);
    while(!q.empty()){
        int v = q.front();
        q.pop();
        s++;
        ma = max({ma,t[v].h});
        r(t[v].ne);r(t[v].ba);
    }
    cout << s << "\n" << ma << endl;

}
				
			

     例題 P-3-7. 正整數序列之最接近的區間和

				
					#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,k,left=0,s=0,ma=0,e=0;cin >> n >>k;
    unordered_map<int,int> a;
    vector<int> b(n);
    for(int i=0;i<n;i++) {
        cin >> b[i];s+= b[i];
        while(s>k){
            s-=b[left];
            left++;
        }
        if(ma!=max(ma,s)) e=1;
        if(ma==s) e++;
        ma=max(ma,s);
    }
    cout << ma << "\n" << e <<endl;
}

				
			

     例題 P-3-8. 固定長度區間的最大區段差

				
					#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,l,m=0;cin >> n >> l;
    vector<int> a(n);
    deque<int> mx,mn;
    for(int i=0;i<n;i++) cin >> a[i];
    for(int i=0;i<n;i++){
        if(mx.front()<=i-l) mx.pop_front();
        if(mn.front()<=i-l) mn.pop_front();
        while(!mx.empty()&&a[mx.back()]<=a[i]) mx.pop_back();
        while(!mn.empty()&&a[mn.back()]>=a[i]) mn.pop_back();
        mx.push_back(i);mn.push_back(i);
        m = max(m,a[mx.front()]-a[mn.front()]);
    }
    cout << m <<endl;
    return 0;
}
				
			

     例題 P-3-9. 最多色彩帶

				
					#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,l,m=0;cin >> n >>l;
    unordered_map<int,int> a;
    vector<int> e(n);
    for(int i=0;i<n;i++){
        cin >> e[i];
        if(i>=l){
            a[e[i-l]]--;
            if(a[e[i-l]]==0) a.erase(e[i-l]);
        }
        a[e[i]]++;
        m = max(m,(int)a.size());
    }
    cout << m << endl;
}