文章目录
- A Dalton the Teacher
- B Longest Divisors Interval
- C2 Dual (hard Version)
- D Earn or Unlock
Codeforces Round 889 (Div. 2)(视频讲解A——D)
A Dalton the Teacher
#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 10;void solve()
{int n;cin >> n;vector<int>a(n + 1);int ans = 0;for(int i = 1; i <= n; i ++){cin >> a[i];if(a[i] == i)ans ++;}cout << (ans + 1) / 2 << endl;
} signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t--)solve();
}
B Longest Divisors Interval
#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 10;void solve()
{int n;cin >> n;if(n <= 2){cout << n << endl;return;}for(int i = 1; i <= n; i ++){if((n % i) != 0){cout << i - 1 << endl;return;}}
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t--)solve();
}
C2 Dual (hard Version)
#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 10;void add_1(vector<int>&a, vector<pii>&ans)
{for(int i = 0; i < a.size() - 1; i ++){a[i + 1] += a[i];ans.push_back({i + 1, i});}cout << ans.size() << endl;for(auto [a, b] : ans)cout << a + 1 << " " << b + 1 << endl;return;
}void add_2(vector<int>&a, vector<pii>&ans)
{for(int i = a.size() - 1; i >= 1; i --){a[i - 1] += a[i];ans.push_back({i - 1, i});}cout << ans.size() << endl;for(auto [a, b]: ans)cout << a + 1 << " " << b + 1 << endl;return;
}void solve()
{int n;cin >> n;vector<int>a(n);int p_max = 0, p_min = 0;int cnt_1 = 0, cnt_2 = 0;vector<pii>ans;for(int i = 0; i < n; i ++){cin >> a[i];if(a[p_max] < a[i])p_max = i;if(a[p_min] > a[i])p_min = i;if(a[i] < 0)cnt_2 ++;if(a[i] > 0)cnt_1 ++;}if(a[p_min] >= 0){add_1(a, ans);return;}if(a[p_max] <= 0){add_2(a, ans);return;}if(abs(a[p_max]) >= abs(a[p_min])){if(cnt_2 <= 12){for(int i = 0; i < n; i ++){if(a[i] < 0){a[i] += a[p_max];ans.push_back({i, p_max});}}add_1(a, ans);}else{for(int i = 0; i < 5; i ++){if(abs(a[p_min]) >= abs(a[p_max]))break;ans.push_back({p_min, p_min});a[p_min] += a[p_min];}for(int i = 0; i < n; i ++){if(a[i] > 0){a[i] += a[p_min];ans.push_back({i, p_min});}}add_2(a, ans);}}else{if(cnt_1 <= 12){for(int i = 0; i < n; i ++){if(a[i] > 0){a[i] += a[p_min];ans.push_back({i, p_min});}}add_2(a, ans);}else{for(int i = 0; i < 5; i ++){if(abs(a[p_max]) >= abs(a[p_min]))break; a[p_max] += a[p_max];ans.push_back({p_max, p_max});}for(int i = 0; i < n; i ++){if(a[i] < 0){a[i] += a[p_max];ans.push_back({i, p_max});}}add_1(a, ans);}}}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while(t--)solve();
}
D Earn or Unlock
#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long
using namespace std;typedef long long ll;
typedef pair<int,int> pii;
const int N = 2e5 + 10;
bitset<N>f;
int n, a[N], sum[N];
void solve()
{cin >> n;for(int i = 1; i <= n; i ++)cin >> a[i];for(int i = 1; i <= 2 * n; i ++)sum[i] = sum[i - 1] + a[i];int ans = 0;f[1] = 1;for(int i = 1; i <= 2 * n; i ++){f |= (f << a[i]);if(f[i]){ans = max(sum[i] - i + 1, ans);f[i] = 0;}}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();
}