首页 > TAG信息列表 > USACO08FEB
P2894 [USACO08FEB]Hotel G
written on 2022-05-14 写这篇题解的原因是cpp说我基础太烂,于是找几题巩固。 一道巩固线段树基础的好题。同P3071好评。 审完题后,发现有许多区间操作,所以很明显是用数据结构维护,维护的过程都不难,因此普通线段树即可维护。 要注意的点就是,为了找连续区间的长度,我们的操作就是再维护P2895 [USACO08FEB]Meteor Shower S
// Problem: P2895 [USACO08FEB]Meteor Shower S // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P2895 // Memory Limit: 125 MB // Time Limit: 1000 ms // User: Pannnn #include <bits/stdc++.h> using namespace std; template<class T> vo[解题记录] P2894 [USACO08FEB]Hotel G
P2894 [USACO08FEB]Hotel G 题意简述 输入一个数 \(x\) ,在 \([1,n]\) 中找满足长度为 \(x\) 的最左边的全是 \(0\) 区间,输出左端点并将这个区间全部赋值为 \(1\),如果找不到则输出 \(0\) 输入两个数 \(x,y\) ,将区间 \([x,x+y-1]\) 里的数全部赋值为 \(0\) 解题思路 属于是线洛谷 P2894 [USACO08FEB]Hotel G(线段树)
传送门 解题思路 线段树维护区间最长连续0的长度。 板子。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<map> using namespace std; const int maxP2894 [USACO08FEB]Hotel G
题意就是维护整个序列最长连续01的位置,要求位置最左边,就是线段树最大连续子段和的查询操作稍作修改,每次查询分类讨论,如果左儿子内已经有满足题意的长度,就往左儿子找,如果左右凑起来有的话,就从左右凑起来,再查询右儿子有没有满足题意的长度. #include<iostream> #include<cstdio> #deP2894 [USACO08FEB]Hotel G
Rose 用维护区间最长连续1的方法就可以维护 但是还要维护一下最左边,不过这问题不大 维护一个区间最长连续子段,不在意位置就可以了 然后就可以在查询的时候,先看一看在不在左边,在看一看在不在中间,最后看一看在不在右边 就解决了 可见学线段树靠背模板是不行的 #include<iostream> #i「USACO08FEB」Meteor Shower S 题解 (BFS)
题目连接 Fir.坑点介绍大会 坑空间 坐标不能小于0,but 可以超过300 坑时间 1.流星砸下时间要最早的为准 2.流星砸下来的时间可以为0! 出题人:祝您过了样例,听取WA声一片 Sec.记录流星下砸时间 对此,我们可以定义\(a_{i,j}\)表示第\(i,j\)个点的遭殃时间。 初始化时请注意: | 根据P2894 [USACO08FEB] Hotel G
这个和那个COCI的STEP有点像。 这题维护前缀后缀区间答案、位置就行力。 区间assign就是把答案都设为区间长度或者0。 这里修改并不是最大连续空,但是我们记录了最大的左右端点,修改时搞成左端点+len-1就行力。 做完力。好时代,来临力!线段树题,主要是在pushup,pushdown上。 调试ingP2895 [USACO08FEB]Meteor Shower S 题解
题目传送门 感悟与理解 1、 #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int N = 310; //二维坐标系中每个点的上下左右变化delta坐标 int dx[4] = {0, 0, -1, 1}; int dy[4] = {1, -1, 0, 0}; int a[N][N]; //x,y坐标的最早P2894 [USACO08FEB]Hotel G(线段树维护区间子串)
#include<bits/stdc++.h> using namespace std; inline int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<[USACO08FEB]酒店Hotel————线段树,01序列
题解:本题主要考查线段树维护01序列的操作 简要题意:1——n全为0的序列,有m个操作。1:找到长度为x的连续0,并改为1,输出最左的序号。2:x—x+y-1改为0 1:线段树:找最长的0序列,又有区间修改,用线段树维护左右最长值,再左右值合并,注意细节! 代码如下: #include<iostream> #include<algorithmLuogu P2893 [USACO08FEB]修路Making the Grade
传送门 修改数组里的值,使数组(不严格)单调,且改动最小。 考虑动态规划。 上升和下降的方法都是一样的,以上升为例。 当修改一个数时,一定会把它修改成数组中出现过的某一个数。 那么把数组离散化一下,$b[i]$表示数组中第$i$大的数(这里可以用unique去重一下)。 那么只要枚举将每个数修改成[Luogu P2893][USACO08FEB]修路Making the Grade
题意大致就是求把一段序列改成单调递增或者单调递减最小费用,费用是改前改后的高度之差的绝对值。那就直接用dp去做。我们用dp[i][j]表示把前i段维护成有序的,第i段高度为h[j]时的最小花费。因为我们无论怎么改,其实改后的高度总是出现在原有序列之间的,因为显然改一个那改后的值一定与