• Codeforces_832


    A.判断n/k的奇偶性。

    #include<bits/stdc++.h>
    using namespace std;
    
    long long n,k;
    
    int main()
    {
        ios::sync_with_stdio(0);
        cin >> n >> k;
        long long t = n/k;
        if(t%2) cout << "YES" << endl;
        else    cout << "NO" << endl;
        return 0;
    }
    View Code

    B.先计算l = len(ss)-len(s去掉*后),若l小于0,则肯定NO。从左到右一个个判断,遇到*的时候,直接判断ss中l个字母。还要注意*在末尾的情况。

    #include<bits/stdc++.h>
    using namespace std;
    
    string s,ss;
    int n;
    map<char,int> mp;
    
    int main()
    {
        ios::sync_with_stdio(0);
        cin >> ss >> s >> n;
        for(int i = 0;i < ss.length();i++)  mp[ss[i]] = 1;
        s = ' '+s;
        while(n--)
        {
            cin >> ss;
            ss = ' '+ss;
            int t = ss.length()-s.length()+1,flag = 1;
            if(t < 0)
            {
                cout << "NO" << endl;
                continue;
            }
            int i = 1,j = 1;
            for(;i < s.length() && j < ss.length();i++,j++)
            {
                if(s[i] == '?')
                {
                    if(!mp.count(ss[j]))    flag = 0;
                }
                else if(s[i] == '*')
                {
                    j--;
                    while(t--)
                    {
                        j++;
                        if(mp.count(ss[j])) flag = 0;
                    }
                }
                else if(s[i] != ss[j])  flag = 0;
            }
            if(i < s.length() && s[i] == '*')   i++;
            if(flag && i == s.length() && j == ss.length()) cout << "YES" << endl;
            else    cout << "NO" << endl;
        }
        return 0;
    }
    View Code

    C.二分时间,对于每一个时间,更新每个向左的人的满足区间和向右的人的满足区间,只要两个区间相交,则该时间符合。

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    long long s;
    struct xx
    {
        long long x,v,d;
    }a[100005];
    
    bool ok(double t)
    {
        long long l1 = 1000001,r1 = 0,l2 = 1000001,r2 = 0;
        for(int i = 1;i <= n;i++)
        {
            if(a[i].d == 1)
            {
                if(a[i].v*t >= a[i].x)
                {
                    l1 = 0;
                    r1 = 1000000;
                }
                else if((a[i].v+s)*t >= a[i].x)
                {
                    l1 = min(l1,a[i].x);
                    r1 = max(r1,a[i].x+(long long)((s*t+a[i].v*t-a[i].x)*(s-a[i].v))/s);
                }
            }
            else
            {
                if(a[i].v*t >= 1000000-a[i].x)
                {
                    l2 = 0;
                    r2 = 1000000;
                }
                else if((a[i].v+s)*t >= 1000000-a[i].x)
                {
                    r2 = max(r2,a[i].x);
                    l2 = min(l2,a[i].x-(long long)((s*t+a[i].v*t-1000000+a[i].x)*(s-a[i].v))/s);
                }
            }
        }
        if(l1 > r2 || l2 > r1)  return 0;
        return 1;
    }
    int main()
    {
        ios::sync_with_stdio(0);
        cin >> n >> s;
        for(int i = 1;i <= n;i++)   cin >> a[i].x >> a[i].v >> a[i].d;
        double l = 0,r = 1000000;
        for(int i = 1;i <= 100;i++)
        {
            double mid = (l+r)/2;
            if(ok(mid)) r = mid;
            else    l = mid;
        }
        cout << fixed << setprecision(10) << l << endl;
        return 0;
    }
    View Code

    D.先假定一个根,每个询问分别计算3个点为f点时的ans,期间用到lca。

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,q,dep[100005] = {0},fa[100005][25];
    vector<int> v[100005];
    
    void dfs(int now,int pre)
    {
        dep[now] = dep[pre]+1;
        for(int i = 0;i < v[now].size();i++)
        {
            int t = v[now][i];
            if(t == pre)    continue;
            fa[t][0] = now;
            dfs(t,now);
        }
    }
    
    int lca(int x,int y)
    {
        if(dep[x] < dep[y]) swap(x,y);
        int t = dep[x]-dep[y];
        for(int i = 0;i <= 20;i++)
        {
            if((1<<i)&t)    x = fa[x][i];
        }
        if(x == y)  return x;
        for(int i = 20;i >= 0;i--)
        {
            if(fa[x][i] != fa[y][i])
            {
                x = fa[x][i];
                y = fa[y][i];
            }
        }
        return fa[x][0];
    }
    
    int f(int x,int y,int z)
    {
        int xy = lca(x,y),xz = lca(x,z),yz = lca(y,z);
        int ans = dep[x]-max(dep[xy],dep[xz])+1;
        if(xy == xz)    ans += dep[yz]-dep[xy];
        return ans;
    }
    
    int main()
    {
        ios::sync_with_stdio(0);
        cin >> n >> q;
        for(int i = 2;i <= n;i++)
        {
            int x;
            cin >> x;
            v[i].push_back(x);
            v[x].push_back(i);
        }
        dfs(1,0);
        for(int i = 1;i <= 20;i++)
        {
            for(int j = 1;j <= n;j++)
            {
                fa[j][i] = fa[fa[j][i-1]][i-1];
            }
        }
        while(q--)
        {
            int x,y,z;
            cin >> x >> y >> z;
            int ans1 = f(x,y,z);
            int ans2 = f(y,x,z);
            int ans3 = f(z,x,y);
            cout << max(ans1,max(ans2,ans3)) << endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    silverlight重写TextBox PassWordBox
    android使用html开发
    SilverLight中DataGrid显示值转换
    STM32 GPIO 的配置与使用
    开始。。
    VCS使用指令
    【转】关闭 Windows 7中的 6to4 隧道
    DC中关于list、双引号和花括号的使用区别
    解决了microblaze在ISE中例化时自动插入IO buffer
    Recovery time 和 Removal time的概念
  • 原文地址:https://www.cnblogs.com/zhurb/p/7233285.html
Copyright © 2020-2023  润新知