CF1066 A & B & C
阿新 • • 發佈:2018-11-05
A
思路: 類似字首和暴力搞一下
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
思路:乍一看想寫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; }