A. Balanced Rating Changes
Description
给一个长度位n总和为0的一个序列,要求每个值除以2,对于奇数可以向上取整也阔以向下取整,且最终和依然为0
Solution
1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <numeric> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 using namespace std; 24 typedef long long ll; 25 typedef long double ld; 26 typedef unsigned long long ull; 27 typedef pair<int, int> P; 28 int n, m, k; 29 const int maxn = 1e5 + 10; 30 template <class T> 31 inline T read() 32 { 33 int f = 1; 34 T ret = 0; 35 char ch = getchar(); 36 while (!isdigit(ch)) 37 { 38 if (ch == '-') 39 f = -1; 40 ch = getchar(); 41 } 42 while (isdigit(ch)) 43 { 44 ret = (ret << 1) + (ret << 3) + ch - '0'; 45 ch = getchar(); 46 } 47 ret *= f; 48 return ret; 49 } 50 template <class T> 51 inline void write(T n) 52 { 53 if (n < 0) 54 { 55 putchar('-'); 56 n = -n; 57 } 58 if (n >= 10) 59 { 60 write(n / 10); 61 } 62 putchar(n % 10 + '0'); 63 } 64 template <class T> 65 inline void writeln(const T &n) 66 { 67 write(n); 68 puts(""); 69 } 70 int main(int argc, char const *argv[]) 71 { 72 #ifndef ONLINE_JUDGE 73 freopen("in.txt", "r", stdin); 74 // freopen("out.txt", "w", stdout); 75 #endif 76 n = read<int>(); 77 int f = 0; 78 for (int i = 0; i < n; i++) 79 { 80 int x = read<int>(); 81 if (x & 1) 82 { 83 if (f) 84 writeln(x >> 1); 85 else 86 writeln((x + 1) >> 1); 87 f ^= 1; 88 } 89 else 90 writeln(x >> 1); 91 } 92 return 0; 93 }View Code
B. Balanced Tunnel
Description
给两个长度为n的隧道汽车序列,以第一序列为基准,第二序列里有多少汽车超了车。
Solution
将第一序列里元素的顺序映射到第二序列,对于第二序列里的每一个值,判断其后是否有小于它的值,如有则证明其超了车。
使用一个数组记录右端的最小值,如果v[i]==rmin[i],代表没有超车。
1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <cmath> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cstring> 8 #include <iostream> 9 #include <map> 10 #include <numeric> 11 #include <queue> 12 #include <set> 13 #include <stack> 14 #if __cplusplus >= 201103L 15 #include <unordered_map> 16 #include <unordered_set> 17 #endif 18 #include <vector> 19 #define lson rt << 1, l, mid 20 #define rson rt << 1 | 1, mid + 1, r 21 #define LONG_LONG_MAX 9223372036854775807LL 22 #define pblank putchar(' ') 23 #define ll LL 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 1e5 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 int v[maxn], a[maxn], rmin[maxn]; 72 int main(int argc, char const *argv[]) 73 { 74 #ifndef ONLINE_JUDGE 75 freopen("in.txt", "r", stdin); 76 // freopen("out.txt", "w", stdout); 77 #endif 78 n = read<int>(); 79 int res = 0; 80 for (int i = 1; i <= n; i++) 81 v[read<int>()] = i; 82 for (int i = 1; i <= n; i++) 83 a[i] = v[read<int>()]; 84 rmin[n] = a[n]; 85 for (int i = n - 1; i >= 1; i--) 86 rmin[i] = min(rmin[i + 1], a[i]); 87 for (int i = 1; i <= n; i++) 88 if (a[i] != rmin[i]) 89 ++res; 90 writeln(res); 91 return 0; 92 }View Code
C1. Balanced Removals (Easier)
Description
给出三维空间中的n个点坐标,每次删掉两个点,输出一个删减序列满足每次删掉的两点构成的立方体内不包含其他未删除的点。
Solution
C1数据范围较小,暴力过的。真的很暴力。O(n^4)
1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <numeric> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 using namespace std; 24 typedef long long ll; 25 typedef long double ld; 26 typedef unsigned long long ull; 27 typedef pair<int, int> P; 28 int n, m, k; 29 const int maxn = 1e5 + 10; 30 template <class T> 31 inline T read() 32 { 33 int f = 1; 34 T ret = 0; 35 char ch = getchar(); 36 while (!isdigit(ch)) 37 { 38 if (ch == '-') 39 f = -1; 40 ch = getchar(); 41 } 42 while (isdigit(ch)) 43 { 44 ret = (ret << 1) + (ret << 3) + ch - '0'; 45 ch = getchar(); 46 } 47 ret *= f; 48 return ret; 49 } 50 template <class T> 51 inline void write(T n) 52 { 53 if (n < 0) 54 { 55 putchar('-'); 56 n = -n; 57 } 58 if (n >= 10) 59 { 60 write(n / 10); 61 } 62 putchar(n % 10 + '0'); 63 } 64 template <class T> 65 inline void writeln(const T &n) 66 { 67 write(n); 68 puts(""); 69 } 70 struct point 71 { 72 int x, y, z, idx; 73 point() {} 74 point(int xx, int yy, int zz, int i) : x(xx), y(yy), z(zz), idx(i) {} 75 }; 76 vector<point> vec; 77 inline int judge(const point &now, int cur[][2]) 78 { 79 if (now.x >= cur[0][0] && now.x <= cur[0][1] && now.y >= cur[1][0] && now.y <= cur[1][1] && now.z >= cur[2][0] && now.z <= cur[2][1]) 80 return 1; 81 return 0; 82 } 83 int vis[maxn]; 84 int main(int argc, char const *argv[]) 85 { 86 #ifndef ONLINE_JUDGE 87 freopen("in.txt", "r", stdin); 88 // freopen("out.txt", "w", stdout); 89 #endif 90 n = read<int>(); 91 for (int i = 0; i < n; i++) 92 vec.emplace_back(read<int>(), read<int>(), read<int>(), i + 1); 93 for (int u = 1; u <= n >> 1; u++) 94 { 95 int sz = vec.size(), f = 0; 96 for (int i = 0; i != sz && !f; i++) 97 { 98 if (vis[i]) 99 continue; 100 for (int j = i + 1; j != sz && !f; j++) 101 { 102 if (vis[j]) 103 continue; 104 int cur[3][2]; 105 cur[0][0] = min(vec[i].x, vec[j].x); 106 cur[0][1] = max(vec[i].x, vec[j].x); 107 cur[1][0] = min(vec[i].y, vec[j].y); 108 cur[1][1] = max(vec[i].y, vec[j].y); 109 cur[2][0] = min(vec[i].z, vec[j].z); 110 cur[2][1] = max(vec[i].z, vec[j].z); 111 int flag = 1; 112 for (int k = 0; k < sz && flag; k++) 113 if (k != i && k != j && !vis[k]) 114 { 115 if (judge(vec[k], cur)) 116 flag = 0; 117 } 118 if (flag) 119 { 120 write(vec[i].idx), pblank, writeln(vec[j].idx); 121 f = 1; 122 vis[i] = vis[j] = 1; 123 } 124 } 125 } 126 } 127 return 0; 128 }View Code
C1. Balanced Removals (Hard)
Description
同上,数据范围加到5e4
Solution
挖坑
D. Balanced Playlist
Description
给出一个长度为n的循环序列,一个点的答案定义为从当前点开始可以最多往后走多少个点,当且仅当$2a[j] \geq max(a[i],a[i+1],a[j-1])$时才可往下走
Solution
模拟发现可以走完到2*n-1则证明可以无限走。
使用set记录最大值,由于权值并非不同,使用multiset维护。类似滑动窗口
1 /* 2 单调队列 3 */ 4 #include <algorithm> 5 #include <cctype> 6 #include <cmath> 7 #include <cstdio> 8 #include <cstdlib> 9 #include <cstring> 10 #include <iostream> 11 #include <map> 12 #include <numeric> 13 #include <queue> 14 #include <set> 15 #include <stack> 16 #if __cplusplus >= 201103L 17 #include <unordered_map> 18 #include <unordered_set> 19 #endif 20 #include <vector> 21 #define lson rt << 1, l, mid 22 #define rson rt << 1 | 1, mid + 1, r 23 #define LONG_LONG_MAX 9223372036854775807LL 24 #define pblank putchar(' ') 25 #define ll LL 26 using namespace std; 27 typedef long long ll; 28 typedef long double ld; 29 typedef unsigned long long ull; 30 typedef pair<int, int> P; 31 int n, m, k; 32 const int maxn = 1e5 + 10; 33 template <class T> 34 inline T read() 35 { 36 int f = 1; 37 T ret = 0; 38 char ch = getchar(); 39 while (!isdigit(ch)) 40 { 41 if (ch == '-') 42 f = -1; 43 ch = getchar(); 44 } 45 while (isdigit(ch)) 46 { 47 ret = (ret << 1) + (ret << 3) + ch - '0'; 48 ch = getchar(); 49 } 50 ret *= f; 51 return ret; 52 } 53 template <class T> 54 inline void write(T n) 55 { 56 if (n < 0) 57 { 58 putchar('-'); 59 n = -n; 60 } 61 if (n >= 10) 62 { 63 write(n / 10); 64 } 65 putchar(n % 10 + '0'); 66 } 67 template <class T> 68 inline void writeln(const T &n) 69 { 70 write(n); 71 puts(""); 72 } 73 multiset<int> s; 74 int a[maxn << 2]; 75 inline int mx() 76 { 77 return *s.rbegin(); 78 } 79 int main(int argc, char const *argv[]) 80 { 81 #ifndef ONLINE_JUDGE 82 freopen("in.txt", "r", stdin); 83 // freopen("out.txt", "w", stdout); 84 #endif 85 n = read<int>(); 86 for (int i = 1; i <= n; i++) 87 a[i] = a[i + n] = a[i + 2 * n] = read<int>(); 88 for (int i = 1, j = 1; i <= n; i++) 89 { 90 if (s.empty()) 91 s.emplace(a[i]), j++; 92 while (j - i < 2 * n - 1 && mx() <= 2 * a[j]) 93 s.emplace(a[j]), ++j; 94 int res = (j - i >= 2 * n - 1) ? -1 : j - i; 95 write(res), pblank; 96 s.erase(s.find(a[i])); 97 } 98 return 0; 99 }View Code