hdu 3038 How Many Answers Are Wrong (带权并查集入门)

本文介绍了一种利用带权并查集解决区间求和问题的方法。通过详细解析题意和算法实现步骤,帮助读者理解如何判断一组区间数据是否符合逻辑,并通过样例解释了算法的工作原理。

http://acm.hdu.edu.cn/showproblem.php?pid=3038

How Many Answers Are Wrong

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7930    Accepted Submission(s): 2898


Problem Description
TT and FF are ... friends. Uh... very very good friends -________-b

FF is a bad boy, he is always wooing TT to play the following game with him. This is a very humdrum game. To begin with, TT should write down a sequence of integers-_-!!(bored).

Then, FF can choose a continuous subsequence from it(for example the subsequence from the third to the fifth integer inclusively). After that, FF will ask TT what the sum of the subsequence he chose is. The next, TT will answer FF's question. Then, FF can redo this process. In the end, FF must work out the entire sequence of integers.

Boring~~Boring~~a very very boring game!!! TT doesn't want to play with FF at all. To punish FF, she often tells FF the wrong answers on purpose.

The bad boy is not a fool man. FF detects some answers are incompatible. Of course, these contradictions make it difficult to calculate the sequence.

However, TT is a nice and lovely girl. She doesn't have the heart to be hard on FF. To save time, she guarantees that the answers are all right if there is no logical mistakes indeed.

What's more, if FF finds an answer to be wrong, he will ignore it when judging next answers.

But there will be so many questions that poor FF can't make sure whether the current answer is right or wrong in a moment. So he decides to write a program to help him with this matter. The program will receive a series of questions from FF together with the answers FF has received from TT. The aim of this program is to find how many answers are wrong. Only by ignoring the wrong answers can FF work out the entire sequence of integers. Poor FF has no time to do this job. And now he is asking for your help~(Why asking trouble for himself~~Bad boy)
 

Input
Line 1: Two integers, N and M (1 <= N <= 200000, 1 <= M <= 40000). Means TT wrote N integers and FF asked her M questions.

Line 2..M+1: Line i+1 contains three integer: Ai, Bi and Si. Means TT answered FF that the sum from Ai to Bi is Si. It's guaranteed that 0 < Ai <= Bi <= N.

You can assume that any sum of subsequence is fit in 32-bit integer.
 

Output
A single line with a integer denotes how many answers are wrong.
 

Sample Input
10 5 1 10 100 7 10 28 1 3 32 4 6 41 6 6 1
 

Sample Output
1
 

带权并查集,第一次接触,算上读题,用了半天的时间才A掉,而且是在参照多个题解的情况下........

题意:给你一个区间和区间每个元素之和,问有多少组数据是不符逻辑的

题解:细节太多了,光靠题解往回推做法都推了半天,正着想的人脑子不知什么做的.......

要点

①:任何区间只要不是完全重合就符合逻辑,就算是,若他们的值是一样的也符合逻辑

eg: 样例里 区间[1, 10] 和 [1, 3] [4, 6] [7, 10]三个区间和完全重合了,并且值不一样,所以肯定不符逻辑

那么有多少组不符逻辑呢?就是:哪组数据的加入使现有的组合不合逻辑,就有几组

如样例中最后[1, 10]的加入使[1, 3] [4, 6] [7, 10]这个组合不合逻辑,所以只有一组

这里刚开始会思考如果我们的组合一开始是[1, 10],后来加入[1, 3] [4, 6] [7, 10],会不会是3组不合逻辑呢

答案是不会,因为[1, 10]与[1, 3] [4, 6]在一起也符合逻辑,即还没完全重合之前怎么变次序都符合逻辑

这样会让最终答案并不受次序的更变而变化

②:由①可以启发到(反正我就启发不到......)把区间集合起来,不能加入的区间就是不符逻辑的,从而可以想到并查集

怎么并??这是最最难的......首先,我们要搞个带权的并查集,这个权是什么呢?在这里是距离,到老大的距离,

用dis[]存放,则每个点i都有一个到老大的距离dis[i], 那么这玩意怎么更新呢?这和这个并查集的设计有关,

要灵活变通

③:关键一点,怎么并?怎么设计并的内容与方法(这里也要灵活变通,不能瞎抄)?我的想法是让区间的起点做大佬,

数值小的做大佬(大的也可以),然后获取每段区间时,先检查一下他们的大佬,如果他们的大佬相同,则这段区间

已经在记录中,这时要检查一下这区级的两端点到大佬的距离(这就是为什么小的做大佬的原因,方便距离的比较

因为大佬肯定比这两个点小,所以这两个点的相对距离很好确认,只要dis相减即可,如果不强行设计为小的做大佬,

而是任意点都可以,就会产生距离的计算复杂的问题,试想这两个点一个可能在大佬的左边,一个在右边或者两个

都比大佬小等等)。如果这两个点的大佬不等,不在同一个集合中,那么就并吧,怎么并?这里要分一个类,两个

端点的大佬究竟谁大一点?根据我们并的原则,小的优先,把小的做大的大佬,然后只要更改被合并的大佬到新大佬

的距离即可,这个距离在两种情况下是不同的,具体可以画连个集合,手动连线并起来看看(这里WA了好多次)

如集合:        x                           y
                      ②                          ⑤
                   ↓    ↓                    ↓    ↓  
                 ④     ⑥  --------   ⑧     ⑨
                          u                   v
dis[y] = w - dis[v] + dis[u];

这里还要讨论y与u哪个大的情况,但是会发现无论y和u哪个大,式子都一样


          x                           y
        ③                          ②
      ↓    ↓                      ↓    ↓  
    ④     ⑥  --------    ⑧     ⑨
            u                   v

然这是第二种情况:dis[x] = dis[v] - w - dis[u]; 

④:最后,还要个问题,就是为什么查并集压缩路径中可以直接:dis[x] += dis[fa[x]];

原因在于每次的更新都把所有的子节点直接指向父亲了,下一次再查的时候由于父亲到自己的距离为0,

所以可以放心地加上0来保持不变,而当父亲更新时(即父亲找到老爷子),直接加上父亲到老爷子的距离即可更新

为自己到老爷子的距离

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define ll long long

const int maxn = 200000 + 10;

int fa[maxn];
int dis[maxn];      //to root

int findx(int x)
{
     if (fa[x] == -1)
          return x;
     int tmp = findx(fa[x]);		//不能直接写成:   fa[x] = findx(fa[x]); dis[x] += dis[fa[x]];
     dis[x] += dis[fa[x]];		//这样就改了原来父节点,不能获得原来正确的值
     return fa[x] = tmp;
}

void init()
{
     memset(dis, 0, sizeof(dis));
     memset(fa, -1, sizeof(fa));
     return;
}

int uni(int u, int v, int x, int y, int w)
{
     if (x < y)					//画图看合并的情况
     {
          fa[y] = x;
          dis[y] = w - dis[v] + dis[u];
     }
     else
     {
          fa[x] = y;
          dis[x] = dis[v] - w - dis[u];
     }
     return 0;
}

int main()
{
     int n, m;
     while (~scanf("%d%d", &n, &m))
     {
          init();
          int i, j;
          int x, y;
          int u, v, w;
          int ans = 0;
          for (i = 0; i < m; i++)
          {
               scanf("%d%d%d", &u, &v, &w);
               u--;
               x = findx(u);
               y = findx(v);
               if (x == y && dis[v] - dis[u] != w)
                    ans++;
               else if (x != y)
                    uni(u, v, x, y, w);
          }
          printf("%d\n", ans);
     }
     return 0;
}


多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)内容概要:本文介绍了基于Matlab实现的多源动态最优潮流的分布鲁棒优化方法,适用于IEEE118节点电力系统。该方法旨在应对电力系统中源荷不确定性带来的挑战,通过构建分布鲁棒优化模型,有效处理多源输入下的动态最优潮流问题,提升系统运行的安全性和经济性。文中详细阐述了模型的数学 formulation、求解算法及仿真验证过程,并提供了完整的Matlab代码实现,便于读者复现与应用。该研究属于电力系统优化调度领域的高水平技术复现,具有较强的工程实用价值。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事电力系统优化调度的工程技术人员,尤其适合致力于智能电网、鲁棒优化、能源调度等领域研究的专业人士。; 使用场景及目标:①用于电力系统多源环境下动态最优潮流的建模与求解;②支撑含可再生能源接入的电网调度决策;③作为鲁棒优化方法在实际电力系统中应用的教学与科研案例;④为IEEE118节点系统的仿真研究提供可复现的技术支持。; 阅读建议:建议结合提供的Matlab代码逐模块分析,重点关注不确定变量的分布鲁棒建模、目标函数构造及求解器调用方式。读者应具备一定的凸优化和电力系统分析基础,推荐配合YALMIP工具包与主流求解器(如CPLEX、Gurobi)进行调试与扩展实验。
内容概要:本文系统介绍了物联网与云计算的基本概念、发展历程、技术架构、应用场景及产业生态。文章阐述了物联网作为未来互联网的重要组成部分,通过RFID、传感器网络、M2M通信等技术实现物理世界与虚拟世界的深度融合,并展示了其在智能交通、医疗保健、能源管理、环境监测等多个领域的实际应用案例。同时,文章强调云计算作为物联网的支撑平台,能够有效应对海量数据处理、资源弹性调度和绿色节能等挑战,推动物联网规模化发展。文中还详细分析了物联网的体系结构、标准化进展(如IEEE 1888、ITU-T、ISO/IEC等)、关键技术(中间件、QoS、路由协议)以及中国运营商在M2M业务中的实践。; 适合人群:从事物联网、云计算、通信网络及相关信息技术领域的研究人员、工程师、高校师生以及政策制定者。; 使用场景及目标:①了解物联网与云计算的技术融合路径及其在各行业的落地模式;②掌握物联网体系结构、标准协议与关键技术实现;③为智慧城市、工业互联网、智能物流等应用提供技术参考与方案设计依据;④指导企业和政府在物联网战略布局中的技术选型与生态构建。; 阅读建议:本文内容详实、覆盖面广,建议结合具体应用场景深入研读,关注技术标准与产业协同发展趋势,同时结合云计算平台实践,理解其对物联网数据处理与服务能力的支撑作用。
标题基于Java的停车场管理系统设计与实现研究AI更换标题第1章引言介绍停车场管理系统研究背景、意义,分析国内外现状,阐述论文方法与创新点。1.1研究背景与意义分析传统停车场管理问题,说明基于Java系统开发的重要性。1.2国内外研究现状综述国内外停车场管理系统的发展现状及技术特点。1.3研究方法以及创新点介绍本文采用的研究方法以及系统开发中的创新点。第2章相关理论总结Java技术及停车场管理相关理论,为系统开发奠定基础。2.1Java编程语言特性阐述Java的面向对象、跨平台等特性及其在系统开发中的应用。2.2数据库管理理论介绍数据库设计原则、SQL语言及在系统中的数据存储与管理。2.3软件工程理论说明软件开发生命周期、设计模式在系统开发中的运用。第3章基于Java的停车场管理系统设计详细介绍系统的整体架构、功能模块及数据库设计方案。3.1系统架构设计阐述系统的层次结构、模块划分及模块间交互方式。3.2功能模块设计介绍车辆进出管理、车位管理、计费管理等核心功能模块设计。3.3数据库设计给出数据库表结构、字段设计及数据关系图。第4章系统实现与测试系统实现过程,包括开发环境、关键代码及测试方法。4.1开发环境与工具介绍系统开发所使用的Java开发环境、数据库管理系统等工具。4.2关键代码实现展示系统核心功能的部分关键代码及实现逻辑。4.3系统测试方法与结果阐述系统测试方法,包括单元测试、集成测试等,并展示测试结果。第5章研究结果与分析呈现系统运行效果,分析系统性能、稳定性及用户满意度。5.1系统运行效果展示通过截图或视频展示系统实际操作流程及界面效果。5.2系统性能分析从响应时间、吞吐量等指标分析系统性能。5.3用户满意度调查通过问卷调查等方式收集用户反馈,分析用户满意度。第6章结论与展望总结研究成果,提出系统改进方向及未来发展趋势。6.1研究结论概括基于Java的停车场管理
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值