1. 程式人生 > >CF1066 A & B & C

CF1066 A & B & C

A

題目連結CF1066 A Vova and Train

思路: 類似字首和暴力搞一下

code:

#include <bits/stdc++.h>
using namespace std;
int T, L, V, l, r;

template <typename T>
inline void read(T &t) { ; }

int main() {
    scanf("%d", &T);
    while(T--) {
        int ans = 0;
        scanf("%d %d %d %d", &L, &V, &l, &r);
        printf("%d\n", L / V - r / V + (l - 1) / V);
    }
    return 0;
}

B

題目連結CF1066B Heaters

思路: 貪心的另一種思路,先假設所有的加熱器全部開啟,此時如果還有地方沒有被加熱到,輸出-1,

從左到右掃描每一個加熱器,如果它的範圍內所有的加熱疊加次數都大於1,這個加熱器就可以被去掉,對答案沒有影響

code:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5;
int n, a[N], cnt[N], ans = 0, r;

int main() {
    scanf("%d %d", &n, &r);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        if(a[i]) {
            ans++;
            for(int j = max(1, i - r + 1); j <= min(n, i + r - 1); j++) {
                cnt[j]++;
            }
        }
    }
    for(int i = 1; i <= n; i++) {
        if(!cnt[i]) return printf("-1\n"), 0; 
    }
    for(int i = 1; i <= n; i++) {
        bool fl = true;
        if(a[i]) {
            for(int j = max(1, i - r + 1); j <= min(n, i + r - 1); j++) {
                if(cnt[j] == 1) {
                    fl = false;
                    break;
                }
            }
        }
        if(fl && a[i]) {
            ans--;
            for(int j = max(1, i - r + 1); j <= min(n, i + r - 1); j++) {
                cnt[j]--;
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

C

題目連結CF1066C Books Queries

思路:乍一看想寫splay了...維護兩個指標 l 和 r 代表當前往右邊選到哪兒,往左邊選到哪兒,

每個書的id和l或r用map對映一下,查詢的時候輸出min(這個id的對映值減去當前右邊選到哪兒,當前左邊選到哪兒減這個id的對映值)

需要特判一下第一本插入的書

code:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, idx = 500000, _idx = 500000;

char opt;

map <int, int> mps; // id , num 

int main() {
    scanf("%d", &n);
    bool fl = false;
    for(int i = 1, id; i <= n; i++) {
        cin >> opt >> id;
        if(opt == 'L') {
            if(!fl) {
                fl = true;
                mps[id] = idx;
            }
            else idx--, mps[id] = idx;
        } else {
            if(opt == 'R') {
                if(!fl) {
                    fl = true;
                    mps[id] = idx;
                }
                else _idx++, mps[id] = _idx;
            } else {
                printf("%d\n", min(mps[id] - idx, _idx - mps[id]));
            }
        }
    }
    return 0;
}