• codeforces


    A.将给的字符串正反输出两边

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x)  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x)  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 10010;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,K;
    char str[maxn];
    int main(){
        scanf("%s",str);
        int l = strlen(str);
        cout << str;
        for(int i = 0 ; i < l / 2; i ++) swap(str[i],str[l - i - 1]);
        cout << str << endl;
        return 0;
    }
    A

    B.暴力递推出所有数字对应的最终值,求每个最终值得前缀和,查询的时候O(1)输出

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x)  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x)  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 1e6 + 10;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    int N,M,K;
    int fa[maxn];
    int pre[10][maxn];
    int cul(int x){
        int ans = 1;
        while(x){
            if(x % 10) ans *= x % 10;
            x /= 10;
        }
        return ans;
    }
    void init(){
        for(int i = 1 ; i < 10; i ++){
            fa[i] = i;
        }
        for(int i = 10; i < maxn; i ++){
            fa[i] = fa[cul(i)];
        }
        for(int i = 1; i < maxn; i ++){
            for(int j = 1; j <= 9; j ++){
                pre[j][i] = pre[j][i - 1];
            }
            pre[fa[i]][i]++;
        }
    }
    int main(){
        init();
        Sca(N);
        while(N--){
            int l,r,k; Sca3(l,r,k);
            Pri(pre[k][r] - pre[k][l - 1]);
        }
        return 0;
    }
    B

    C.主要在搞明白题意

    先找出形如Ax + By = N,的正数x,y,N较小可以直接暴力

    然后说明序列形成了x个长度A的环和y个长度B的环,构造输出就可以了

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x)  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x)  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 1e6 + 10;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7; 
    LL N;
    LL exgcd(LL a,LL b,LL &x,LL& y){
        if(!a && !b) return -1;
        if(!b){
            x = 1; y = 0;
            return a;
        }
        LL d = exgcd(b,a % b,y,x);
        y -= a / b * x;
        return d;
    }
    void solve(int &cnt,LL x,LL A){
        for(int i = 1; i <= x; i ++){
            int p = cnt;
            for(int j = 1; j < A; j ++){
                cnt++;
                printf("%d ",cnt + 1);
            }
            cnt++;
            printf("%d ",p + 1);
        }
    }
    LL A,B;
    int main(){
        scanf("%lld%lld%lld",&N,&A,&B);
        LL x,y;
        bool flag = 0;
        for(int i = 0; i * A <= N ; i ++){
            if(!((N - i * A) % B)){
                x = i;
                y = (N - i * A) / B;
                flag = 1;
                break;
            }
        }
        if(!flag){puts("-1"); return 0;}
        int cnt = 0;
        solve(cnt,x,A);
        solve(cnt,y,B);
        return 0;
    }
    C

    D.暴力肯定是不行的,极端数据是直接给一条从祖先到叶子权值递减的链,时间复杂度(2e5 * 2e5)

    所以查询祖先要用树上倍增,时间复杂度nlogn

    树上倍增维护每个节点的父亲值。

    1.插入的时候如果当前节点的权值比给定的父亲节点权值小,就直接连上去

    2.如果比给定的权值大,就倍增查找出他父亲的最小的比他权值大的祖先,将这个结点连到他祖先上去。

    3.维护每个结点到根节点的一个前缀和

    4.查询的之后同2,如果倍增查找到祖先前缀和-结点前缀和小于y的值,然后跳到y并计入两者深度差的贡献。

    #include <map>
    #include <set>
    #include <ctime>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    #define For(i, x, y) for(int i=x;i<=y;i++)  
    #define _For(i, x, y) for(int i=x;i>=y;i--)
    #define Mem(f, x) memset(f,x,sizeof(f))  
    #define Sca(x) scanf("%d", &x)
    #define Sca2(x,y) scanf("%d%d",&x,&y)
    #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define Scl(x) scanf("%lld",&x)  
    #define Pri(x) printf("%d
    ", x)
    #define Prl(x) printf("%lld
    ",x)  
    #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
    #define LL long long
    #define ULL unsigned long long  
    #define mp make_pair
    #define PII pair<int,int>
    #define PIL pair<int,long long>
    #define PLL pair<long long,long long>
    #define pb push_back
    #define fi first
    #define se second 
    typedef vector<int> VI;
    int read(){int x = 0,f = 1;char c = getchar();while (c<'0' || c>'9'){if (c == '-') f = -1;c = getchar();}
    while (c >= '0'&&c <= '9'){x = x * 10 + c - '0';c = getchar();}return x*f;}
    const double eps = 1e-9;
    const int maxn = 4e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int mod = 1e9 + 7;
    const int SP = 20; 
    int N,M,K;
    int fa[maxn][SP],dep[maxn];
    LL val[maxn],pre[maxn];
    int main(){
        int Q; Sca(Q);
        LL la = 0;
        int cnt = 1;
        val[0] = 2e18; dep[1] = 1;
        while(Q--){
            LL op,x,y;
            scanf("%lld%lld%lld",&op,&x,&y);
            x ^= la; y ^= la;
        //    cout <<"bug" <<op << " " << x << " " << y << endl;
            if(op == 1){
                cnt++; val[cnt] = y;
                if(val[cnt] > val[x]){
                    for(int i = SP - 1; i >= 0 ; i --){
                        int f = fa[x][i];
                        if(val[f] < val[cnt]) x = f; 
                    }
                    x = fa[x][0];
                }
                dep[cnt] = dep[x] + 1;
                fa[cnt][0] = x;
                pre[cnt] = pre[x] + val[cnt];
                for(int i = 1;i < SP; i ++) fa[cnt][i] = fa[fa[cnt][i - 1]][i - 1];
             }else{
                 if(y < val[x]){
                     la = 0; puts("0");
                     continue;
                }
                y -= val[x];
                la = 1;
                x = fa[x][0];
                 for(int i = SP - 1; i >= 0 && x != 0; i --){
                     int f = fa[x][i];
                     LL p = pre[x] - pre[f];
                     if(y >= p){
                         y -= p;
                         la += (dep[x] - dep[f]);
                         x = f;
                     }
                 }
                 Prl(la); //la
             }
        }
        return 0;
    }
    D
  • 相关阅读:
    HDU 1202 The calculation of GPA
    HDU 1201 18岁生日
    HDU 1200 To and Pro
    C语言实现的图的深度搜索与广度搜索程序
    深度优先搜索和广度优先搜索的深入讨论
    Linux sftp 安全文件传输命令
    看白鹿原有感
    中国人民抗日战争暨世界反法西斯战争胜利70周年(20150903)
    高一的我曾对自己说"要放慢脚步去生活"!?
    网络营销(续)
  • 原文地址:https://www.cnblogs.com/Hugh-Locke/p/11202137.html
Copyright © 2020-2023  润新知