補題 Codeforces Round #791 (Div. 2) A、B
阿新 • • 發佈:2022-05-15
補題
A題
思路
這題寫的時候沒想清楚,其實就是解4x + 6y = n
一開始沒想清楚輸出-1的情況,導致後面wa了一堆,還以為是題目問題輸出-1的情況就是n為奇數,或者n小於4的情況
若不輸出-1,則最大是n/4輛,最小按理說是n/6輛,但是因為不能沒有,所以\((n + 4)/6\),保證在n==4的時候最少也有一輛車
#include <iostream> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <deque> using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010, M = 60, INF = 1e9; int a[N], b[N]; char g[M][M]; bool cmp(int a, int b) { return a > b; } int check(char s) { if(s >= 'a' && s <= 'z') return s - 'a' + 10; else return s - '0'; } void solve() { LL n; cin >> n; if(n & 1 || n < 4) puts("-1"); else cout << (n + 4) / 6 << ' ' << n / 4 << endl; } int main() { int t; cin >> t; while(t--) { solve(); } return 0; }
B題
思路:只用輸出和的結果,在最開始全加起來,然後進行加或者減就好了。
唯一困難的是當全部數字被替換之後怎麼去給陣列中所有元素換成x ,否則下次進行單個元素替換的時候就不對
解決方案就是用map或陣列等 + last標識當前陣列是否被全部替換,如果被全部替換,那麼更新sum之前會將當前數更新成被整體替換的值
#include <iostream> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <deque> #include <map> #define int long long using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010, M = 60, INF = 1e9; int a[N], b[N]; char g[M][M]; bool cmp(int a, int b) { return a > b; } int check(char s) { if(s >= 'a' && s <= 'z') return s - 'a' + 10; else return s - '0'; } void solve() //核心程式碼 { int n, q; cin >> n >> q; map<int, int> m; int last = 0, sum = 0; for(int i = 1; i <= n; i++) cin >> a[i], sum += a[i]; while(q--) { int tt, x, idx; cin >> tt; if(tt == 1) { cin >> idx >> x; if(!m[idx] && last) //如果這個數沒出現過且陣列整體被更新過了 { m[idx] = 1; a[idx] = last; } sum += x - a[idx]; a[idx] = x; } else{ cin >> x; sum = n * x; last = x; m.clear(); } cout << sum << endl; } } int main() { int t; //cin >> t; // while(t--) // { solve(); // } return 0; }