A. Legs https://codeforces.com/contest/1996/problem/A
翻譯:
農夫約翰的農場又迎來了美好的一天。
農夫約翰來到農場後,數了數 n條腿。眾所周知,農場裡只住著雞和牛,一隻雞有 2 條腿,而一頭牛有 4 條腿。
假設約翰農場主數清了所有動物的腿,那麼他的農場裡最少有多少動物?
思路
求最少有幾隻動物,n先除4再除2就行。
void solve() {
cin >> n;
int k = n / 4;
n -= k * 4;
int p = n / 2;
cout << p + k << "\n";
}
B. Scale https://codeforces.com/contest/1996/problem/B
翻譯
就是說,給你一個n*n的01網格,網格中每個01塊都是相同的長寬,讓你縮小k倍,例如:
8 2
00001111
00001111
00001111 --> 0011
00001111 --> 0011
11110000 --> 1100
11110000 --> 1100
11110000
思路
我們只需要從(1,1)位置開始i和j加k輸出就可以,自己模擬幾下就找到規律
char mpp[N][N];
void solve() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> mpp[i][j];
}
}
for (int i = 1; i <= n; i += k) {
for (int j = 1; j <= n; j += k) {
cout << mpp[i][j];
}
cout << "\n";
}
}
題目 C. Sort https://codeforces.com/contest/1996/problem/C
翻譯
就是說,給你兩個長度為n的字串,詢問q次。
每次給出l,r的區間讓你判斷區間字串是否匹配,不匹配就得去修改a的字元,需要修改幾次才能讓兩個區間相同
思路
首先需要判斷l和r大小,確定迴圈;
統計一下區間字串中字元不同的數量,輸出即可。
一開始用map來做,後來超時了,就做了最佳化。
const int N = 2e5 + 10;
int a_count[26][N], b_count[26][N];
void Count(const string& a, const string& b, int n) {
for (int i = 0; i < 26; ++i) {
a_count[i][0] = b_count[i][0] = 0;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 26; ++j) {
a_count[j][i + 1] = a_count[j][i] + (a[i] == 'a' + j);
b_count[j][i + 1] = b_count[j][i] + (b[i] == 'a' + j);
}
}
}
int get(int l, int r, int n) {
int cnt = 0;
for (int i = 0; i < 26; ++i) {
int ap = a_count[i][r] - a_count[i][l - 1];
int bp = b_count[i][r] - b_count[i][l - 1];
cnt += max(0, bp - ap);
}
return cnt;
}
void solve() {
int n, k;
cin >> n >> k;
string a, b;
cin >> a >> b;
Count(a, b, n);
while (k--) {
int l, r;
cin >> l >> r;
if (l > r) cout << get(1, r, n) + get(l, n, n) << "\n";
else cout << get(l, r, n) << "\n";
}
}
超時版
const int N = 2e5 + 10;
map<char, int>p;
void solve() {
int n, k;
cin >> n >> k;
string a, b;
cin >> a >> b;
while (k--) {
int l, r;
cin >> l >> r;
p.clear();
if (l <= r) {
for (int i = l - 1; i <= r - 1; i++)
p[b[i]]++, p[a[i]]--;
}
else {
for (int i = l - 1; i <= n - 1; i++)
p[b[i]]++, p[a[i]]--;
for (int i = 0; i <= l - 1; i++)
p[b[i]]++, p[a[i]]--;
}
int cnt = 0;
for (char i = 'a'; i <= 'z'; i++)
if (p[i] > 0) cnt += p[i];
cout << cnt << "\n";
}
}
題目 D. Fun https://codeforces.com/contest/1996/problem/D
翻譯
給定兩個整數 n 和 x ,求 ab+ac+bc≤n 和 a+b+c≤x 的個正整數的三元組( a,b,c)的個數。
注意順序問題(例如 ( 1,1,2 ) 和 ( 1,2,1 ) 被視為不同), a , b , c 必須嚴格大於 0 。
思路
由第一個式子可知,a*b<=n,所以b有大約有 nlogn個選擇,可以迴圈ab求解
由兩個式子可推匯出c ≤(n−ab)/(a+b)和 c ≤ x−a−b,我們只需要選擇範圍最小的那一個即可。
#define ll long long
void solve() {
int n, k;
cin >> n >> k;
ll c = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; i * j <= n; j++) {
ll t1 = i * j, t2 = i + j;
if ((n - t1) / t2 > 0 && k - t2 > 0) c += min((n - t1) / t2, k - t2);
}
cout << c << "\n";
}
題目E Problem - E - Codeforces
翻譯
給你一個長度為 n𝑛 的二進位制字串 s𝑠 。對於每一對整數 (l,r)(𝑙,𝑟) . (1≤𝑙≤𝑟≤𝑛) 中,數出(𝑥,𝑦) (𝑙≤𝑥≤𝑦≤𝑟) 這樣的整數對的個數。 (𝑙≤𝑥≤𝑦≤𝑟) 中的 00 等於子串 𝑠𝑥𝑠𝑥+1...𝑠𝑦 中的 1 。
輸出所有可能的 (l,r)(𝑙,𝑟) modulo 109+7109+7 的計數之和。
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<unordered_map>
using namespace std;
typedef unsigned long long ull;
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define mm(a, b) memset(a, b, sizeof(a))
#define mp make_pair
#define ll long long
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;
const int N = 2e6 + 10;
ll n, sum, p[N], f[N], k;
string s;
void solve() {
cin >> s;
n = s.length();
for (ll i = 0; i <= 2 * n; i++) f[i] = 0;
for (ll i = 1; i <= n; i++) {
ll pp = p[i - 1];
if (s[i - 1] == '1') p[i] = pp + 1;
else p[i] = pp - 1;
}
sum = 0;
for (ll i = 0; i <= n; i++) {
ll id = p[i] + n;
sum = (sum + f[id] * (n - i + 1)) % mod;
f[id] = (f[id] + (i + 1)) % mod;
}
cout << sum << '\n';
}
int main() {
ios;
ll t;
cin >> t;
while (t--) solve();
return 0;
}
F.Bomb(參考jiangly的思路)
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<unordered_map>
#include<set>
using namespace std;
typedef unsigned long long ull;
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define mm(a, b) memset(a, b, sizeof(a))
#define mp make_pair
#define ll long long
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;
const int N = 2e6 + 10;
typedef pair<ll, ll> Pair;
Pair get(int v, vector<int>& a, vector<int>& b, int n) {
ll sum = 0;
ll cnt = 0;
for (int i = 0; i < n; ++i) {
if (a[i] >= v) {
ll t = (a[i] - v) / b[i] + 1;
cnt += t;
sum += a[i] * t - t * (t - 1) / 2 * b[i];
}
}
return Pair(cnt, sum);
}
void solve() {
int n, k;
cin >> n >> k;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
int l = 0, r = inf;
while (l < r) {
int x = (l + r) / 2;
if (get(x, a, b, n).first <= k) r = x;
else l = x + 1;
}
Pair res = get(l, a, b, n);
if (l > 0) res.second += (k - res.first) * (l - 1);
cout << res.second << "\n";
}
int main() {
ios;
ll t;
cin >> t;
while (t--) solve();
return 0;
}