【4连WA】【Usaco Oct08 Gold】奶牛串门(Pasture Walking)

[USACO20FEB]Swapity Swapity Swap 这道题刚入手,我的第一反应就是:暴力模拟! 没啥好说的,直接reverse kkk 遍,时间复杂度 O⁡(nmk)\operatorname{O}(nmk)O(nmk) ,还似乎吃得消。 结果我看了看数据范围,就吓得一身冷汗。。。 k≤109,n≤105,m≤102k\le 10^9,n\le10^5,m\leq10^2k≤109,n≤105,m≤102 这模拟只能骗到 202020 分(以内)啊? 我于是开始找规律,结果啥规律也找不出,对于每个数据,都有不同的规律,循环节也不好计算。 那——要不使用判断循 阅读详情

【Usaco Oct08 Gold】奶牛串门(Pasture Walking)

Time Limit:30000MS  Memory Limit:65536K
Total Submit:75 Accepted:50 
Case Time Limit:3000MS

Description

有N (2 <= N <= 1,000)头奶牛,分别编号为1到N。还有N颗牧草分别编号为1到N。简单起见,第i头奶牛都盯着第i颗牧草。 

有几对牧草分别用一些小路连接了起来,总共有N-1条双向的小路,小路i连接了Ai及Bi颗牧草(1 <= Ai <= N; 1 <= Bi <= N),小路的长度为Li (1 <= Li <= 10,000)保证任意两颗牧草总能通过小路走到,也就是说这些小路构成了一棵树。 

奶牛是群居性的动物,很喜欢串门。奶牛们会问你Q次问题(1 <= Q <= 1,000),每次询问的内容很简单,就是从p1颗牧草到p2颗牧草最短的距离是多少。(1 <= p1 <= N; 1 <=p2 <= N)

Input

第一行,两个用空格分隔的整数:N和Q 
第二行到第N行,第i+1行包含三个用空格分隔的整数Ai,Bi,Li 
第N+1行到第N+Q行,每行包含两个用空格分隔的整数p1,p2

Output

共Q行,每行包含每次询问的最短距离的值。

Sample Input

4 2
2 1 2
4 3 2
1 4 3
1 2
3 2

Sample Output

2
7

Hint

样例解释: 
询问1:1->2 总代价为2 
询问2:3->4->1->2 总代价为7

Source

Usaco October 2008 Gold


这本来算是一道裸题的,但是由于我对倍增算法不熟悉,犯了以下一个傻逼的错误,导致了惨痛的4连WA:

len[x][i]记录的是x节点向上走(1<<i)步的权值,而我犯错误的是,我把向上走(1<<i)写成了len[x][fa[x][i]],只有呵呵了。

然后读了416162623 的代码我才知道自己错在哪,呃,还有就是相邻的点的权值不一定要用n2的复杂度来记录,416162623是存在边里边的,空间小速度快,我这个就相形见绌了。


416162623的代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,q;
int cnt=0;
int f[1005][50];
int M[1005][50];
int depth[10005];
bool mark[10005];
int last[10005],next[10005],end[10005],len[10005];
void dfs(int x)
{
    mark[x]=true;
	int a,b,c,d,e;
	depth[x]=depth[f[x][0]]+1;
	a=ceil(log(depth[x])/log(2));
	for(b=1;b<=a;b++)
	{
	f[x][b]=f[f[x][b-1]][b-1];
	M[x][b]=M[x][b-1]+M[f[x][b-1]][b-1];
    }
    b=last[x];
	while(b!=0)
	{
		if(mark[end[b]]==false)
		{
		f[end[b]][0]=x;
		M[end[b]][0]=len[b];
		dfs(end[b]);
	    }
		b=next[b];
	}
}
int LCA(int x,int y)
{
	
	int a,b,c,d,e;
	int ans=0;
	if(depth[x]>depth[y]){a=x;x=y;y=a;}
	e=ceil(log(n)/log(2));
	int k=depth[y]-depth[x];
	for(a=0;a<=e;a++)
	if(k&(1<<a))
	{
		ans+=M[y][a];
        y=f[y][a];
    }
	if(x==y)return ans;
	e=ceil(log(depth[x])/log(2));
	for(a=e;a>=0;a--)
	if(f[x][a]!=f[y][a])
	{
	ans+=M[x][a];
	x=f[x][a];
	ans+=M[y][a];
	y=f[y][a];
    }
    ans+=M[x][0];
    ans+=M[y][0];
    return ans;
}
int main()
{
	int a,b,c,d,e;
	scanf("%d%d",&n,&q);
	for(a=1;a<=n-1;a++)
	{
		scanf("%d%d%d",&b,&c,&d);
		cnt++;
		end[cnt]=c;
		len[cnt]=d;
		next[cnt]=last[b];
		last[b]=cnt;
		cnt++;
		end[cnt]=b;
		len[cnt]=d;
		next[cnt]=last[c];
		last[c]=cnt;
	}
	dfs(1);
	for(a=1;a<=q;a++)
	{
		scanf("%d%d",&b,&c);
		printf("%d\n",LCA(b,c));
	}
	return 0;
}


我的大空间复杂度代码

#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define maxn 1009
int dep[maxn], fa[maxn][13], len[maxn][13], zlen[maxn][maxn];
bool wasfa[maxn];
vector<int>edge[maxn];
int BigS;
void dfs(int cur)
{
	int k, i, son;
	dep[cur]=dep[fa[cur][0]]+1;
	k=ceil(log(dep[cur])/log(2));
	for(i=1; i<=k; i++)
	{
		fa[cur][i]=fa[fa[cur][i-1]][i-1];
		len[cur][i]=len[cur][i-1]+len[fa[cur][i-1]][i-1];
		//原来错写成len[cur][i]=len[cur][fa[cur][i-1]]+...概念理解错误 
	}
	wasfa[cur]=1;
	vector<int>::iterator it;
	for(it=edge[cur].begin(); it!=edge[cur].end(); it++)
	{
		son=(*it);
		if(wasfa[son]==0)
		{
			fa[son][0]=cur;
			len[son][0]=zlen[son][cur];
			dfs(son);
		}
	}
}
int lca(int x, int y)
{
	int i, k, s, ans=0;
	if(dep[x]<dep[y])	swap(x, y);
	k=dep[x]-dep[y];
	for(i=0; i<=BigS; i++)
	{
		if(k&(1<<i))
		{
			ans+=len[x][i];
			x=fa[x][i];
		}
	}
	if(x==y)	return ans;
	
	s=ceil(log(dep[x])/log(2));
	for(i=s; i>=0; i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			ans+=len[x][i];
			x=fa[x][i];
			ans+=len[y][i];
			y=fa[y][i];
		}
	}
	return ans+len[x][0]+len[y][0];
}
int main()
{
	int n, q, i, a, b, l, p1, p2;
	scanf("%d%d", &n, &q);
	BigS=ceil(log(n)/log(2));
	for(i=1; i<n; i++)
	{
		scanf("%d%d%d", &a, &b, &l);
		zlen[a][b]=l;
		zlen[b][a]=l;
		edge[a].push_back(b);
		edge[b].push_back(a);
	}
	dfs(1);
	for(i=1; i<=q; i++)
	{
		scanf("%d%d", &p1, &p2);
		printf("%d\n", lca(p1, p2));
	}
	return 0;
}


【bzoj1600】【USACO2008 Oct】Building A Fence 建造栅栏 Description勤奋的Farmer John想要建造一个四面的栅栏来关住牛们。他有一块长为n(4<=n<=2500)的木板,他想把这块本板切成4块。这四块小木板可以是任何一个长度只要Farmer John能够把它们围成一个合理的四边形。他能够切出多少种不同的合理方案。注意: 只要大木板的切割点不同就当成是不同的方案(像全排列那样),不要担心另外的特殊情况,go ahead。 栅栏的面积要大于0 阅读详情

相关推荐

CIMPro孪大师,支持 3DGS 高斯泼溅的一站式零代码数字孪生平台

高斯泼溅导入数字孪生开发引擎

2501_90821319的博客 1110

每日一题 P3128 [USACO15DEC]Max Flow P LCA倍增 lazy离线处理做法

每日一题 P3128 [USACO15DEC]Max Flow P LCA倍增 lazy离线处理 又是一道树上倍增的绿题,思路依旧很简单。 常规的求倍增lca就不说了,主要是每条路径上面所有的点的值都需要+1。倍增每次网上跳一段距离,这边我们借用lazy tag的思想,每次lca向上跳的时候把跳的那一段做一个标记,最后询问的时候统一下放到每个点,更新的方式和预处理倍增差不多,只不过反过来进行操作了,具体见代码。这样就可以在nlogn的时间内得到答案。 #include <bits/stdc++.h&g

GreyKa的博客 275

TCNOpen实现TRDP通信协议(源码编译运行测试)

概述 本文介绍了通过TCNOpen开源源码实现TRDP通信,包括源码下载,开发环境搭建,编译运行,测试。 Linux环境下编译运行TRDP (一) 下载CANOpen源码。 下载地址:https://sourceforge.net/p/tcnopen/trdp/HEAD/tree/ (二) 源码编译 下载源码解压过后,在根目录文件readme-makefile.txt有介绍源码的配置和编译方法。 在trdp/config目录下可以看到包含在linux环境下的编译配置文件LINUX_config;执行”m

fengweibo112的博客 9634

【USACO18JAN】MooTube(Kruskal重构树+倍增)

博主考试的时候失智了 明明只差一句话就可以AC了的 然后抽风了交了暴力上去 标算是离线并查集 这里提供一种Kruskal重构树的简单做法 将重构树建出来后 此时是一个小根堆 我们倍增的往上跳 直到找到一个祖先的权值刚好小于K 显然 这个祖先的子树内的所有点到v的距离都是大于等于K的 因为此时u到v的距离是LCA(u,v),而显然,LCA(u,v)一定属于这个祖先的子树。 #includ...

Patrickpwq 2355

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

weixin_45390670的博客 1869

Cadence 设计实践笔记-小哥allegro 2层板笔记

规范建立文件夹本章节主要跟着B站PCB入门首选视频-小哥Cadence Allegro 2层板视频,结合自己的实践一步步完成一个完整的PCB板的设计。规范建立文件夹建立八个文件夹我使用的Cadence 17.4 有些差异原理图绘制原图绘制首先要熟悉原理图工作原理工作原理下面是这个项目的原理图重点关注电源新建原理图库打开Cadence 软件创建项目新建工程 File ==========》Project我这里选择了Enable PSPice 试试能不能仿真,新建项目如下。

我的专栏 1481

【Usaco Oct08 Gold】奶牛串门(Pasture Walking)(LCA)

Description有N (2 <= N <= 1,000)头奶牛,分别编号为1到N。还有N颗牧草分别编号为1到N。简单起见,第i头奶牛都盯着第i颗牧草。  有几对牧草分别用一些小路连接了起来,总共有N-1条双向的小路,小路i连接了Ai及Bi颗牧草(1 <= Ai <= N; 1 <= Bi <= N),小路的长度为Li (1 <= Li <= 10,000)保证任意两颗牧草总能通过小路走

tgoker的博客 848

基于IDEA与Mill构建Windows下的Chisel开发环境——香山处理器源码解析实战

本文详细指导如何在Windows系统下使用IDEA集成开发环境和Mill构建工具搭建Chisel开发环境,并以香山处理器源码为实战案例进行解析。内容涵盖环境准备、源码获取、工程构建、IDEA配置优化及代码阅读技巧,帮助开发者高效学习硬件设计语言。

a1b2c3d的博客 717

USACO 2019 December Contest, Silver 题解

1.MooBuzz Description Farmer John 的奶牛们最近成为了一个简单的数字游戏“FizzBuzz”的狂热玩家。这个游戏的规则很简单:奶牛们站成一圈,依次从一开始报数,每头奶牛在轮到她的时候报一个数。如果一头奶牛将要报的数字是 3 的倍数,她应当报“Fizz”来代替这个数。如果一头奶牛将要报的数字是 5 的倍数,她应当报“Buzz”来代替这个数。如果一头奶牛将要报的数字是 ...

帅比王的博客 2428

CASIA数据集解析:图像篡改检测的黄金标准与实践指南

本文深入解析了CASIA数据集在图像篡改检测领域的核心价值与应用实践。作为中科院自动化所打造的黄金标准,CASIA数据集通过模拟真实篡改场景(如拼接和复制移动)为研究者提供全面支持。文章详细对比了v1.0与v2.0版本差异,分享数据预处理和模型训练的最佳实践,并探讨了未来研究方向,是图像篡改检测领域的重要参考指南。

kappa的博客 785

FFMPEG音视频开发: Linux下采集音频(alsa-lib库)、视频(V4L2框架)数据编码并实时推流到RTMP流媒体服务器,达到直播功能(推流)

一、环境介绍 操作系统: VM虚拟机运行的ubuntu18.04 FFMPEG版本: 4.4.2 摄像头: 罗技USB摄像头、电脑自带摄像头 声卡:电脑自带声卡 二、FFMPEG、X264的安装 参考这里:FFMPEG开发: Linux下采集摄像头数据录制成MP4视频保存到本: 地https://blog.youkuaiyun.com/xiaolong1126626497/article/d...

2991

【洛谷2912】[USACO08OCT]牧场散步Pasture Walking

牧场散步Pasture Walking 题目描述 The N cows (2 &lt;= N &lt;= 1,000) conveniently numbered 1..Nare grazing among the N pastures also conveniently numbered 1..N. Mostconveniently of all, cow i is grazing in p...

Mininda 465

【C++】构造函数之初始化列表(Initialization list of constructors)

本讲主要是构造函数的初始化列表的讲节,但是本节很重要,可以关乎后面写项目

m0_62599305的博客 2234

洛谷——P2912 [USACO08OCT]牧场散步Pasture Walking(lca)

题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures also conveniently numbered 1..N. Most conveniently of all, cow i is grazing in pasture i. Some pai...

weixin_34124651的博客 218

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【树的倍增】【二分 or LCA】USACO MAR11银组 聚会地点

题目 时间限制: 1 Sec 内存限制: 64 MB 题目描述 Bessie和Jon每天都要去他们所居住的小镇的某些地方游玩。有趣的是,他们居住的小镇是一个树的结构,也就意

ixRic 1054

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[USACO 2016 Ope P]262144----基于倍增思想的DP问题,真是米奇妙妙屋,妙到家了

[USACO 2016 Ope P]262144 题目链接 f[i][j]表示凑出i的且左边界为j(闭区间)的右区间(开区间) 好像并查集 如果左边界为j时凑出i的右边界为0则 i-1的右边界变成左边界,再找一个可以凑出i-1的右边界,就能凑出i了 即f[i][j]=f[i-1][f[i-1][j]] 如果能凑出i则答案更新一下就好了 #include<iostream> #include<cstring> #include<algorithm> using namesp

ZZU_LGY 503

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

USACO的一些不错的题目

T1 Watering Hole 题目链接:https://www.luogu.org/problemnew/show/P1550 刚开始看时可能没有思路,但想明白后其实非常简单。可以建一个0点,然后与其它点连边,边权就是在所连点打井所用的钱数,这样再求一边最小生成树即可。很巧妙的一道题。 T2 Tractor 题目链接:https://www.luogu.org/problemnew/s...

Romain的博客 1838

USACO 2018 January Contest

比赛链接 T1 MooTube 题目链接 题目大意:给定一个图,两个点之间的距离是他们路径上边权的最小值。给定一个起点,求距离大于等于K的点有几个。 思路:考虑并查集。 - 将边权排序,将询问排序离线处理。 - 用两个指针,代表边加了多少和询问处理到第几个。 - 对于每一个询问,将所有边权小于等于它的边,全都加进去,也就是将两个端点所在并查集合并。 1A #include&amp;l...

szh_0808的博客 531

【题】【倍增】NKOJ 1536 奶牛串门【Usaco Oct08 Gold】(Pasture Walking)

NKOJ 1536 【Usaco Oct08 Gold】奶牛串门(Pasture Walking) 时间限制 : 30000 MS 空间限制 : 65536 KB 问题描述 有N (2 <= N <= 1,000)头奶牛,分别编号为1到N。还有N颗牧草分别编号为1到N。简单起见,第i头奶牛都盯着第i颗牧草。 有几对牧草分别用一些小路连接了起来,总共有N-1条双向的小路,小路i

ANG 656

[USACO08OCT]Bovine Bones G

/***************************************** 备注: ******************************************/ #include <queue> #include <math.h> #include <stack> #include <stdio.h> #include <iostream> #include <vector> #include <iomani.

lhh_ALLEN的博客 387

USACO 2008 OCT gold 牧草

题目描述有N (2 &lt;= N &lt;= 1,000)头奶牛,分别编号为1到N。还有N颗牧草分别编号为1到N。简单起见,第i头奶牛都盯着第i颗牧草。有几对牧草分别用一些小路连接了起来,总共有N-1条双向的小路,小路i连接了Ai及Bi颗牧草(1 &lt;= Ai &lt;= N; 1 &lt;= Bi &lt;= N),小路的长度为Li (1 &lt;= Li &lt;= 10,000) 保证...

zhouhongkai06的博客 277

USACO - Oct08 Gold Watering Hole 挖井 Kruskal演算法+点权转边权

【问题描述】 FJ决定给他分别用1到N编号的牧草浇水,他可以直接在一颗牧草旁边直接挖一口井来获得水,也可以用管子从任意有水的牧草那里来获得水。 在第i颗牧草旁边挖一口井的代价为Wi(),用管子连接第i与第j颗牧草的代价为Pij( Pij=Pji; Pii=0)。请求出FJ浇灌这些牧草花费的最小代价。 【输入格式】 第一行,一个整数N。第二行到第N+1行,行i+1表示Wi。 第N+2行到第

灬豪侠彡 1040

【Usaco Nov08 Gold】 安慰奶牛

Description Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N(5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家.FJ计划除去P(N-1 <= P <= 100,000)条道路中尽可能多的道路, 但是还要保持牧场之间的连通性. 你首先要决定那些道路是需要保留的N-1条道路. 第j条双向

Ciocio 2114

[USACO Oct08] 搭建篱笆解题报告

题目地址:Link to here据说这道题可以用动态规划来写但是我不会2333解题思路: 首先,我们可以考虑用f[i]来表示当前用了长度为i时的方案数。。但是根本行不通qwq。所以因该运用补集的思想来转化一下。当总长度为k的时候,很明显总方案数是C(n-1,3)就是在n-1个点中选出3个点来切;然后考虑不合法的情况即当最长边长度大于总长度的一半。我们可以枚举不合法的最长边长度然后再次运用排列组合

wspzz5的博客 381

布局(牛的距离,约束差分)

布局 POJ - 3169 和其他人一样,奶牛在排队喂食时喜欢靠近它们的朋友。FJ 有 N (2 <= N <= 1,000) 头奶牛,编号为 1…N 站在一条直线上等待喂食。奶牛以与编号相同的顺序站立,并且由于它们可能相当咄咄逼人,因此有可能两头或多头奶牛可以在完全相同的位置排成一排(也就是说,如果我们认为每头奶牛都位于在数轴上的某个坐标处,则有可能两头或多头奶牛共享相同的坐标)。 有些奶牛彼此喜欢,并希望彼此保持一定的距离。有些人真的很讨厌对方,想要至少分开一定的距离。ML (1 <

weixin_53158895的博客 272

【USACO 2008 Mar Gold】 3.Pearl Pairing 贪心 pq

题意:有若干个颜色,每个颜色有若干头牛。 现在将牛进行配对,使得每对颜色都不一样,有SPJ。 题解:一旦某种颜色的牛数量占当前未配对牛总数最多,那么就要群起而攻之! 利用pq或者heap解决。 代码: #include #include #include #include #include #define N 101000 #define inf 0x3f3f3

辗转山河弋流歌 1692
上一篇: 最近公共祖先 模板 裸题
下一篇: 商务旅行
Formiko
博客等级 码龄11年 20粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值