首页 > 其他分享 >点分治学习笔记

点分治学习笔记

时间:2023-05-04 18:33:41浏览次数:28  
标签:10001 int 分治 笔记 学习 ton include fin

概念

点分治用于解决有一定要求的链的计数。

对于点 \(u\) 的子树的问题,可以将答案分为:

  1. 经过点 \(u\)

  2. 不经过点 \(u\)

第一种可以用桶加暴力。枚举一端的长度,用桶计算另一端长度;第二种分到子树中解决即可。

注意到,在随机选根的时候该算法表现不优秀,但若根为重心,因为每次子树大小都减少一半,所以时间复杂度优秀,为 \(O(n\log n)\)。

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include<set>
#include<queue>
#define mod 998244353
#define int long long
using namespace std;
int n,m,ans[10001],ques[10001],use[10001],len,fin[10001],len2,ton[10000001],anss,mid,f[10001];
bool debug=false;
struct edge
{
	int v,w;
};
vector<edge> g[10001];
bool vis[10001];
void getmid(int u,int fa,int sz) //重心 
{
    if(u!=1 && g[u].size()==1) return; //叶子结点
    int ma=0;
    for(int i=0;i<g[u].size();i++)
    {
        if(g[u][i].v==fa||vis[g[u][i].v]) continue;
        getmid(g[u][i].v,u,sz);
        f[u]+=f[g[u][i].v]+1; //更新状态
        ma=max(ma,f[g[u][i].v]); //最大子节点 
    }
    ma=max(ma+1,sz-f[u]-1);
    if(ma<anss) //如果小于当前 
    {
        anss=ma;
        mid=u;
    }
}
void init()
{
	for(int i=1;i<=len;i++)
	{
		ton[use[i]]=0; //清空桶
	}
	len=0;
}
void dfs(int u,int fa,int tot) //找值
{
	fin[++len2]=tot;
	for(int i=0;i<g[u].size();i++)
	{
		if(g[u][i].v==fa||vis[g[u][i].v]) continue;
		dfs(g[u][i].v,u,tot+g[u][i].w);
	}
}
int getsiz(int u,int fa) //因为换根,子树大小要重新计算
{
	int ret=1;
	f[u]=0;
	for(int i=0;i<g[u].size();i++)
	{
		if(g[u][i].v==fa||vis[g[u][i].v]) continue;
		ret+=getsiz(g[u][i].v,u);
	}
	return ret;
}
void work(int u)
{
	for(int i=0;i<g[u].size();i++)
	{
		if(vis[g[u][i].v]) continue;
		len2=0;
		dfs(g[u][i].v,u,g[u][i].w);
		for(int z=1;z<=len2;z++)
		{
			for(int j=1;j<=m;j++)
			{
				if(ques[j]-fin[z]>=0&&ques[j]-fin[z]<=10000000)	ans[j]+=ton[ques[j]-fin[z]]; //有,计算一下
			}
		}
		for(int z=1;z<=len2;z++)
		{
			if(fin[z]>10000000) continue;
			ton[fin[z]]++;
			if(ton[fin[z]]==1) use[++len]=fin[z];
		}
	}
	for(int j=1;j<=m;j++)
	{
		ans[j]+=ton[ques[j]]; //单独的链
	}
}
void dfz(int u)
{
	if(u!=1 && g[u].size()==1) return;
	anss=10000000000;
	mid=0;
	getmid(u,-1,getsiz(u,-1)); //重心
	init();
	u=mid; //换根
	work(u);
	vis[u]=true;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].v;
		if(vis[v]) continue;
		dfz(v);
	}
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1,u,v,w;i<n;i++)
	{
		scanf("%lld%lld%lld",&u,&v,&w);
		g[u].push_back((edge){v,w});
		g[v].push_back((edge){u,w});
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%lld",&ques[i]);
	}
	dfz(1);
	for(int i=1;i<=m;i++)
	{
		cout<<(ans[i]==0?"NAY\n":"AYE\n");
	}
}

标签:10001,int,分治,笔记,学习,ton,include,fin
From: https://www.cnblogs.com/lizhous/p/17372176.html

相关文章

  • 网络流学习笔记
    概念最大流:在一个网络图上,每个边有流量限制,假如起始点有无线流量,求最多能有多少流量流到终点。增广路:一条从起始点到终点了路径,可以流流量。算法Ford-Fulkerson算法解决这个问题,可以用Ford-Fulkerson算法。该算法的核心就是寻找增广路。每找到一条增广路,就给它它能承受......
  • 关于单片机控制电压检测的学习
    1.使用单片机内自带的ADC模块进行检测问题在于频率是否合适:在实验2的基础上得到结论,当两线圈距离在2cm左右时,工作频率将会超过1MHz。采样的最好结果是采集尽可能多的点,这样才能绘制出真正反映实际情况的曲线。目前想要完成的是实验3的demo,采用电阻分压和二极管整流,直接利用......
  • python-Gradio 机器学习演示库
    python-GradioGradio是一个开源的Python库,用于构建机器学习和数据科学演示应用。有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面。Gradio适用于以下情况:为客户/合作者/用户/学生演示你的机器学习模型。通过自动共享链接快速部署你的......
  • 学习使用benchmarksql压测数据库
    介绍benchmarksql是一款符合TPC-C基准压力测试工具,TPC-C是衡量在线事务处理的基准。TPC-C模型是模拟一个商品批发公司的销售模型,这个模型涵盖了一个批发公司面向客户对一系列商品进行销售的过程,这包括管理订单,管理库存,管理账号收支等操作。这些操作涉及到仓库、商品、客户、订单......
  • TypeScript 学习笔记 — 模板字符串和类型体操(十五)
    目录基本介绍字符串类型体操实操环节1.字符串首字母大写CapitalizeString2.获取字符串第一个字符FirstChar3.获取字符串最后一个字符LastChar4.字符串转元组StringToTuple5.元组转字符串TupleToString6.重复字符串RepeatString7.字符串分割SplitString8.获取字符串......
  • react.js学习笔记
    (1)      参考文献1.前端技术手册2.在线编码......
  • 内网工控机通过联网笔记本上网
    1、工控机与笔记本通过网卡连接。2、笔记本win11,工控机ubuntu14.043、笔记本设置共享上网  参考https://zhidao.baidu.com/question/505682783651825564.html,此文。  1)打开控制面板,进入WLAN的属性界面    2)确定后出现一个提示,笔记本的本地连接变成192.168......
  • 最优控制和轨迹规划学习笔记
    最优控制和轨迹规划学习笔记包含多个实际案例倒立摆上翻控制满足车辆运动学约束的路径规划离散点参考线优化lattice横向距离规划YID:5745658004330616......
  • 基于核极限学习机(KELM)分类 -附代码
    基于核极限学习机(KELM)分类文章目录基于核极限学习机(KELM)分类1.极限学习机原理概述2.ELM学习算法3.KELM理论基础4.分类问题5.测试结果6.Matlab代码摘要:本文利用核极限学习机进行优化,并用于分类1.极限学习机原理概述典型的单隐含层前馈神经网络结构如图1所示,由输入层、隐含......
  • 基于麻雀算法优化的核极限学习机(KELM)分类算法 - 附代码
    基于麻雀算法优化的核极限学习机(KELM)分类算法文章目录基于麻雀算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于麻雀搜索算法优化的KELM4.测试结果5.Matlab代码摘要:本文利用麻雀搜索算法对核极限学习机(KELM)进行优化,并用于分类1.KELM理论基础核极限学习......