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 > d化简变成 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;
}

 

posted @ 2020-11-22 01:54  163467  阅读(106)  评论(0编辑  收藏  举报