zoukankan      html  css  js  c++  java
  • CF1083E The Fair Nut and Rectangles

    传送门

    记麻麻我终于学会斜率优化了TAT

    孙神一眼切是个dp然后我就推了发斜率优化竟然对了诶嘿嘿

    f_i=max(f_j +y_i(x_i-x_j)-a_i)

    frac{f_j-f_k}{x_j-x_k}>y_i

    然后直接斜率优化维护下凸壳就吼了啊qwq

    【别忘了先排序= =||】

    又是忘了开longlong的一天doge

    斜率优化大概是会推了= =+

    又一个flag立下了= =+

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define inf 20021225
    #define ll long long
    #define db double
    #define eps 1e-7
    using namespace std;
    
    struct point{int x,y;ll a;}p[1000100];
    bool cmp(point a,point b){return a.x<b.x;}
    ll f[1000100];
    db slope(int x,int y)//x>y
    {
    	return ((db)f[x]-f[y])/((db)p[x].x-p[y].x);
    }
    bool check(int i,int j,int k)//i >j >k
    {
    	return slope(j,k)>p[i].y;
    }
    int que[1000100];
    int main()
    {
    	int n;ll ans=0;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)	scanf("%d%d%I64d",&p[i].x,&p[i].y,&p[i].a);
    	sort(p+1,p+n+1,cmp);
    	int hd=0,tl=0;
    	for(int i=1;i<=n;i++)	f[i]=-p[i].a+(ll)p[i].x*p[i].y,ans=max(ans,f[i]);
    	que[hd]=1;
    	for(int i=2;i<=n;i++)
    	{
    		while(hd<tl&&check(i,que[hd+1],que[hd]))	hd++;
    		int pos=que[hd];
    		f[i]=max(f[i],f[pos]-p[i].a+(ll)p[i].y*(p[i].x-p[pos].x));
    		ans=max(ans,f[i]);//printf("%d 
    ",f[pos]-p[i].a+p[i].y*(p[pos].x-p[i].x));
    		while(hd<tl&&slope(que[tl],que[tl-1])<slope(i,que[tl]))	tl--;
    		que[++tl]=i;
    	}
    	printf("%I64d
    ",ans);
    	return 0;
    }

    开心愉悦.jpg

  • 相关阅读:
    NYOJ 42 一笔画问题
    python raise 使用方法
    五种异常处理机制:默认异常处理、assert与with...as
    都想学
    骆驼祥子
    XSHELL使用技巧
    明朝那些事儿
    百年孤独
    Linux常用命令
    重庆森林-金城武
  • 原文地址:https://www.cnblogs.com/hanyuweining/p/10321932.html
Copyright © 2011-2022 走看看