while (q--) { ll x, y, k, s; cin >> x >> y >> k >> s; v[x][y] += s; for (int i = x - k; i <= x + k; i++) { if (i == x) continue; ll xx = (i + n - 1) % n + 1; v[xx][y] += s; } for (int i = y - k; i <= y + k; i++) { if (i == y) continue; ll yy = (i + m - 1) % m + 1; v[x][yy] += s; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cout << v[i][j] << ' '; } cout << '\n'; } }
intmain() { ios::sync_with_stdio(0); cin.tie(0); int _ = 1; // cin >> _; while (_--) { solve(); } return0; }
voidsolve() { cin >> n; map <pair<ll, ll>, bool> mp; for (int i = 0; i < n; i++) { int a, b; cin >> a >> b; mp[{a, b}] = true; }
for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 6; j++) { if (!mp[{i, j}]) { e[i].push_back(j); } } }
auto dfs = [&] (ll day, ll course, auto self) -> void { if (day == 7) { ans++; return; }
for (auto x : e[day + 1]) { if (x == course) continue; self(day + 1, x, self); } };
for (auto x : e[1]) { dfs(1, x, dfs); }
cout << ans << '\n'; }
intmain() { ios::sync_with_stdio(0); cin.tie(0); int _ = 1; // cin >> _; while (_--) { solve(); } return0; }
E - 比较A和B的大小
题意:
给定一种新的比较两数大小的方式:整数部分相同,但小数部分按整数来比较大小。例如:0.13 > 0.3, 0.50 > 0.5。 给定两个数,若新的方式与数学方式的比大小结果相同,输出”ni shi dui de” 否则,输出”ni cuo le, ying gai shi ‘正确答案’”。 “正确答案”为:<, >, =。
int found2 = 0;//normal compare for (int i = 0; i < min(ss1.size(), ss2.size()); i++) { if (ss1[i] < ss2[i]) { found2 = 1; break; }elseif (ss1[i] > ss2[i]) { found2 = 2; break; } }
if (found2 == 0) { if (ss1.size() < ss2.size()) { bool foundd = false; for (int i = ss1.size(); i < ss2.size(); i++) { if (ss2[i] != '0') { foundd = true; } } if (foundd) { found2 = 1; } }elseif (ss1.size() > ss2.size()) { bool foundd = false; for (int i = ss2.size(); i < ss1.size(); i++) { if (ss1[i] != '0') { foundd = true; } } if (foundd) { found2 = 2; } } }
int found3 = 0;//require compare string t1; int index = 0;//remove 0 from front while (index < ss1.size()) { if (ss1[index] != '0') { break; } index++; } t1 = ss1.substr(index, ss1.size() - index);
string t2; index = 0; while (index < ss2.size()) { if (ss2[index] != '0') { break; } index++; } t2 = ss2.substr(index, ss2.size() - index);
if (t1.size() < t2.size()) { found3 = 1; }elseif (t1.size() > t2.size()) { found3 = 2; }else { for (int i = 0; i < t1.size(); i++) { if (t1[i] < t2[i]) { found3 = 1; break; }elseif (t1[i] > t2[i]) { found3 = 2; break; } } }
if (found2 == found3) { cout << "ni shi dui de" << '\n'; }elseif (found2 == 0 && found3 == 1) { cout << "ni cuo le, ying gai shi <" << '\n'; }elseif (found2 == 0 && found3 == 2) { cout << "ni cuo le, ying gai shi >" << '\n'; }elseif (found2 == 1 && found3 == 0) { cout << "ni cuo le, ying gai shi =" << '\n'; }elseif (found2 == 1 && found3 == 2) { cout << "ni cuo le, ying gai shi >" << '\n'; }elseif (found2 == 2 && found3 == 0) { cout << "ni cuo le, ying gai shi =" << '\n'; }elseif (found2 == 2 && found3 == 1) { cout << "ni cuo le, ying gai shi <" << '\n'; } } intmain() { ios::sync_with_stdio(0); cin.tie(0); int _ = 1; //cin >> _; while (_--) { solve(); } return0; }
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ld = longdouble; using pi = pair<ll, ll>;
#define fi first #define se second
constint MAXN = 6e7; constdouble eps = 1e-5; const ll mod = 998244353; ll n, k, p;
voidsolve() { cin >> n >> k >> p; vector <vector <ll> > a(p); for (int i = 0; i < n; i++) { ll t; cin >> t; a[t % p].push_back(t); }
bool found = false; ll ans = LLONG_MAX; for (int i = 0; i < p; i++) { if (a[i].size() < k) continue; else found = true; sort(a[i].begin(), a[i].end());
voidsolve() { cin >> k >> n; vector <ll> v(n); for (int i = 0; i < n; i++) { cin >> v[i]; } ll sum = 0; ll j = 0; ll t = 0; for (int i = 0; i < k; i++) { if (sum >= v[j + 1] && j < n - 1) { j++; } sum += v[j]; if (j == n - 1) { t = k - i - 1; break; } } sum += max(0LL, t) * v[n - 1]; cout << sum << '\n'; }
intmain() { ios::sync_with_stdio(0); cin.tie(0); int _ = 1; cin >> _; while (_--) { solve(); } return0; }
M - 终极考验
题意
给定n个石柱高度,耗费一点能量可以使任意一个i至min(i + x - 1, n)区间内的所有石柱升高1米。
求使得石柱的高度单调不降所要耗费能量的最小值。
思路
这里给出一个另类的思路。对于任意一个vi,在(i - x + 1, i)这个区间内若存在vy需要增加,则vi一定会与vy增加相同次数。因此,在维护好一个差分数组后,我们可以考虑对于任意一个di,加上需要做区间加且区间加触及不到di的合法的di - x,最后加上所有小于0的d[i]的绝对值即可 时间复杂度:O(n);
voidsolve() { cin >> n; vector <ll> v(n + 1); for (int i = 1; i <= n; i++) { cin >> v[i]; } sort(v.begin() + 1, v.end());
auto check = [&] (ll md) -> bool { ll l = 1; for (int i = 1; i <= n; i++) { if (v[i] - v[1] <= md) { l = i; }else { break; } } ll r = n; for (int i = n - 1; i >= 1; i--) { if (v[n] - v[i] <= md) { r = i; }else { break; } } return r <= l + 1; };
ll l = 0, r = v[n]; while (l <= r) { ll mid = l + ((r - l) >> 1); if (check(mid)) { r = mid - 1; }else { l = mid + 1; } } cout << l << '\n'; }
intmain() { ios::sync_with_stdio(0); cin.tie(0); int _ = 1; cin >> _; while (_--) { solve(); } return0; }