cf638 div2 abcd
传送门 //cf638div2
A Phoenix and Balance standard input/output 2 s, 256 MB Submit Add to favourites x19609
//taskA A1+....+An-1 < An O(n)
//so let ans = An+A1+..+An/2-1-(An/2+an-1)
B Phoenix and Beauty standard input/output 2 s, 256 MB Submit Add to favourites x12815
//taskB 最后会是一个k长度的数组的循环, O(n(logn+k))
//所以如果数组a中的不同的数多于k 便无解
//否则就构造一个k数组即可,数组a中出现过的数全放里面,如果长度还还不足k 填任意数字将k数组填满即可
//需要n个k循环, 这样的数组肯定包含 原数组a
C Phoenix and Distribution standard input/output 2 s, 256 MB Submit Add to favourites x8421
//taskC S0S1S2.......Sn-1 O(tlogn) sort
// if(s[0] != s[k-1]) 可以将 Sk-Sn 分给S0-Sk-2,所以字典序最大的为 Sk-1
// else 将S0-Sk-1 每个都作为字符串的开头
// 再分析 Sk-Sn if Sk!=Sn 那么可以将Sk-Sn都作为一个字符串这样字典序是最小的 同样是数组的最大字典序
// if Sk==Sn 那么将Sk-Sn 平均分成k份即可,如果有多余的就加到ans字符串后面, 这就是字典序最大的字符串
D Phoenix and Science standard input/output 2 s, 256 MB Submit Add to favourites x5045
//taskD 观察一下一天细胞的mass变化 O(logn)
//假设初始mass为x, 那么一天以后mass会变成 x+1,2x
//最小为不分裂 最大为全部分裂
//所以我们可以试着构造一个 1 2 4 8 16...... 的序列且这个序列一定是最快的
//然后把 n 构造一个这样序列, 如果有多余的话 那就相当于多一天 不分裂
//比如说 n为14 那么可以构造为 1 2 4, 多余为7 那么就为1 2 4 7
//意味着 第一天1个细胞分裂成2个 第二天2个细胞分裂成4个 第三天只有三个细胞分裂,细胞数为6+1个
//构造的序列排个序, 相邻的差值即为每天的分裂细胞数
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define ll long long #define all(v) (v).begin(), (v).end() #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++) const int kMod = 1e9 + 7; const int kMaxN = 1e6 + 5;
ll fpow(ll a, ll b) { ll ret = 1; while(b) { if(b & 1) ret *= a; b >>= 1; a *= a; } return ret; } void taskA() { int t; cin >> t; while(t--) { int n; cin >> n; ll a = 0, f = 1; a += fpow(2, n); _for(i,1,n/2) a += fpow(2, i); _for(i,n/2,n) a -= fpow(2, i); if(a < 0) a *= -1; cout << a << "\n"; } return; }
void taskB() { int t; cin >> t; while(t--) { int n,k; cin >> n >> k; set<int> s; int x; _for(i,0,n) cin >> x, s.insert(x); int len = s.size(); if(len > k) {cout << "-1\n"; continue;} cout << n*k << "\n"; _for(i,0,n) { for(auto it : s) cout << it << " "; _for(i,len,k) cout << "1 "; } cout << "\n"; } return; }
void taskC() { int t; cin >> t; while(t--) { int n,k; cin >> n >> k; string s; cin >> s; sort(all(s)); if(s[0] != s[k-1]) { cout << s[k-1] << "\n"; continue; } cout << s[0]; if(s[k] != s[n-1]) { _for(i,k,n) cout << s[i]; } else { _for(i,0,(n-1-k+k-1)/k) cout << s[k]; } cout << "\n"; } return; }
void taskD() { int t; cin >> t; while(t--) { int n; cin >> n; vector<int> a; for(int i = 1; i <= n; i *= 2) { a.push_back(i); n -= i; } if(n) { a.push_back(n); sort(all(a)); } int len = a.size(); cout << len-1 << "\n"; _for(i,1,len) cout << a[i]-a[i-1] << " "; cout << "\n"; } return; }
int main(){ ios::sync_with_stdio(false), cin.tie(nullptr); //taskA(); //taskB(); //taskC(); //taskD(); return 0; }