博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ HNOI 2005 ] 狡猾的商人
阅读量:6149 次
发布时间:2019-06-21

本文共 1268 字,大约阅读时间需要 4 分钟。

\(\\\)


对于一个长度为\(N\)的数列,以\(L_i,R_i,Sum_i\)的形式给出\(M\)个区间和,判断是否存在一个能够满足所有区间和的合法数列,多组数据。

  • \(N\in [0,100]\)\(M\in [0,1000]\),数据组数\(\le 100\)

\(\\\)

\(Solution\)


  • 带偏移量的并查集,将区间和转为前缀和相减,到根节点距离即为两前缀和之差。
  • 对于不属于一个连通块的\(L_i,R_i\),合并父节点\(F_l,F_r\)时,\(F_l\)\(F_r\)的距离为\(V_{R_i}-(V_{L_i}-Sum)\)

  • 对于属于一个连通块的\(L_i,R_i\)\(find\)的过程中已经更新了到根节点的距离,所以相减即可验证答案,注意向右合并和向左合并相减的关系可能会相反,可以手画理解一下。

\(\\\)

\(Code\)


#include
#include
#include
#include
#include
#include
#include
#define N 110#define R register#define gc getcharusing namespace std; int f[N],v[N];inline void reset(int n){ for(R int i=0;i<=n;++i) f[i]=i,v[i]=0;}int find(int x){ if(x==f[x]) return x; int fa=find(f[x]); v[x]+=v[f[x]]; return f[x]=fa;} inline int rd(){ int x=0; bool f=0; char c=gc(); while(!isdigit(c)){if(c=='-')f=1;c=gc();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();} return f?-x:x;} int main(){ int t=rd(),n,m; while(t--){ n=rd(); m=rd(); reset(n); bool fl=0; for(R int i=1,x,y,w;i<=m;++i){ x=rd()-1; y=rd(); w=rd(); int fx=find(x),fy=find(y); if(fx!=fy){f[fx]=fy;v[fx]=v[y]-v[x]+w;} else if(v[x]-v[y]!=w) fl=1; } puts(fl?"false":"true"); } return 0;}

转载于:https://www.cnblogs.com/SGCollin/p/9610174.html

你可能感兴趣的文章
final关键字的特点
查看>>
linux常用命令,教仔细的讲解
查看>>
kvm虚拟化在linux下的实现步骤描述
查看>>
JavaScript 编程精解 中文第三版 翻译完成
查看>>
2014-03-02_javascript_model
查看>>
Nginx+Tomcat+Memcached部署应用
查看>>
wireshark抓取远程主机流量
查看>>
Hao123的成功
查看>>
微软Visual Studio "14" CTP 2 发布
查看>>
Spring Portlet中的webflow
查看>>
JPDA 架构研究16 - Agent利用环境指针访问VM(方法访问篇)
查看>>
To connect to XXX, use ‘--no-check-certificate’.
查看>>
jquery 3种初始化方法
查看>>
MySQL闪回原理与实战
查看>>
Android activity 与 service 通信的一种方式
查看>>
redux react 使用
查看>>
MAVEN配置发源码包
查看>>
nfs 挂载
查看>>
UserLock教程:限制用户仅从特定的机器进行连接
查看>>
Java 中 HashMap 的工作原理
查看>>