lly的数列询问(最小生成树 + 思维)
Description
这个问题很简单,lly lly lly给你一些提示,让你试着确定长度为n n n的数列A [1] A [2] ... A [n]的值,但是他想尽一切办法为大家降低难度:
因此lly lly lly会给定一些对你有用的m m m询问,每次询问lly lly lly会表明L,R,sum[L,R] L,R,sum [L,R] L,R,sum[L,R]:表示区间[L,R]的区间和(保证询问合法),让大家更好的解决这个问题,但是对于每个询问会有一个代价,代价就是(R−L)∗sum[L,R](R-L)* sum [L,R] (R−L)∗sum[L,R]。
那么问题就转化了,如何花费尽可能小的代价确定这个数列。
Input
输入第一行包括两个整数n,m(1≤n≤2∗105,0≤m≤5∗105)n,m(1 \leq n \leq 2*10^5,0 \leq m \leq 5*10^5)n,m(1≤n≤2∗105,0≤m≤5∗105)。
接下来有mmm行,每行包括三个整数,L,R,sum[L,R],(1≤L≤R≤n,sum[L,R]≤109)L,R,sum[L,R],(1 \leq L \leq R \leq n,sum[L,R] \leq 10^9)L,R,sum[L,R],(1≤L≤R≤n,sum[L,R]≤109)。
Output
输出包含一个整数,即最小花费,如果无论如何都无法确定这个数列就输出“lly tcl!”。
Source
nuoyanli
思路
题意:给我们一个长度为 n 的序列,但是我们不知道的它的元素是什么,之后给我们m个是提示,每次提示 给我一个们一个[L, R]区间 的元素和sum[L~R],每次提示有一个 最小的花费 (R−L)∗sum[L..R](R-L)*sum[L ..R](R−L)∗sum[L..R],问我们找出序列的n个元素是啥,需要的总共的最小花费是多少?
分析:这题真实令人脑洞大开,对于这种区间元素是啥的题竟然可以转化成求
最小生成树
的问题(可惜本巨弱竟毫无察觉 ),对于这一题要求出序列的n个元素是啥?就等价于求出每个位置的前缀和 sum[ i ] ,我们已知 sum[0] = 0, 如果对于序列中的1~n点都 0 点联通(应用最小生成树的地方
)的话,那么我们就能够求出所有的 sum[i],有了所有的sum[ i ] 之后我们通过相邻位置的前缀和相减就能够得到 n 个元素了,对于题目上的m次提示的条件我们就可以转化成 sum[R] - sum[L - 1], 以 L-1点 与R点之间建立一条 权值为 (R-L)* sum[L~R] 的边,这样根据m个条件建完图之后,用 Kruskal 或者 Prim 来跑一边最小生成树(在这个是时候我们要判断这个图能否全部连通),的出来的答案就是 总花费最后举个例子来证明可行,例如 1-3 的区间和为sum[3] - sum[0], 4 - 6的区间和为sum[6] - sum[4], 我们可以看到 如果 0与6联通 那么区间和 sum[ 6 ] - sum[0] == sum[6] - 0, 而在我们将 1-3、4-6区间,对应的 0 - 3 - 6 (
这样我们就使 0 与 6间接联通了
)联通的时候,那么这条边的边权和是 (sum[6] - sum[3]) + ( sum[3] - sum[0]) = sum[6] + sum[0], 这样我们就可以得到了 sum[6] 的值了。。。。。。。。。。。。。。。。。
题解
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int Len = 5e5 + 10;
int n,m;
struct Edge
{
ll u,v,w;
bool operator < (const Edge a) const { return w < a. w; }
} edge[Len];
int pre[Len];
ll find(ll x) { return x == pre[x] ? x : pre[x] = find(pre[x]); }
void init()
{
for(int i = 0; i <= n; i ++)
pre[i] = i;
}
int main()
{
/* freopen("A.txt","r",stdin); */
scanf("%d %d", &n, &m);
init();
ll l, r, sum;
for(int i = 0; i < m; i ++)
{
scanf("%lld %lld %lld", &l, &r, &sum);
edge[i] = (Edge){ l-1, r, (r - l)*sum };
}
sort(edge, edge + m);
int cnt = 0;
ll u, v, w, Sp = 0;
for(int i = 0; i < m; i ++)
{
u = edge[i].u, v = edge[i].v, w = edge[i].w;
int fu = find(u);
int fv = find(v);
if(fu != fv)
pre[fu] = fv, cnt ++, Sp += w;
}
if(cnt < n) printf("lly tcl!\n");
else printf("%lld\n", Sp);
return 0;
}
lly的数列询问(最小生成树 + 思维)的更多相关文章
- 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)
I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...
- 【2013 ICPC亚洲区域赛成都站 F】Fibonacci Tree(最小生成树+思维)
Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do s ...
- hdu4126Genghis Khan the Conqueror (最小生成树+树形dp)
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) Total Submiss ...
- 【Uvalive 5834】 Genghis Khan the Conqueror (生成树,最优替代边)
[题意] 一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少.最后求Q ...
- UOJ14 DZY Loves Graph 并查集
传送门 题意:给出一张$N$个点,最开始没有边的图,$M$次操作,操作为加入边(边权为当前的操作编号).删除前$K$大边.撤销前一次操作,每一次操作后询问最小生成树边权和.$N \leq 3 \tim ...
- zhengrui集训笔记2
Day_6 计算几何 点积\Large 点积点积 叉积\Large 叉积叉积 极角\Large 极角极角 < π\piπ :叉积判断 else :atan2 旋转\Large 旋转旋转 左乘第一 ...
- Educatinal CF #122(Div. 2) E . Spanning Tree Queries
这一场其实有重大的意义,因为是除夕跨年,不过我FST掉大分了(ks) 题意:给你一个n点,m条边的带权图,q次询问,每次给你\(x\),每个边权为\(abs(E[i].w-x)\)答案为所有询问最小生 ...
- 【做题】CF177G2. Fibonacci Strings——思维+数列
题意:定义斐波那契字符串为: $f_1 = $ "a" \(f_2 =\) "b" \(f_n = f_{n-1} + f_{n-2}, \, n > 2 ...
- #6278. 数列分块入门 2(询问区间内小于某个值 xx 的元素个数)
题目链接:https://loj.ac/problem/6278 题目大意:中文题目 具体思路:数列分块模板题,对于更新的时候,我们通过一个辅助数组来进行,对于原始的数组,我们只是用来加减,然后这个辅 ...
随机推荐
- Go module学习笔记
一 go module 常用命令 模块维护:go mod command arguments创建模块:go mod init example.com/hello清除无用依赖: go mod tidy ...
- springboot 整合logback
日志包使用的是springboot内置的日志包,所以我们不许要再专门导入日志包 1.logback-spring.xml配置 <?xml version="1.0" enco ...
- Vue项目一、node.js和npm的安装和环境搭建
一.为什么安装node.js及npm npm npm是Node.js的包管理工具(package manager),是全球最大的生态系统,同过npm可以找到很多丰富的插件来满足项目的需求. a1.现在 ...
- 用vue-cli进行npm run dev时候Cannot GET/
在用vue cli进行项目npm run dev 时候,页面Cannot GET/ 主要是把config/index.js里面的dev:{assetsPublicPath:'/'}改成了跟build里 ...
- ALSA 声卡 驱动 linux 4.1.36 中变化
linux 4.1.36 中变化 1ret = request_irq(IRQ_DMA2, s3c2440_dma2_irq, IRQF_DISABLED, "myalsa for play ...
- php 防注入
a. 打开magic_quotes_gpc或使用addslashes()函数 当php.ini里的 magic_quotes_gpc 为On 时. 提交的变量中所有的 ' (单引号), " ...
- CSS 权重图
关系图 图片出处我找不到了. 结论 权重从高到低排序 1. !important 2. style 3. #id 4. .class .child-class 5. .class1.class2 6. ...
- .NET实现一个简单的IOC容器
目录 1.主要细节 2.具体示例 参考及示例代码下载 shanzm-2020年3月17日 20:06:01 1.主要细节 使用反射程序集的方式获取对象的类型 通过反射的方式获取指定类型的的所有公共属性 ...
- (转)GNU风格ARM汇编语法指南(非常详细)2
原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111481828392/ 2.GNU汇编程序中的标号symbol(或label) ...
- JS实现滚动区域触底事件
效果 贴上效果展示: 实现思路 样式方面不多赘述,滚动区域是给固定高度,设置 overflow-y: auto 来实现. 接下来看看js方面的实现,其实也很简单,触发的条件是: 可视高度 + 滚动距离 ...