A、暴力

#include<iostream>
#include<algorithm>
using namespace std;
int n;
int main()
{
    cin>>n;
    int k=0,m=n;
    while(m)
    {
        k=k*10+m%10;
        m=m/10;
    }
    cout<<k+n;
    return 0;
}

B、
dp吧,这题有题解,我是看题解写的,就不放了;
C、完全平方数的个数(0的时候特判)为(ll)sqrt(r)-(ll)sqrt(l-1),举个例子,例如1~10000,模拟一下即可

#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
int main()
{
     ll l,r;
    ll t;
    cin>>t;
    while(t--){
        cin>>l>>r;
        ll ans=0,ans1=0;
        if(l==0) cout<<(ll)sqrt(r)+1<<endl;
         else cout<<(ll)sqrt(r)-(ll)sqrt(l-1)<<endl;
    }
    return 0;
}

D、
表示只想到了dfs,但数据只过了90%,所以需要看dfs中是否重复搜索;
之后就是dp

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1100000
int n,head[maxn],q,cnt,f[maxn],tree[maxn][3];
struct edge{
    int nx,to;
}edge[maxn*2];
void dfs(int u,int fa,int depth)
{
    f[u]=fa;
    for(int i=head[u];i;i=edge[i].nx)
    {
        int v=edge[i].to;
        if(v!=fa)
        {
            dfs(v,u,depth+1);
        }
    }
}
void add(int u,int v)
{
    edge[++cnt].nx=head[u];
    edge[cnt].to=v;
    head[u]=cnt;
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y),add(y,x);
    }
    dfs(1,0,0);
    while(q--)
    {
        int a;
        cin>>a;
        tree[f[a]][0]++,tree[f[a]][1]++;
        tree[f[f[a]]][0]++;
        tree[a][1]++;
        tree[a][2]++;
        cout<<tree[a][0]+tree[f[a]][1]+tree[f[f[a]]][2]<<endl;
    }
}