UVa 11790 - Murcia's Skyline

题目:给你一排建筑的长度和高度,求最长的上横高度和下降高度。

分析:dp,最大上升子序列。

说明:有长度,不能直接用单调队列优化。

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int h[2000],w[2000],u[2000],l[2000];

int main()
{
	int T,n;
	while (~scanf("%d",&T))
	for (int t = 1 ; t <= T ; ++ t) {
		scanf("%d",&n);
		for (int i = 0 ; i < n ; ++ i)
			scanf("%d",&h[i]);
		for (int i = 0 ; i < n ; ++ i)
			scanf("%d",&w[i]);

		int in = 0,de = 0;
		for (int i = 0 ; i < n ; ++ i) {
			u[i] = l[i] = w[i];
			for (int j = 0 ; j < i ; ++ j) {
				if (h[j] < h[i] && u[i] < u[j]+w[i])
					u[i] = u[j]+w[i];
				if (h[j] > h[i] && l[i] < l[j]+w[i])
					l[i] = l[j]+w[i];
			}
			if (in < u[i]) in = u[i];
			if (de < l[i]) de = l[i];
		}
		if (in >= de)
			printf("Case %d. Increasing (%d). Decreasing (%d).\n",t,in,de);
		else printf("Case %d. Decreasing (%d). Increasing (%d).\n",t,de,in);
	}
	return 0;
}

UVa 11790 - Murcia's Skyline

时间: 2024-10-26 05:49:24

UVa 11790 - Murcia's Skyline的相关文章

UVa 11790 - Murcia&amp;#39;s Skyline

称号:给你一个行长度的建设和高度,我们祈求最长的和下降的高度. 分析:dp,最大上升子. 说明:具有长度,不能直接优化队列单调. #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int h[2000],w[2000],u[2000],l[2000]; int main() { int T,n; while (~scanf("%d",&T

UVA 1232 - SKYLINE(线段树)

UVA 1232 - SKYLINE 题目链接 题意:按顺序建房,在一条线段上,每个房子一个高度,要求出每间房子建上去后的轮廓线 思路:线段树延迟更新,一个setv作为高度的懒标记,此外还要在开一个cover表示当前结点一下是否都为同一高度 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define lson(x) ((x<<1)+1)

Uva 1232 - SKYLINE ( 线段树 + 区间更新 )

Uva 1232 SKYLINE (线段树 + 区间更新) 题意: 按照顺序在地面上建造放在,每个房子的高度为h,操作 l r h 表示 在(l,r] 区间建立一个高度为h的房子.统计每次建立完房子之后的overlap值之和 overlap值表示[ 修完一座房子之后,统计它在多长的部分是最高的(可以和其他房子并列高) ]如样例图,按照灰.黒.白的顺序建立房子 ans = (11-5) + (5-1) + (5-3) + (13-11) = 6 + 4 + 4 = 14 分析: 一开始一直想不明白

uva 105 - The Skyline Problem

一.用数组储存该位置的最高点即可(图形的连续点离散化),注意左边界及右边界的情况: 注意:无论建筑物最左边是盖到哪里,你都得从1开始输出(输入输出都是integer,所以才能离散化): 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int skyline[10005] = {0}; 8 int L, H, R; 9 int rightest = 0; 10

【UVA】1232 - SKYLINE(线段树减枝)

注意中间的减枝,还需要用一个tr[i]记录结点的值,用col[i]记录结点区间是否被全覆盖. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 111111; const int maxd = 100001; #define lson pos<<1 #define rson pos<<1|1 int col[ma

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED