-
P3915 树的分解
DFS 维护每棵树的子树大小,如果统计到 s i z x = k siz_x=k sizx=k,那么重新将 s i z x siz_x sizx 归零继续统计。
注意要输入完了再特判,双向边要开两倍数组。
#include <bits/stdc++.h> using namespace std;const int maxn=2e5+5; int head[maxn],A,B,siz[maxn],tot,cnt,N,K; struct edge{int to,nxt;}e[maxn];void add(int x,int y){e[++cnt]=(edge){y,head[x]},head[x]=cnt;}void dfs(int x,int fa) {siz[x]=1;for(int i=head[x];i;i=e[i].nxt) {if(e[i].to==fa) continue;dfs(e[i].to,x),siz[x]+=siz[e[i].to];}if(siz[x]==K) siz[x]=0,tot++; }int main() {int T;cin>>T;while(T--){cin>>N>>K;memset(head,0,sizeof head),cnt=0,tot=0,memset(siz,0,sizeof siz);memset(e,0,sizeof e);for(int i=1,A,B;i<N;i++) cin>>A>>B,add(A,B),add(B,A);if(N%K){cout<<"NO"<<endl;continue;}dfs(1,0);if(tot==N/K) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0; }
-
P2527 Panda的烦恼
sol.
-
P3865 【模板】ST 表
Portal.
输出换行符
'\n'
比endl
快。#include <bits/stdc++.h> using namespace std;const int maxn=1e5+5,maxm=2e6+5; int a[maxn],lg[maxn],f[maxn][25];inline int read() {int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f; }void query(int l,int r) { int k=lg[r-l+1];cout<<max(f[l][k],f[r-(1<<k)+1][k])<<'\n'; }int main() {ios::sync_with_stdio(false);int M,N;cin>>N>>M;lg[1]=0;for(int i=1;i<=N;i++) f[i][0]=read();for(int i=2;i<=N;i++) lg[i]=lg[i/2]+1;for(int j=1;j<=lg[N];j++)for(int i=1;i<=N-(1<<j)+1;i++) f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); while(M--){int l=read(),r=read();query(l,r);}return 0; }