当前位置: 首页 > news >正文

点分治

算法学习

看这里

但他的代码中有一些错误

一个是在计算前没有先计算子树大小,另一个是没有在修改 \(ex\) 函数时判断是否越界(ex是我的函数)

建议看我的代码的注释(P3806 )

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5,K=1e7+5,inf=1e9+5;
struct edge{int v,w;
};
vector<edge>b[N];
vector<int>query,del;
int n,root,mn,tot,m;
int dis[N],dp[N],vis[N],siz[N],ans[N];
bool ex[K];
void getsiz(int x,int f){siz[x]=1;for(auto i:b[x]){if(vis[i.v]||i.v==f)  continue;getsiz(i.v,x);siz[x]+=siz[i.v];}
}
void getroot(int x,int f,int sum){siz[x]=1;dp[x]=0;for(auto i:b[x]){if(vis[i.v]||i.v==f)  continue;getroot(i.v,x,sum);siz[x]+=siz[i.v];dp[x]=max(dp[x],siz[i.v]);}dp[x]=max(dp[x],sum-siz[x]);if(dp[x]<mn)  root=x,mn=dp[x];
}
void getdis(int x,int w,int f){dis[++tot]=w;for(auto i:b[x]){if(vis[i.v]||i.v==f)  continue;getdis(i.v,w+i.w,x);}
}
void figue(int x){for(auto i:b[x]){if(vis[i.v])  continue;tot=0;getdis(i.v,i.w,x);//每一个子树单独枚举,并且深度已经是w了,并且从i.v开始调用,记得改fafor(int j=1;j<=tot;j++){int cnt=0;for(int k=0;k<query.size();k++){if(query[k]>=dis[j])  ans[k]|=ex[query[k]-dis[j]];//先判断防止越界}  }for(int j=1;j<=tot;j++){if(dis[j]<K)  ex[dis[j]]=1,del.push_back(dis[j]);//防止越界}}for(int k:del)  ex[k]=0;del.clear();
}
void solve(int x){ex[0]=1;//路径正好经过rootvis[x]=1;figue(x);for(auto i:b[x]){if(vis[i.v])  continue;//加了一个vis的判断mn=inf;getsiz(i.v,x);//因为之前并不知道子树的大小,所以要提前计算getroot(i.v,x,siz[i.v]);//传当前子树大小solve(root);}
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);b[u].push_back({v,w});b[v].push_back({u,w});}for(int i=1;i<=m;i++){int k;scanf("%d",&k);query.push_back(k);}mn=inf;getroot(1,0,n);solve(root);for(int i=0;i<m;i++){if(ans[i])  printf("AYE\n");else  printf("NAY\n");}
}

T1:

trick:
判断一个序列中两个数的加和有多少小于k,可以枚举每一个数,然后判断有多少数小于它与k的差,树状数组维护即可

或者是二分?但这道题是动态的,我怕二分会炸

注这道题洛谷原题w是可以等于0的,所以要用支持修改0的树状数组

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=4e4+5,inf=1e9+5,K=2e4+5;
struct edge{int v,w;
};
vector<edge>b[N];
vector<int>del;
int n,root,mn,tot,k,ans;
int dis[N],dp[N],vis[N],siz[N],tr[K];
int lowbit(int x){return x&(-x);
}
void add(int x,int z){if(x==0){//可能为0tr[0]+=z;return;}for(;x<K;x+=lowbit(x)){tr[x]+=z;}
}
int ask(int x){int res=0;for(;x;x-=lowbit(x)){res+=tr[x];}return res+tr[0];
}
void getsiz(int x,int f){siz[x]=1;for(auto i:b[x]){if(vis[i.v]||i.v==f)  continue;getsiz(i.v,x);siz[x]+=siz[i.v];}
}
void getroot(int x,int f,int sum){siz[x]=1;dp[x]=0;for(auto i:b[x]){if(vis[i.v]||i.v==f)  continue;getroot(i.v,x,sum);siz[x]+=siz[i.v];dp[x]=max(dp[x],siz[i.v]);}dp[x]=max(dp[x],sum-siz[x]);if(dp[x]<mn)  root=x,mn=dp[x];
}
void getdis(int x,int w,int f){dis[++tot]=w;for(auto i:b[x]){if(vis[i.v]||i.v==f)  continue;getdis(i.v,w+i.w,x);}
}
void figue(int x){// printf("root=%d\n",x);for(auto i:b[x]){if(vis[i.v])  continue;tot=0;getdis(i.v,i.w,x);//每一个子树单独枚举,并且深度已经是w了,并且从i.v开始调用,记得改fafor(int j=1;j<=tot;j++){if(k>=dis[j])  ans+=ask(k-dis[j]);}for(int j=1;j<=tot;j++){// printf("%d %d\n",dis[j],k);if(dis[j]<=k){// printf("%d ",dis[j]);ans++;//计算以重心为终点的贡献add(dis[j],1);del.push_back(dis[j]);}  }// printf("\n");}for(int j:del)  add(j,-1);del.clear();
}
void solve(int x){vis[x]=1;figue(x);for(auto i:b[x]){if(vis[i.v])  continue;//加了一个vis的判断mn=inf;getsiz(i.v,x);//因为之前并不知道子树的大小,所以要提前计算getroot(i.v,x,siz[i.v]);//传当前子树大小solve(root);}
}
int main(){scanf("%d",&n);for(int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);b[u].push_back({v,w});b[v].push_back({u,w});}scanf("%d",&k);mn=inf;getroot(1,0,n);solve(root);printf("%d",ans);
}
http://www.njgz.com.cn/news/324.html

相关文章:

  • 华为荣耀手机还原主屏幕布局
  • ESP IDF引入外部资源文件
  • Day11 矩阵乘法 dp、*常系数齐次线性递推、*动态 dp
  • 亿邮相关漏洞总结
  • 使用DFU模式快速重装macOS15到macbook
  • 大模型的JSON之殇:从脆弱的API调用到稳健的未来
  • [20250727]数论基本概念、最大公约数
  • day05
  • 读心与芯:我们与机器人的无限未来06问题或方案
  • 使用Vue.js实现表单验证
  • HackerOne漏洞报告:AddTagToAssets操作中的IDOR漏洞分析
  • 2025.7 广大附中集训游记
  • Cursor 远程主机无法下载 Python 插件解决
  • 图灵奖和诺贝尔奖双料得主、AI教父Hinton教授国内首次演讲PPT全文实录
  • Chiplet封装技术全面介绍
  • HTTP响应处理的灵活设计(3844)
  • Hyperlane框架的高级特性深度解析:从零拷贝到宏系统的完美融合(8758)
  • 跨平台Web服务开发的新选择(3436)
  • 实时通信技术深度对比:WebSocket与SSE的最佳实践(8145)
  • 高并发处理的Rust实现方案(3116)
  • 现代Web服务器性能革命:我的Rust框架探索之旅(1806)
  • 内存使用效率的终极对决:零拷贝技术的实战应用(6686)
  • 从零开始构建高性能实时聊天系统:Hyperlane框架实战指南(1600)
  • 延迟优化的极致追求:毫秒级响应的秘密(6608)
  • 轻量级服务器架构的极致优化(1595)
  • 2025年7月26日,6位书记校长同台!AI大会交大主场,超多成果重磅发布→
  • 设计系统中的本地化集成:Figma变量与设计令牌实战
  • 推荐6本书《MLIR编译器原理与实践》、《ONNX人工智能技术与开发实践》、《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》
  • K8S常见的微服务中间件部署之Spark
  • 推荐 6 款基于 .NET 开源的串口调试工具,调试效率提升利器!