题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3038/

参考博客:

https://blog.csdn.net/weixin_44580710/article/details/86668200?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

这是一道带权并查集的题目,设置了根节点到子节点之间的距离,可以利用向量性质更新每段上的值,假定结点编号为a的结点的值S[a]在结点之后的连线上,所以查询[l,r]的时候实际上是看[l,r+1]段,如果定义结点之前的连线上是该结点的值,则查询的区间实际上是[l-1,r]。利用向量性质实际上更新fx->fy=fx->x + x->y - fy->y ,对于一个节点i,S[i]就表示根节点到这个点的区间和。

代码如下:

 #include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define mp(a,b) make_pair((a),(b))
#define P pair<int,int>
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=1e6+;
int n,m,t;
inline int read(){
int ans=,w=;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-;ch=getchar();}
while(isdigit(ch))ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return ans*w;
}
int ans;
int f[maxn],s[maxn];
void init()
{
f(i,,n)
{
f[i]=i;
s[i]=;
}
ans=;
}
int find(int x)
{
if(x==f[x])return x;//到达根结点的时候不需要有任何操作,只需要返回根就行
int tmp=f[x];//暂存f当前的根,因为在路径压缩之后当前的根节点会发生变化
f[x]=find(f[x]);
s[x]+=s[tmp];//将根节点的值加到当前结点上,相当于前缀和
return f[x];
}
void Union(int x,int y,int num)
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
if(s[y]-s[x]!=num)ans++;//x->y=rooty->y - rootx->x
}
else
{
f[fy]=fx;//保持根节点的值比较小
//fx根节点指向了新的结点,所以他的值需要改变,而原来以fx为根的结点的f值还未变化,所以s值不变
s[fy]=s[x]+num-s[y];//s[t]代表的是root->t的和
//故有rootx->rooty=rootx->x+x->y-rooty->y=s[x]+num-s[y]
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
int u,v,w;
f(i,,m)
{
u=read(),v=read(),w=read();
Union(u-,v,w);//如果f是从0开始的话Union(u,v+1,w)也可用
}
// f(i,1,n)cout<<i<<":"<<f[i]<<":"<<s[i]<<endl;
pf("%d\n",ans);
}
}

最新文章

  1. (转)配置Log4j(很详细)
  2. ExtJs4 笔记(14) layout 布局
  3. vsphere平台为win系统动态扩展磁盘
  4. PHP与Java进行通信
  5. 转:打造DropDownList,TreeView,ListBox无限极分类目录树
  6. Jersey(1.19.1) - Client API, Using filters
  7. django 学习-6 定义模型--数据库的使用
  8. vue-cli3安装过程
  9. python高级(4)—— 虚拟环境安装使用
  10. 无法运行 vue-manage-system@3.1.0 dev: `webpack-dev-server --inline --progress --
  11. web性能测试
  12. 16.The Effect of Advertisement 广告的影响
  13. 数据库日志redo和undo
  14. python设计模式之猴子补丁模式
  15. Java学习笔记之——冒泡排序
  16. 使用SpringSecurity保护方法应用
  17. IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体
  18. 获取MyBatis
  19. HDU 3271 数位dp+二分
  20. 【Alpha】阶段第三次Scrum Meeting

热门文章

  1. VMware虚拟机克隆CentOS6.5后修改网卡
  2. 猫头鹰的深夜翻译:核心JAVA并发一
  3. Ubuntu 16.04 PXE+kickstart部署系统
  4. ASP制作建议留言板
  5. java ThreadPoolExecutor初探
  6. Docker实战之Consul集群
  7. Ubuntu gnome 美化与个别组件安装
  8. 数据挖掘入门系列教程(二)之分类问题OneR算法
  9. 线程(Thread)的四种停止方式
  10. vue项目基本步骤