A. Finding Sasuke
n给定了是偶数,两两配对随便怎么搞都行
#include<bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i <= b; i++) typedef long long ll; ll n; ll a[110], b[110]; void run(int T) { cin >> n; rep(i, 1, n) cin >> a[i]; rep(i, 1, n) if(i <= n / 2) cout << a[n - i + 1] << ' '; else cout << -a[n - i + 1] << " "; cout << endl; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(20); int T = 1; cin >> T; rep(i, 1, T) run(i); }
B. A New Technique
很显然一个矩阵能确定一个数的其中一维的信息
#include<bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i <= b; i++) typedef long long ll; ll n, m; pair<ll, ll> ans[250010]; ll mp[510][510]; void run(int T) { cin >> n >> m; ll f; rep(i, 1, n) { rep(j, 1, m) { cin >> f; ans[f].second = j; } } rep(j, 1, m) { rep(i, 1, n) { cin >> f; ans[f].first = i; } } rep(i, 1, n * m) mp[ans[i].first][ans[i].second] = i; rep(i, 1, n) { rep(j, 1, m) cout << mp[i][j] << ' '; cout << ' '; } } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(20); int T = 1; cin >> T; rep(i, 1, T) run(i); }
C. Perform Easily
自闭了,对着个假做法敲了好久
实际上把$(b[j] - a[i], j)$提出来排个序,就可以双指针筛了,求个包含$1-j$的最短区间
#include<bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i <= b; i++) typedef long long ll; ll a[7]; ll n, b[100010], ans; vector<pair<ll, ll>> v; ll vis[100010], cnt, id; void run(int T) { rep(i, 1, 6) cin >> a[i]; cin >> n; rep(i, 1, n) { cin >> b[i]; rep(j, 1, 6) v.emplace_back(b[i] - a[j], i); } sort(v.begin(), v.end()); ans = 1e12; for(auto it : v) { if(!vis[it.second]) cnt++; vis[it.second]++; while(cnt == n) { ans = min(ans, it.first - v[id].first); vis[v[id].second]--; if(!vis[v[id++].second]) cnt--; } } cout << ans << endl; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(20); int T = 1; //cin >> T; rep(i, 1, T) run(i); }
D. Shurikens
栈模拟,再用堆check一下
#include<bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i <= b; i++) typedef long long ll; int n; stack<int> s; char f[200010]; int a[200010]; priority_queue<int, vector<int>, greater<int>> q; void run(int T) { cin >> n; rep(i, 1, n * 2) { cin >> f[i]; if(f[i] == '-') cin >> a[i]; } rep(i, 1, n * 2) { if(f[i] == '+') s.push(i); else { if(s.empty()) { cout << "NO "; return; } a[s.top()] = a[i]; s.pop(); } } if(!s.empty()) { cout << "NO "; return; } rep(i, 1, n * 2) { if(f[i] == '+') q.push(a[i]); else { if(q.empty() || q.top() != a[i]) { cout << "NO "; return; } q.pop(); } } cout << "YES "; rep(i, 1, n * 2) if(f[i] == '+') cout << a[i] << ' '; cout << ' '; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(20); int T = 1; //cin >> T; rep(i, 1, T) run(i); }
E. Solo mid Oracle
判断答案为-1的情况,即$a > b * c$
然后可以推出:消灭最大生命值的时候 一定 在第一次攻击造成的回复之前
然后对于第i次攻击,造成的伤害为$a$,回复的血量为$b*(i - 1)*d$,找到这个$i$即可
#include<bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i <= b; i++) typedef long long ll; ll a, b, c, d; void run(int T) { cin >> a >> b >> c >> d; if(a > c * b) { cout << -1 << ' '; return; } ll tmp = a / (d * b); ll ans = (tmp + 1) * a; ans -= tmp * (tmp + 1) / 2 * d * b; cout << ans << endl; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(20); int T = 1; cin >> T; rep(i, 1, T) run(i); }