首页 > 其他分享 >51nod-3986-免费的馅饼

51nod-3986-免费的馅饼

时间:2024-07-28 10:07:18浏览次数:9  
标签:le 51nod 2y 馅饼 int https 3986

https://class.51nod.com/Html/Textbook/Problem.html#problemId=3986&textbookChapterId=725

https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338

我们将馅饼表示为 \((p_i,t_i)\),即一个平面直角坐标系上的点。

我们把馅饼看成静止,人每次往上移动一格。

记当前点为 \((x_0,y_0)\),考虑能转移到当前点的馅饼满足的条件。

向上走的路程为 \(y_0-y\),左右为 \(x_0-x\)。

一直往右:\(2(y_0-y)=x_0-x\)。

一直往左:\(-2(y_0-y)=x_0-x\)。(此时两边都是负值)

由于每次只能最多走2格,所以 \(2(y_0-y)\ge x_0-x\),得 \(x-2y\ge x_0-2y_0\),变为 \(2y-x\le 2y_0-x_0\)。

同理,\(-2(y_0-y)\le x_0-x\)。(即左边的绝对值更大),得 \(x+2y\le x_0+2y_0\)。

单独满足一个条件不满足 \(y<y_0\),但是同时满足就同时满足这一条件,如图:

image-20240728095812541

动态:https://www.geogebra.org/m/zv9vwhzk

即紫色区域。

至此,令 \(x'=2y-x,y'=x+2y\),此时变成了一个二维偏序问题,只要满足 \(x'\le x_0',y'\le y_0'\) 的就可以转移。

通过排序去掉一维,另一维树状数组维护之。

当然要离散化树状数组那一维。

\(O(n\log n)\)。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int w,n,ls[N],f[N];
struct bing{
	int x,y,v,lv,rv;
	void init(){
		cin>>y>>x>>v;
		lv=y*2-x;
		rv=x+y*2;
	}
	bool operator<(const bing&B)const{
		// return rv<B.rv;
		return rv^B.rv?rv<B.rv:lv<B.lv;
	}
}b[N];
int c[N];
void add(int x,int v){
	for(;x<=n;x+=x&-x)c[x]=max(c[x],v);
}
int sum(int x){
	int res=0;
	for(;x;x-=x&-x)res=max(res,c[x]);
	return res;
}
int main(){
	#ifdef LOCAL
	freopen("1.txt","r",stdin);
	#endif
	#ifndef LOCAL
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	#endif
	cin>>w>>n;
	for(int i=1;i<=n;++i)b[i].init(),ls[i]=b[i].lv;
	sort(b+1,b+1+n);
	// for(int i=1;i<=n;++i)
		// cout<<b[i].rv<<' '<<b[i].lv<<' '<<b[i].v<<'\n';
	sort(ls+1,ls+1+n);
	int m=unique(ls+1,ls+1+n)-ls-1;
	for(int i=1;i<=n;++i)
		b[i].lv=lower_bound(ls+1,ls+1+m,b[i].lv)-ls;
	int ans=0;
	for(int i=1;i<=n;++i){
		f[i]=sum(b[i].lv)+b[i].v;
		ans=max(ans,f[i]);
		add(b[i].lv,f[i]);
	}
	cout<<ans;
	return 0;
}

标签:le,51nod,2y,馅饼,int,https,3986
From: https://www.cnblogs.com/wscqwq/p/18327914

相关文章

  • 51nod-3976-最长序列
    https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338https://class.51nod.com/Html/Textbook/Problem.html#problemId=3976&textbookChapterId=725LIS是符号只有大于或小于,所以这道题就是LIS问题。状态设计同LIS,由于答案就是长度,所以就能知......
  • 51nod-基因匹配+luogu-【模板】最长公共子序列
    https://www.luogu.com.cn/problem/P1439https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338以上两个都是特例,一个是每个元素不重复,一个是每个元素均有5个。正确性说明参考:https://www.luogu.com.cn/article/1bcs9052由于一般情况可能出......
  • 51nod-3978列车
    https://class.51nod.com/Html/Textbook/Problem.html#problemId=3978&textbookChapterId=724https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337这里一次发车的转移是\([j+1,i]\),出发时间\(+s\)为\(j+1\)启程返回,偏移\(i-j-1\)就......
  • 51nod-1288汽油补给
    1288汽油补给https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337这道题算DP纯粹是个幌子,其实就是一个贪心的过程。为什么要留后面价格贵的油?因为可能不够用,先存着;而如果前面的贵,由于有\(T\)限制,所以在能够装满的同种情况下,用后面......
  • 51nod-3983走方格
    https://class.51nod.com/Html/Textbook/Problem.html#problemId=3983&textbookChapterId=724https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337移动与时间段有关,如果按照时间段划分状态那么每一段内只有一条线性的转移。需要一行一行或......
  • hdu1176免费馅饼java
    一个数塔问题,以时间为纵坐标、位置为横坐标创建一个二维数组,然后从下往上相加。状态转移方程:9>=j>=1时dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j-1])  j=0时 dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]) j=10时dp[i][j]+=......
  • P3986 斐波那契数列
    题目链接:P3986斐波那契数列推式子观察题目所给的序列:根据题意我们可以知道k=f(i-1)+f(i-2)那么浅浅的推一下就可以发现:k=f(3)时k=a+bk=f(4)时k=a+2bk=f(5)时k=2a+3b......故可以得出k=fib(i)a+fib(i+1)b因为a,b属于正整数故fib(n-2)+fib(n-1)>k时停止那么我们......
  • 51nod2599 最近公共祖先LCA
    给定一颗n个节点的树,根节点编号为1,有Q组询问,每次给定一对节点编号(x,y),求(x,y)的最近公共祖先。求LCA有多种方法,这里给的是倍增法,预处理时间O(nlogn),单次查询时间O(logn),支持在线。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for......
  • 51nod1174 区间中最大的数RMQ
    给出一个有n个数的序列,下标0~n-1,有Q次查询,每次询问区间[l,r]的最大值。如果有修改,可以考虑线段树,这里只有静态查询,可以用ST表,预处理时间O(nlogn),单次查询时间O(1)。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for(inti=a;i<=b;i......
  • 51nod 2620 序列问题
    原题首先\(O(n\logn)\)的贪心很好想,显然用堆,每次合并两个权值最小的即可然后考虑\(O(n)\)怎么做?我们发现这个权值\(\max(a_i,a_{i+1})\)的\(\max\)很不好处理,因此我们考虑把他优化一下使用单调栈可以求出权值为\(a_i\)的合并区间,然后我们发现对于合并一个区间答案......