2017ACM/ICPC亚洲区沈阳站
L-Tree 传送门
思路:解本题的关键在于题目的理解及问题模型的简化。实质就是DFS跑一遍图,记录每个节点作为根节点时此树的大小,然后计数:有多边满足其上下节点个数均大于或等于k个;
代码:
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#define M 200009
using namespace std;
vector<int > G[M];
int dis[M];
void DFS(int x,int f)
{
for(int i=0;i<G[x].size() ;i++){
if(G[x][i]!=f){
DFS(G[x][i],x);
dis[x]=dis[x]+dis[G[x][i]]+1;
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=0;i<=n;i++) G[i].clear() ;
memset(dis,0,sizeof dis);
int x,y;
for(int i=1;i<n;i++){
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
DFS(1,0);
//for(int i=0;i<=n;i++) cout<<dis[i]<<endl;
int ans=0;
for(int i=1;i<=n;i++){
if(dis[i]+1>=k&&(n-dis[i]-1)>=k) ans++;
}
cout<<ans<<endl;
}
return 0;
}
F - Heron and His Triangle传送门
找规律,高精度:
大数乘一位,大数减大数;
#include<bits/stdc++.h>
#define M 1000
using namespace std;
int a[M],b[M],c[M];
char ans[300][M];
char s[M];
void fun()
{
strcpy(ans[1],"4");
strcpy(ans[2],"14");
int i=0,j=0;
for(i=3;i<=100;i++)
{
int len1=strlen(ans[i-1]),len2=strlen(ans[i-2]);
for(j=0;j<len1;j++)
a[len1-j]=ans[i-1][j]-'0';
for(j=0;j<len2;j++)
b[len2-j]=ans[i-2][j]-'0';
j=1;int x=0;
while(j<=len1){
int w=a[j]*4+x;
a[j]=w%10;
x=w/10;
j++;
}
while(x){
a[j++]=x%10;
x=x/10;
}
len1=j;
int k=0;
for(j=1;j<=len1;j++){
c[j]= a[j]-b[j];
}
for(j=1;j<=len1;j++)
{
if(c[j]<0) c[j]+=10,c[j+1]--;
}
while(c[len1]==0){
len1--;
}
for(j=0;j<len1;j++)
ans[i][j]=c[len1-j]+'0';
}
}
int main()
{
fun();
int t;
cin>>t;
while(t--){
scanf("%s",s);
int len=strlen(s);
for(int i=1;i<=100;i++){
if(len==strlen(ans[i])){
if(strcmp(s,ans[i])<=0){
cout<<ans[i]<<endl; break;
}
}
else if(len<strlen(ans[i])){
cout<<ans[i]<<endl; break;
}
}
}
return 0;
}