codeforces educational round 76
B. Magic Stick
C. Dominated Subarray
Description
给出一个序列串,求满足下述要求的最短子串序列。
- 子串序列内出现最多的元素有且仅有一种。
Solution
贪心思路:原序列相等的两个值最近的间距。
最开始想偏了,写了个滑窗,tle。
D. Yet Another Monster Killing Problem
Description
Solution
思路来自codeforces论讨赛后讨论
对英雄而言,求每种耐力对应最大的攻击力,并求前缀最大值。
那么有判断条件
pre[i]代表耐力大于等于i的最大攻击值,c
F. Make Them Similar
Description
给定一个序列a,求一个数x使得a中每一个数与x异或后的二进制中1的个数相同。
Solution
看了题解发现了一种记录两个数组对应索引项之和是否相等的骚操作。
如对于$a=\{1,2,3,4,7\},b=\{7,6,5,4,1\}$
求a中数据全部减去a[0]后的值$a^1=\{0,1,2,3,6\}$
求b中数据全部被b[0]减去后的值$b^1=\{0,1,2,3,6\}$
发现$a^1=b^1$,那么就可以知道a+b中元素都相等。
回到本题,枚举每一个$x\ in\ [0,2^{30}-1]$显然复杂度炸裂,那么可以采用meet in the middle的方法。
先枚举高位再枚举低位,反过来亦可。
利用map对类差分序列进行记录。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 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 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 const int bit = 15; 88 map<vector<int>, int> mp; 89 int a[maxn]; 90 int main(int argc, char const *argv[]) 91 { 92 #ifndef ONLINE_JUDGE 93 freopen("in.txt", "r", stdin); 94 // freopen("out.txt", "w", stdout); 95 #endif 96 n = read<int>(); 97 for (int i = 0; i < n; i++) 98 a[i] = read<int>(); 99 mp.clear(); 100 int tmp = 1 << bit; 101 for (int i = 0; i < tmp; i++) 102 { 103 vector<int> cur(n); 104 for (int j = 0; j < n; j++) 105 cur[j] = __builtin_popcount((a[j] & (tmp - 1)) ^ i); 106 for (int j = n - 1; j >= 0; j--) 107 cur[j] -= cur[0]; 108 mp[cur] = i; 109 } 110 int f = 0; 111 for (int i = 0; i < tmp && !f; i++) 112 { 113 vector<int> cur(n); 114 for (int j = 0; j < n; j++) 115 cur[j] = __builtin_popcount((a[j] >> bit) ^ i); 116 for (int j = n - 1; j >= 0; j--) 117 cur[j] = cur[0] - cur[j]; 118 if (mp.count(cur)) 119 { 120 f = 1; 121 writeln((i << bit) | mp[cur]); 122 } 123 } 124 if (!f) 125 puts("-1"); 126 return 0; 127 }