cf685 div2 abcde
A Subtract or Divide standard input/output 1 s, 256 MB Submit Add to favourites x4501
很明显,如果n是偶数的话,可以直接变成2 然后再变1, 奇数的话就先-1 变偶数就好了, 然后 1 2 3需要特判一下
B Non-Substring Subsequence standard input/output 1 s, 256 MB Submit Add to favourites x497
可以发现 定义这个字串 是否good 只需要看下 给定的 l r 区间的前面 把 s[l] 或者 后面 把 s[r] 替换掉就好了
C String Equality standard input/output 2 s, 256 MB Submit Add to favourites x25
把字符串a 变成 b 的两个操作,第一个代表的意思就是所以的元素都可以移到想要的位置 所以问题关键就变成能不能通过第二个条件 从 a变成b, 然后只有k个相同的字符c才可以变成 c+1,可以通过记录26个字符的数量, 然后从小到大递推 比如说 aaa 变成 bbb 再变成 ccc,知道变成a 和 b 缺少的那部分, 如果可以就输出 yes 否则 输出 no
D Circle Game standard input/output 2 s, 256 MB Submit Add to favourites x2
这题我瞎写的啊, 我列了个方程式 (xk)^2+(xk)^2 < d^2 (xk)^2+((x+1)(k))^2 > d^2,
然后我求出最大的x 看是否能+1 能的话就代表走最后一步的是Ashish 否则就是Utkarsh
满足 (x*k)2+(x*k)2 < d2 的最大的x的下一个点 (x*k)2+((x+1)*k)2 ? d2 如果大于d*d那么先手必输, 否则先手必胜
因为 (x*k+k, x*k+k) 和 (x*k, x*k+2k) (x*k+2k, x*k) 三个点 一定在圆外,
因为 (x*k, x*k) 是在y=x与在圆内的最大点,所以这条线下一个点(x*k+k, x*k+k)一定是在圆外的
也就是 ((x+1)*k)2+((x+1)*k)2 > d2 化简变成 x > d/(sqrt(2)*k) -1 把x = d/(sqrt(2)*k) -1带入(x*k)2+((x+2)*k)2=d2+2k2 大于d2 所以(x*k+2k, x*k)也在圆外
从 (0, 0) 到 (x*k, x*k)这个特殊点 走的步数一定为偶数 (2*x),
所以就看这个点的下一步是否能走(无论是谁必赢,他的策略都是往这个特殊点走,
如果先手必赢 那么每次Ashish都往Utkarsh走的另一个方向走 一定会走到(x*k, x*k+k)这个点或者(x*k+k, x*k))这个点 然后Utkarsh就不能走了 必输,
如果后手必赢 那么每次Utkarsh都往Ashish走的另一个方向走 一定会走到(x*k, x*k)这个点 然后Ashish就不能走了 必输,
比如说 k = 2 d = 5, (2, 2) 的下一个点 (4,2) 或者 (2,4) 都在圆内, 所以先手必胜 Ashish赢
k = 3 d = 10, (6, 6) 的下一个点 (6,9) 或者 (9,6) 都在圆外, 所以后手必胜 Utkarsh赢
E1 Bitwise Queries (Easy Version) standard input/output 4 s, 256 MB Submit Add to favourites
首先我们回忆下 a^b^a = b, a+b = (a^b)+2*(a&b), 所以我们只需要求出一个值 然后把记录下其他值和它异或的答案, 然后再和这个值异或一次 就是本来的值 这个过程需要 n-1次询问,
然后求出这个确定的值 只能最多三次询问, 然后我们用a1 a2 a3三个值 求出a1, a1+a2= (a1^a2)+2*(a1&a2) a2+a3 = (a1^a3)+2*(a1&a3) a2+a3 = (a2^a3)+2*(a2&a3)
a1^a2 a1^a3 a2^a3= (a1^a2)^(a1^a3) 这三个值可以在与a1异或的数组中取, 所以只需要三次查询 a1&a2 a1&a3 a2&a3 就行了,总共 n-1+3 = n+2次 符合条件 能过
E2 Bitwise Queries (Hard Version) standard input/output 4 s, 256 MB Submit Add to favourites
相比E1少一次查询, 所以需要从已有的数据中再找规律
ai ^ aj = ai ^ ak -> aj = ak -> aj = (aj&ak)/2 如果有两个数和a1的异或值相同就可以直接求这两个数的与值 再除与2就是这两个数的确切值 省下两次查询就能确定a1 总共需n次查询
ai ^ aj = n-1 -> aj & ak = 0, 如果一个数和a1的异或值为n-1 代表a1与这个数的与值为0 省下一次查询, 总共需n+1次查询
F Nullify The Matrix standard input/output 2 s, 256 MB Submit Add to favourites
#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i = (a); i < (b); i++) #define _rep(i,a,b) for(int i = (a); i <= (b); i++) #define all(v) (v).begin(), (v).end() #define nl "\n" #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin()) #define sz(v) ((int)(v).size()) typedef long double ld; typedef long long ll; typedef unsigned long long ull; #ifdef LOCAL #include "pretty_print.h" #define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__) #else #define dbg(...) 42 #endif template <typename T> T sqr(T x) { return x * x; } template <typename T> T abs(T x) { return x < 0? -x : x; } template <typename T> T gcd(T a, T b) { return b? gcd(b, a % b) : a; } template <typename T> bool chmin(T &x, const T& y) { if (x > y) { x = y; return true; } return false; } template <typename T> bool chmax(T &x, const T& y) { if (x < y) { x = y; return true; } return false; } auto random_address = [] { char *p = new char; delete p; return (uint64_t) p; }; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1)); mt19937_64 rngll(chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1));
void taskA() { int t; cin >> t; while(t--) { int n; cin >> n; if(n == 1) { cout << "0\n"; continue; } else if(n == 2) { cout << "1\n"; continue; } else if(n == 3) { cout << "2\n"; continue; } if(n%2 == 1) cout << "3\n"; else cout << "2\n"; } return; }
void taskB() { int t; cin >> t; while(t--) { int n, q; cin >> n >> q; string s; cin >> s; _for(i,0,q) { int ok = 0; int l, r; cin >> l >> r; l--, r--; _for(j,0,l) if(s[j] == s[l]) ok = 1; _for(j,r+1,n) if(s[r] == s[j]) ok = 1; cout << (ok ? "YES\n" : "NO\n"); } } return; }
void taskC() { int t; cin >> t; while(t--) { int n,k; cin >> n >> k; string s,t; cin >> s >> t; int a[26] = {}, b[26] = {}; _for(i,0,n) { a[s[i]-'a']++; b[t[i]-'a']++; } int ok = 0; int ans1 = 0, ans2 = 0; _for(i,0,25) { int x = a[i]-b[i]; if(x < 0) ok = 1; if(x>0 and x%k == 0) a[i+1] += x; } if(ok or (a[25] != b[25])) cout << "No\n"; else cout << "Yes\n"; } return; }
void taskD() { int t; cin >> t; while(t--) { ll d,k; cin >> d >> k; ll x = sqrt(d*d/2/k/k); bool ok = 0; if((x*x*k*k+(x+1)*(x+1)*k*k) > d*d) ok = 0; else ok = 1; cout << (ok ? "Ashish\n" : "Utkarsh\n"); } return; }
int ask(string s, int x, int y) { int ret; cout << s << " " << x << " " << y << "\n"; cout.flush(); cin >> ret; if(ret == -1) return 0; return ret; } void taskE1() { int n; cin >> n; vector<int> xorval(n+1), a(n+1); _rep(i,2,n) xorval[i] = ask("XOR", 1, i); int x12 = ask("AND", 1, 2); int x13 = ask("AND", 1, 3); int x23 = ask("AND", 3, 2); int x = xorval[2] + 2*(x12); int y = xorval[3] + 2*(x13); int z = (xorval[2]^xorval[3]) + 2*(x23); a[1] = (x+y-z)/2; _rep(i,2,n) a[i] = xorval[i]^a[1]; cout << "!"; _rep(i,1,n) cout << " " << a[i]; cout << "\n"; cout.flush(); return; } void taskE2() { int n; cin >> n; vector<int> xorval(n+1), a(n+1), vis[n+1]; int same = -1, k; _rep(i,2,n) { xorval[i] = ask("XOR", 1, i); if(xorval[i] == n-1) k = i; if(vis[xorval[i]].size() < 2) vis[xorval[i]].push_back(i); if(vis[xorval[i]].size() > 1) same = xorval[i]; } if(same != -1) { //cout << " same = " << same << "\n"; int x1 = vis[same][0], x2 = vis[same][1]; int x3 = ask("OR", x1, x2); a[1] = xorval[x2]^x3; _rep(i,2,n) a[i] = a[1]^xorval[i]; } else { int x12 = 0, k1, k2; if(k == 2) k1 = 4, k2 = 3; else if(k == n) k1 = 2, k2 = 3; else k1 = 2, k2 = n; //cout << " k = " << k << "\n"; int x13 = ask("AND", 1, k1); int x23 = ask("AND", k1, k); int x = xorval[k] + 2*(x12); int y = xorval[k1] + 2*(x13); int z = (xorval[k]^xorval[k1]) + 2*(x23); a[1] = (x+y-z)/2; //cout << " a[1] = " << a[1] << "\n"; //cout << "x = " << x << " y = " << y << " z = " << z << "\n"; _rep(i,2,n) a[i] = xorval[i]^a[1]; } cout << "!"; _rep(i,1,n) cout << " " << a[i]; cout << "\n"; cout.flush(); return; }
int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); #ifdef LOCAL assert(freopen("i.txt", "r", stdin)); assert(freopen("o.txt", "w", stdout)); #endif taskD(); #ifdef LOCAL cerr << "Time execute: " << clock() / (double)CLOCKS_PER_SEC << " sec" << endl; #endif return 0; }