A.思路:a不大 直接模拟即可 如果数据范围大点套个大数板子就好

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int x;

    cin >> x;

    int y = 0;
    int k = 1;

    int a = x;
    int b = x;

    while(a)
    {
        a /= 10;
        k *= 10;
    }

    k /= 10;

    while(x)
    {
        y += (x%10)*k;
        x /= 10;

        k /= 10;
    }

    cout << b + y << '\n';

    return 0;
}

B.思路:这题有点离谱 涨个姿势 bitset优化 根据抽屉原理知道 如果你n >= 3600 是一定存在的
然后根据bitset 将多余的3600 和 剩下的加上 |运算就是加上的含义

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;

#define LL long long

int dp[N][3605],a[N];

int main()
{
    ios::sync_with_stdio(false);

    int t;

    cin >> t;

    while(t --)
    {
        int n;

        cin >> n;

        for(int i = 1;i <= n;i ++)
            cin >> a[i];

        bitset<3600>bit;

        for(int i = 1;i <= n;i ++)
        {
            int x = a[i]%3600;

            bit |= (bit << x) | (bit >> (3600 - x));

            bit[x] = 1;
        }

        if(bit[0] == 1)
            cout << "YES" ;
        else
            cout << "NO" ;

        cout << '\n';
    }

    return 0;
}

C.思路:两种方法 根据数学公式的话有个 O(1)就可以得到答案 也可以打表 然后二分答案 总共就三万多个
1.二分

#include <bits/stdc++.h>

using namespace std;

#define LL long long

vector <LL> vec;


int main()
{
    ios::sync_with_stdio(false);

    for(LL i = 0;i * i<= 1000000000 ;i ++)
        vec.push_back(i * i);

    int n ;

    cin >> n ;

    while(n --)
    {
        LL l,r;

        cin >> l >> r;

        cout << upper_bound(vec.begin(),vec.end(),r)  - lower_bound(vec.begin(),vec.end(),l) << '\n';
    }

    return 0;
}

2.数学公式

#include <bits/stdc++.h>

using namespace std;

#define LL long long

vector <LL> vec;


int main()
{
    ios::sync_with_stdio(false);

    int n ;

    cin >> n ;

    while(n --)
    {
        LL l , r;

        cin >> l >> r;

        int x = (int)sqrt(r);
        int y = (int)sqrt(l);

        int res = x - y ;

        if(y * y == l)
            res ++ ;

        cout << res << '\n';
    }
    return 0;
}

D.看到跟树有关的 多半是有dfs没跑了 关键点在于对于树上的更新 我们先跑dfs标记出每个点的父亲 然后用sum[i][3] 0 1 2 分别代表对本身 儿子 孙子 的影响 同样波及的有它父亲 和 爷爷 对于他的兄弟结点 就把影响算在 他们父亲结点对儿子结点的影响上即可

答案的话就是 本身的影响 + 父亲爷爷 对它的影响

#include <bits/stdc++.h>

using namespace std;

const int N = 750005,INF = 0x3f3f3f3f;

vector <int> e[N];
int fa[N],sum[N][3];///本身 儿子 孙子

void dfs(int u,int v)///预处理每个点父亲结点的关系
{
    fa[u] = v;

    for(int i = 0;i < e[u].size();i ++)
    {
        if(e[u][i] == v)
            continue;

        dfs(e[u][i],u);
    }
}

int main()
{
    int n , q;

    ios::sync_with_stdio(false);

    cin >> n >> q;

    for(int i = 1;i < n;i ++)
    {
        int u,v;

        cin >> u >> v;

        e[u].push_back(v);
        e[v].push_back(u);
    }

    dfs(1,0);

    while(q --)
    {
        int x;

        cin >> x;

        sum[x][1] ++ ,sum[x][2] ++ ;///对儿子孙子
        sum[fa[x]][0] ++ ,sum[fa[fa[x]]][0] ++ ;///父亲 爷爷
        sum[fa[x]][1] ++;///i 本身 和 i 的兄弟结点共同波及

        cout << sum[x][0] + sum[fa[x]][1] + sum[fa[fa[x]]][2] << '\n';
    }

    return 0;
}