他重新定义了“刚”
by 小粉兔 @ 2019-03-30 16:48:03
他重新定义了“刚”
by xht @ 2019-03-30 16:50:14
鉴定完毕,这是某神犇的小号
by ViXpop @ 2019-03-30 16:50:18
好了,我现在连萌新都算不上了
by wwlw @ 2019-03-30 16:51:36
你管这叫刚学?
by 自闭头铁娃 @ 2019-03-30 16:52:44
```cpp
std::string operator刚() const {
return static_cast<std::string>("long long ago");
}
```
by 一扶苏一 @ 2019-03-30 16:54:24
楼主:我是真的刚c++
by xiaolou @ 2019-03-30 17:02:17
楼主:也才学了10年吧,不多,什么都没学会,只会了个网络流
by FDWJY4278 @ 2019-03-30 20:28:55
大佬们,这是我改过的
```
#include <cstdio>
#include <algorithm>
using std::sort;
const int maxn=1e5;
const int maxk=1e8;
template<class T>inline void read(T &x) {
T f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^48);s=getchar();}
x*=f;
}
template<class T>inline T max(T a,T b) { return a>b?a:b; }
template<class T>inline T min(T a,T b) { return a<b?a:b; }
struct Edge {
int u,v;
}e[maxn<<1];
int n,m,a,b,c,siz[maxn],maxs[maxn],Siz,root,cnt,tot,head[maxn<<1],vis[maxn],dis[maxn],k,ans;
bool cs[maxk];
inline void addedge(int u,int v) { e[++cnt].v=v; e[cnt].u=head[u]; head[u]=cnt; }
inline void add(int u,int v) { addedge(u,v); addedge(v,u); }
inline void getroot(int x,int fa) {
siz[x]=1;maxs[x]=0;
for(int i=head[x];i;i=e[i].u) {
int v=e[i].v;
if(v==fa||vis[v]) continue;
getroot(v,x);
siz[x]+=siz[v];
maxs[x]=max(maxs[x],siz[v]);
}
maxs[x]=max(maxs[x],Siz-siz[x]);
if(maxs[x]<maxs[root]) root=x;
}
inline int findl(int a,int b,int x) {
int ans=0,l=a,r=b,mid;
while(l<r) {
mid=(l+r)>>1;
if(dis[mid]<x) l=mid+1;
else ans=mid,r=mid-1;
}
return ans;
}
inline int findr(int a,int b,int x) {
int ans=0,l=a,r=b,mid;
while(l<r) {
mid=(l+r)>>1;
if(dis[mid]<=x) l=mid+1;
else ans=mid,r=mid-1;
}
return ans;
}
inline void getdis(int rt,int fa,int d) {
int v;
for(int i=head[rt];i;i=e[i].u) {
v=e[i].v;
if(v==fa||vis[v]) continue;
dis[++tot]=d+1;
getdis(v,rt,dis[tot]);
}
}
inline int getans(int x,int d) {
dis[tot=0]=d;
getdis(x,0,d);
sort(dis+1,dis+tot+1);
//for(int i=1;i<=tot;i++) printf("%d ",dis[i]);
int ll,rr,w=1,ans=0;
while(w<tot&&dis[w]+dis[tot]<k) w++;
while(w<tot&&dis[w]+dis[w+1]<k) {
ll=findl(w+1,tot,k-dis[w]),rr=findr(w+1,tot,k-dis[w]);
if(!ll&&!rr) ans+=(rr-ll+1);
w++;
}
return ans;
}
inline void dfs(int x) {
int v;vis[x]=0;
ans+=getans(x,0);
for(int i=head[x];i;i=e[i].u) {
v=e[i].v;
if(vis[v]) continue;
ans-=getans(v,1);
Siz=siz[v],root=0;
getroot(v,x);
dfs(root);
}
}
int main() {
read(n);read(k);
for(int i=1;i<n;i++) read(a),read(b),add(a,b);
Siz=n;getroot(1,0);
dfs(root);
printf("%d\n",ans);
}
```
by HLPP @ 2019-03-31 16:24:41
神仙们我又改了一下,能不能帮我看看
```
#include <cstdio>
#include <algorithm>
using std::sort;
const int maxn=1e5;
template<class T>inline void read(T &x) {
T f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^48);s=getchar();}
x*=f;
}
template<class T>inline T max(T a,T b) { return a>b?a:b; }
template<class T>inline T min(T a,T b) { return a<b?a:b; }
struct Edge {
int u,v;
}e[maxn<<1];
int n,m,a,b,c,siz[maxn],maxs[maxn],Siz,root,cnt,tot,head[maxn<<1],vis[maxn],dis[maxn],k,ans;
inline void addedge(int u,int v) { e[++cnt].v=v; e[cnt].u=head[u]; head[u]=cnt; }
#define v e[i].v
#define add(a,b) addedge(a,b),addedge(b,a)
inline void getroot(int x,int fa) {
siz[x]=1;maxs[x]=0;
for(int i=head[x];i;i=e[i].u) {
if(v==fa||vis[v]) continue;
getroot(v,x);
siz[x]+=siz[v];
maxs[x]=max(maxs[x],siz[v]);
}
maxs[x]=max(maxs[x],Siz-siz[x]);
if(maxs[x]<maxs[root]) root=x;
}
inline int findl(int a,int b,int x) {
int ans=0,l=a,r=b,mid;
while(l<r) {
mid=(l+r)>>1;
if(dis[mid]<x) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
inline int findr(int a,int b,int x) {
int ans=0,l=a,r=b,mid;
while(l<r) {
mid=(l+r)>>1;
if(dis[mid]<=x) l=mid+1;
else ans=mid,r=mid-1;
}
return ans;
}
inline void getdis(int rt,int fa,int d) {
for(int i=head[rt];i;i=e[i].u) {
if(v==fa||vis[v]) continue;
dis[++tot]=d+1;
getdis(v,rt,dis[tot]);
}
}
inline int getans(int x,int d) {
dis[tot=1]=d;
getdis(x,0,d);
sort(dis+1,dis+tot+1);
for(int i=1;i<=tot;i++) printf("%d ",dis[i]);
int ll,rr,w=1,ans=0;
while(w<tot&&dis[w]+dis[tot]<k) w++;
while(w<tot&&dis[w]+dis[w+1]<=k) {
ll=findl(w+1,tot,k-dis[w]),rr=findr(w+1,tot,k-dis[w]);
if(!ll&&!rr) ans+=(rr-ll+1);
w++;
}
putchar('\n');
return ans;
}
inline void dfs(int x) {
ans+=getans(x,0);
vis[x]=1;
for(int i=head[x];i;i=e[i].u) {
if(vis[v]) continue;
ans-=getans(v,1);
Siz=siz[v];
getroot(v,x);
dfs(root);
}
}
int main() {
read(n);read(k);
for(int i=1;i<n;i++) read(a),read(b),add(a,b);
maxs[0]=0x3f3f3f3f;
Siz=n;getroot(1,0);
dfs(root);
printf("%d\n",ans);
}
```
by HLPP @ 2019-04-13 16:55:51