HDU - 5441 Travel 离线处理+并查集

题意

给我们一个图 给出这个图的n个点 和m个边和权值 然后再分别给我们q个查询 每个查询给一个x
让我们在这个图中找出多少个不同的有序对 使得从x到y的最大权值不超过x
n≤20000,m≤100000,q≤5000. 

分析

20000个点 1000ms 暴力肯定不行
看似这道题像是个图论的题 
嘿嘿嘿 其实。。。
我们看 如何找出符合题目条件所需要的对数呢
我们如果对任意一个查询 我们对一条新的边考虑如果这条新的边其权值满足当前查询 那么就把他算进来 那么我们要继续找边 我们肯定不能找大的边
因为大的边肯定满足不了当前查询 所以我们还是要从小边找起来 
所以我们要对边进行排序
然后对一个查询 我们也最好从小的查询搞起来
因为小查询的结果一定满足大查询的结果
如果不要重复计算 我们就需要从小的查询开始
那么这里就考虑离线处理
一个小的查询的结果是可以转移到大的查询的结果 这样可以更迅速的把q个查询算出来
确定了这两点 我们再看如何把一个查询的值求出来
我们不是要枚举边么 那么如何才能做到有效统计并转移小查询的结果给大查询呢?
假设我们已经找到了好几个符合条件的边
有些边是组成一个联通块 有些边组成不同联通块
对于符合条件的联通块 我们一定要对这个块进行计数 就是从这个块中的数量中选出两个元素来的所有可能
如果来了一条新边 这条边 有两种可能1 这条边属于某个联通块2 此边形成新的联通块
情况1 : 我们就需要把这条边的新点加进去 也就是把当前新点的数量n1 * 原来联通块中的旧点n2 *2 (双向)
情况2 : 那么我们就需要把这个新块 同情况一的算法算一下
累计结果
下一次查询可以重复利用
那么这里我们就可以考虑并查集了
对于一个并查集元素 我们记录这个点的father 和 本块内的数量 
初始化f = 自己 数量 = 1 没得到一个新边我们就查询边的两头的点的父亲是否为同一个 不同就合并 并累计数量
问题就解决了
这道题还是考虑一个如何顺序化考虑解 如何把符合条件的联通块计数问题转化为边的问题 如何把小查询结果转移到大的查询的问题

CODE

#include<bits/stdc++.h>
using namespace std;
struct node{int num,f;
}n[20010];
int N,M,Q,ans[5010];
struct edge{int s,e,w;
}e[100010];
bool cmp(edge a,edge b){return a.w<b.w;//对于edge把权值小的放前面 
}
struct ques{int id,que;bool operator<(const ques &a){return que<a.que;//q值小的排前面 } 
}Qe[5010];
int find(int x){int j=x;while(j!=n[j].f){j = n[j].f;}int i,k=x;while(k!=n[k].f){i = n[k].f;n[k].f=j;k = i;}return j;
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&N,&M,&Q);memset(ans+1,0,sizeof(int)*Q);for(int i=1;i<=N;i++){n[i].num=1;n[i].f=i;       }for(int i=1;i<=M;i++){scanf("%d%d%d",&e[i].s,&e[i].e,&e[i].w);}sort(e+1,e+1+M,cmp);for(int i=1;i<=Q;i++)scanf("%d",&Qe[i].que),Qe[i].id = i;sort(Qe+1,Qe+1+Q);int ce=1;//边记录位置 int cnt=0;for(int i=1; i<=Q ;i++){//枚举q  for(; ce<=M&&e[ce].w<=Qe[i].que ;ce++){// ce<=M leakint f1 = find(e[ce].s);int f2 = find(e[ce].e);if(f1!=f2){n[f2].f=f1;cnt+=n[f1].num*n[f2].num*2;    n[f1].num+=n[f2].num;}} ans[Qe[i].id]+=cnt;         } for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix利用SNMPTrap接收交换机主动告警

zabbix接收trap的工作流程&#xff1a; snmptrapd 收到trapsnmptrapd将trap传递给SNMPTT或调用Perl接收器SNMPTT或Perl trap接收器解析&#xff0c;格式化并将trap写入文件Zabbix SNMP trap读取并解析trap文件对于每个trap&#xff0c;Zabbix发现主机接口与接收的trap地址匹配的…

eclipse安装jsp

1打开window中preferences 2找到server下runningtime 3add 4选择 5加入 6找到 7建立一个新jsp文件

03-java学习-基本数据类型-运算符-键盘接收用户输入

java的八大基本数据类型&#xff1a; 类型转换的基本原则&#xff1a; java整数的默认类型是int&#xff0c;小数的默认类型是double 运算符&#xff1a; 算术运算符、连接、赋值、关系、逻辑、三目运算符等…… 键盘接收用户输入&#xff1a; java.util.Scanner类的了解和使用…

POJ-1651 Multiplication Puzzle 矩阵连乘问题(区间dp)

题意 给我们n个数 让我们随意的跳出其中的数 每挑出一个数 计算代价为左边数* 当前数 * 右边的数 除了首尾两个数不选 中间的数可以任意挑 让我们求最小代价 CODE #include<bits/stdc.h> using namespace std; int a[110],m[110][110]; const int maxn 0x7f7f7f; in…

The Apache Tomcat installation at this directory is version,tomcat

The Apache Tomcat installation at this directory is version,tomcat版本号过高eclipse无法导入解决办法 找到tomcat安装位置进入lib目录 lib目录下有个catalina.jar 用解压缩软件打开 打开后 在catalina.jar\org\apache\catalina\util目…

9.JSP运行原理与JSP页面的基本结构

JSP运行原理与JSP页面的基本结构 HTML页面的基本构成 .代码中出现的几种标签 •单标签 某些标签只需单独使用就能完整地表达意思&#xff0c;控制网页 效果&#xff0c;这类标签的语法是&#xff1a; <标签> 双标签 标签成对使用&#xff0c;由一个开始标签和一个结…

给定两个整数m和n,求出m~n这段连续的整数中所有偶数的平方和以及所有奇数的立方和。

//自己留着复习用 #include<stdio.h> int s(int a) { if (a%20) return aa; else return aa*a;} int main () {int i,m,n,s1,s2; scanf("%d %d",&m,&n);s1s20; for(im;i<n;i) { if(i%20) s1s1s(i); else s2s2s(i);} printf("%d %d",s…

[Leedcode][JAVA][第124题][二叉树中的最大路径和][递归][二叉树]

【问题描述】[困难] 给定一个非空二叉树&#xff0c;返回其最大路径和。本题中&#xff0c;路径被定义为一条从树中任意节点出发&#xff0c;达到任意节点的序列。该路径至少包含一个节点&#xff0c;且不一定经过根节点。示例 1:输入: [1,2,3]1/ \2 3输出: 6 示例 2:输入: …

SAS对数据变量的处理

SAS对数据变量的处理 在使用DATA步基于已经存在的数据集生成新数据集时&#xff0c;可以指定在新数据集中不需要包含的变量而仅读取其他变量&#xff0c;或者指定仅需要在 新数据集中包含的变量。该功能可以通过DATA步中的SET语句和数据集选项KEEP和DROP来实现&#xff0c;也可…

用类来实现输入输出时间,定义多个类对象分别输入输出各对象的时间(时:分:秒),使用函数,数据成员不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数

//个人留着复习用 #include using namespace std; class Time {public: int hour; //类 int minute; int sec; }; int main() {void settime(Time&,int hour0,int minute0,int sec0); //函数声明&#xff0c;制定了默认参数 void showtime(Time&); //函数声明 Tim…

POJ 2533 Longest Ordered Subsequence 动态规划

题意 本题求从1 到 n的最长上升子序列的长度 分析 最优化问题 考虑dp 我们求1-n最长上升子序列长度 假设记录在dp[n]中 假设我们已经知道了1—n-1的以第n-1为最后一个元素的最长上升序列的长度 那么我们拿到第n个元素不就可以判断如果这个n比n-1位置上的元素大 那么就…

那些ubuntu创建用户踩过的坑

在ubuntu中应该用adduser命令创建用户&#xff0c;而不是使用useradd. 各种Linux发行版是有差别的&#xff0c;我也是刚用过才知道的。转载于:https://www.cnblogs.com/April315/p/10496745.html

[剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

【问题描述】[中等] 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-…

C语言-同码小数和

设和式s(d&#xff0c;n)0.d0.dd0.ddd…0.dd…d为n项同码d小数之和&#xff0c;其中第k项小数点后有连续k个数字d&#xff08;d1&#xff0c;2&#xff0c;…&#xff0c;9)。 例如&#xff1a;s&#xff08;7&#xff0c;4&#xff09;0.70.770.7770.7777 还有其他的解法 可…

12.多媒体和超链接标签及其应用实例

多媒体和超链接标签及其应用实例

POJ-3624 Charm Bracelet dp

题意 N个物品每个就一个给出每个物品的价值和花费&#xff0c;表示最终选择一些物品使得花费不超过M&#xff0c;使得价值最大化 分析 最优化问题 考虑dp n个物品选择一些得到最后的最优化问题 我们不妨考虑&#xff0c;假设我们得到了n-1个物品在容量为m情况下最优化值存…

[Leedcode][JAVA][面试题 16.18][模式匹配][字符串][枚举]

【问题描述】[中等] 你有两个字符串&#xff0c;即pattern和value。 pattern字符串由字母"a"和"b"组成&#xff0c;用于描述字符串中的模式。例如&#xff0c;字符串"catcatgocatgo"匹配模式"aabab"&#xff08;其中"cat"是…

C语言实现小数四舍五入

做日记笔记。 转载自https://blog.csdn.net/weixin_38505045/article/details/79994536 排版有更改 C语言中实现四舍五入: (int)(a0.5)即可。 很巧妙的用了取整规则。 也不用导入math.h 同样注意负数的情况。 把 换成 - 即可。 float f ……; int i (int)(f 0.5); i就是f…