【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description
Input
Output
题解:
这首先一看,线性基啊!不过这是树上的,我们可以用树上的数据结构维护线性基。
于是就想到了倍增。
v[i][j] 表示从 i (包括)到其第 2j 个祖先(不包括)的线性基,每次查询往上跳,每次将线性基合并。
线性基的合并直接暴力,因为线性基只有60的长度,暴力合并不会耗太多时间。
剩下的就是裸的线性基了!!
CODE:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std; int n,m,u[],v[],deg[];
double a[][],g[],res; void gauss(){
for(int i=,maxn=i;i<n;maxn=++i){
for(int j=i+;j<=n;j++)
if(fabs(a[j][i])>fabs(a[maxn][i]))maxn=j;
for(int j=;j<=n+;j++)swap(a[i][j],a[maxn][j]);
for(int j=i+;j<=n;j++){
if(fabs(a[j][i])<1e-)continue;
double s=a[j][i]/a[i][i];
for(int k=;k<=n+;k++)a[j][k]-=a[i][k]*s;
}
}
for(int i=n;i>=;i--){
for(int j=i+;j<=n;j++)
a[i][n+]-=a[i][j]*a[j][n+];
a[i][n+]/=a[i][i];
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%d",u+i,v+i);
deg[u[i]]++,deg[v[i]]++;
}
a[][n+]=-,a[n][n]=;
for(int i=;i<=m;i++){
if(u[i]^n)a[u[i]][v[i]]=1.0/deg[v[i]];
if(v[i]^n)a[v[i]][u[i]]=1.0/deg[u[i]];
}
for(int i=;i<n;i++)a[i][i]=-;
gauss();
for(int i=;i<=m;i++)
g[i]=a[u[i]][n+]/deg[u[i]]+a[v[i]][n+]/deg[v[i]];
sort(g+,g+m+);
for(int i=;i<=m;i++)res+=g[i]*(m-i+);
printf("%.3f\n",res);
}
【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)的更多相关文章
- BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)
题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...
- 洛谷P3292 [SCOI2016] 幸运数字 [线性基,倍增]
题目传送门 幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的 ...
- bzoj4568 [Scoi2016]幸运数字 线性基+树链剖分
A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A ...
- BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
4568: [Scoi2016]幸运数字 题意:一颗带点权的树,求树上两点间异或值最大子集的异或值 显然要用线性基 可以用倍增的思想,维护每个点向上\(2^j\)个祖先这些点的线性基,求lca的时候合 ...
- 洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
P3292 [SCOI2016]幸运数字 传送门 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在 ...
- BZOJ 4568 [Scoi2016]幸运数字 ——线性基 倍增
[题目分析] 考虑异或的最大值,维护线性基就可以了. 但是有多次的询问,树剖或者倍增都可以. 想了想树剖动辄数百行的代码. 算了,我还是写倍增吧. 注:被位运算和大于号的优先级坑了一次,QaQ [代码 ...
- P3292 [SCOI2016]幸运数字 [线性基+倍增]
线性基+倍增 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define rep(i, x, y) for ( ...
- P3292 [SCOI2016]幸运数字 线性基
正解:线性基+倍增 解题报告: 先放下传送门QAQ 然后这题,其实没什么太大的技术含量,,,?就几个知识点套在一起,除了代码长以外没任何意义,主要因为想复习下线性基的题目所以还是写下,,, 随便写下思 ...
- [SCOI2016]幸运数字 线性基
题面 题面 题解 题面意思非常明确:求树上一条链的最大异或和. 我们用倍增的思想. 将这条链分成2部分:x ---> lca , lca ---> y 分别求出这2个部分的线性基,然后合并 ...
- BZOJ.4516.[SCOI2016]幸运数字(线性基 点分治)
题目链接 线性基可以\(O(log^2)\)暴力合并.又是树上路径问题,考虑点分治. 对于每个点i求解 LCA(u,v)==i 时的询问(u,v),只需求出这个点到其它点的线性基后,暴力合并. LCA ...
随机推荐
- Asp.net Mvc 表单验证(气泡提示)
将ASP.NET MVC或ASP.NET Core MVC的表单验证改成气泡提示: //新建一个js文件(如:jquery.validate.Bubble.js),在所有要验证的页面引用 (funct ...
- Adding other views to UIButton
Q: I want to add some views to UIButton, for example multiple UILabels, UIImages etc. One I add thos ...
- 面向对象编程OOP-2
用ES6的方法 实现类的继承 //类的定义 class Animal { //ES6中新型构造器 constructor(name,age) { this.name = name; this.age= ...
- c语言产生随机数的方法
在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公 ...
- Spring框架中的aop操作之一 及aspectjweaver.jar与aopalliance-1.0.jar下载地址 包含beans 注解context 和aop的约束
(aspect oriented programming面向切面编程) 首先在原有的jar包: 需Spring压缩包中的四个核心JAR包 beans .context.core 和expression ...
- 【NOIP2017提高A组冲刺11.8】购物
这个范围对DP不友好,和CF的一道C题非常像,贪心+后悔. 先使用k个优惠券购买k个q最小的(钱不购买则退出),同时把这k个p[i]-q[i]放入小根堆,然后将剩下的n-k个按p升序排序,记小根堆堆顶 ...
- java代码生成二维码
java代码生成二维码一般步骤 常用的是Google的Zxing来生成二维码,生成的一般步骤如下: 一.下载zxing-core的jar包: 二.需要创建一个MatrixToImageWriter类, ...
- u-boot顶层目录config.mk分析
1. 设置obj与src ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir := else dir := $(subst $( ...
- python图像插值
最近邻:选择离它所映射到的位置最近的输入像素的灰度值为插值结果. 最临近插值 图像的缩放很好理解,就是图像的放大和缩小.传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画.当然,在 ...
- Uiautomator简介及其环境搭建、测试执行
UiAutomator框架使用指南 UiAutomator是Google开发的自动化测试工具,通过UI创建自动化测试代码,来测试界面(UI)的有效功能,可以针对应用程序运行在一个或更多的设备上.我们并 ...