我是真的刚学C++

CF161D Distance in Tree

他重新定义了“刚”
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


| 下一页