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; } }