A题:相反数
模拟就行了,数字不是很大只要用循环让他变反再加上是原数就行了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1555555; inline int read(){ int s=0,f=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar(); } while(c>='0'&&c<='9'){ s=(s<<1)+(s<<3)+(c^48);c=getchar(); } return f*s; } int n,m,a[N]; int main(){ int n=read(); int s=n,u=0; while(s){ u=u*10+s%10; s/=10; } cout<<n+u<<endl; return 0; }
C题:完全平方数
n <= 100000
0<= l <= r <= 1000000000
如果我们枚举的话n*根号r,如果都是最大范围的话会超时。
所以我们用差分约束就行了
算出1到l和1到r有多少平方数然后相减就是答案。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1555555; inline int read(){ int s=0,f=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar(); } while(c>='0'&&c<='9'){ s=(s<<1)+(s<<3)+(c^48);c=getchar(); } return f*s; } int n,m,a[N]; int main(){ int T=read(); while(T--){ int l=read(),r=read(); int x=sqrt(l),y=sqrt(r); if(x*x!=l)x++; cout<<y-x+1<<endl; } return 0; }
D题:小H和游戏
距离小于2的点有这么些情况:儿子,父亲,儿子的儿子,父亲的儿子(兄弟)
每次修改的时候该节点和其父亲节点+1.
查询我们查询它的儿子和它的父亲有多少个+1,儿子的儿子会让儿子+1,兄弟和自身会让父亲+1,但是还差父亲的父亲,所以我们再单独加上父亲的父亲即可.
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1555555; inline int read(){ int s=0,f=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar(); } while(c>='0'&&c<='9'){ s=(s<<1)+(s<<3)+(c^48);c=getchar(); } return f*s; } int n,m,a[N],f[N],num[N]; vector<int>q[N]; void dfs(int u,int fa){ f[u]=fa; for(int i=0;i<q[u].size();i++){ int t=q[u][i];if(t==fa)continue; dfs(t,u); } } int main(){ int n=read(),m=read(); for(int i=1;i<n;i++){ int x=read(),y=read(); q[x].push_back(y); q[y].push_back(x); } dfs(1,0); f[1]=n+1; for(int i=1;i<=5;i++){ f[n+i]=n+i+1; } while(m--){ int x=read();num[x]++; a[x]++; a[f[x]]++; int s=num[f[f[x]]]+a[f[x]]; for(int i=0;i<q[x].size();i++){ if(q[x][i]==f[x])continue; s+=a[q[x][i]]; } printf("%d\n",s); } return 0; }