#include<bits/stdc++.h> #define int long long usingnamespace std; signedmain() { int n; cin >> n; vector<int> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } vector<int> s(n + 1, 0); for (int i = 1; i <= n; i++) { s[i] = s[i - 1] + a[i]; } int ans = 0; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { int tp = s[j] - s[i - 1]; bool flag = 1; for (int k = i; k <= j; k++) { if (tp % a[k] == 0) { flag = 0; break; } } ans += flag; } } cout << ans; return0; }
C.Domino
题目描述
在数轴上有一排多米诺骨牌。第一个多米诺骨牌位于坐标 i 处,高度 Ai 。
当第 i 张多米诺骨牌向右倒下时,坐标 i 到 i+Ai−1 (含)范围内的所有多米诺骨牌都向右倒下。
当第一张多米诺骨牌向右倒下时,总共会有多少张多米诺骨牌倒下?
思路
从前到后遍历一遍,每次更新最远能到达的位置即可。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<bits/stdc++.h> #define int long long usingnamespace std; signedmain() { int n; cin >> n; vector<int> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } int pos = 1; for (int i = 1; i <= pos && i <= n; i++) { pos = max(pos, i + a[i] - 1); } cout << min(pos, n); return0; }
#include<bits/stdc++.h> #define int long long usingnamespace std; vector<int> edges[333333]; vector<int> redges[333333]; bool ans[333333], vis[333333]; voidbfs(int x) { queue<int> q; q.push(x); vis[x] = 1; while (!q.empty()) { int u = q.front(); q.pop(); for (int nex : redges[u]) { if (!vis[nex]) { vis[nex] = 1; q.push(nex); } } } } signedmain() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; edges[u].push_back(v); redges[v].push_back(u); } int T; cin >> T; while (T--) { int ch, x; cin >> ch >> x; if (ch == 1) { if (!ans[x]) { ans[x] = 1; bfs(x); } } else { cout << (vis[x] ? "Yes" : "No") << '\n'; } } return0; }
#include<bits/stdc++.h> #define int long long usingnamespace std; signedmain() { int n, T; cin >> n >> T; set<pair<int, int>> st; int cnt = 0; while (T--) { int l, r; cin >> l >> r; auto it = st.upper_bound({l, LLONG_MAX}); if (it != st.begin()) { it--; if (it -> second < l) { it++; } } int p1 = l, p2 = r; vector<pair<int, int>> v; while (it != st.end() && it -> first <= r) { cnt -= (it -> second - it -> first + 1); p1 = min(p1, it -> first); p2 = max(p2, it -> second); v.push_back(*it); it++; } for (int i = 0; i < v.size(); i++) { st.erase(v[i]); } st.insert({p1, p2}); cnt += (p2 - p1 + 1); cout << n - cnt << '\n'; } return0; }