zoukankan      html  css  js  c++  java
  • 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 "
    "
    #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
    ";
                continue;
            } else if(n == 2) {
                cout << "1
    ";
                continue;
            } else if(n == 3) {
                cout << "2
    ";
                continue;
            } 
            if(n%2 == 1) cout << "3
    ";
            else cout << "2
    ";
        }
        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
    " : "NO
    ");
            }
        }
        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
    ";
            else cout << "Yes
    ";
        }
        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
    " : "Utkarsh
    ");
        }
        return;
    }
    int ask(string s, int x, int y) {
        int ret;
        cout << s << " " << x << " " << y << "
    ";
        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 << "
    ";
        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 << "
    ";
            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 << "
    ";
            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] << "
    ";
            //cout << "x =  " << x << " y = " << y << " z = " << z << "
    ";
            _rep(i,2,n) a[i] = xorval[i]^a[1];
        }    
            cout << "!";
            _rep(i,1,n) cout << " " << a[i];
            cout << "
    ";
            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;
    }
  • 相关阅读:
    BZOJ 2655: calc(拉格朗日插值)
    BZOJ 1485: [HNOI2009]有趣的数列(卡特兰数)
    [学习笔记] 关于组合数的一些总结
    CF 1076E Vasya and a Tree(线段树+树剖)
    CF 1082E Increasing Frequency(贪心)
    51nod 1149 Pi的递推式(组合数学)
    LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
    关于 unsigned int 比较大小
    洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
    洛谷 P4512 [模板] 多项式除法
  • 原文地址:https://www.cnblogs.com/163467wyj/p/14018132.html
Copyright © 2011-2022 走看看