90pts求助
查看原帖
90pts求助
772592
shuangmu楼主2023/6/17 22:03

一直 WA 在第9个点xwx

#include<bits/stdc++.h>
#define ll long long 
#define LD long double
using namespace std;
const int N = 20050;

inline int read(){
    int x = 0; char ch = getchar();
    while(ch<'0' || ch>'9'){ch = getchar();}
    while(ch>='0'&&ch<='9'){x = x*10+ch-48; ch = getchar();}
    return x;
}

int n, w[N], d[N];
int fee[N], fed[N];
int f[N];
int q[N], lq, rq;
inline LD X(int x){
	return w[x];
}
inline LD Y(int x){
	return d[x-1]*w[x];
}
inline LD K(int x, int y){
	return (Y(y)-Y(x))/(X(y)-X(x));
}
int main(){
    n = read();
    for(int i = 1; i<=n; ++i){
        w[i] = read(), d[i] = read();
        w[i] += w[i-1];
        d[i] += d[i-1];
    }
    for(int i = 2; i<=n; ++i){
        fee[i] = fee[i-1]+w[i-1]*(d[i-1]-d[i-2]);
    }
    for(int i = n-1; i>=1; --i){
    	fed[i] = fed[i+1]+(w[i+1]-w[i])*(d[n]-d[i]);
	}
	lq = rq = 1;
	q[lq] = 1;
	for(int i = 2; i<=n; i++){
		while(lq<rq&&(Y(q[lq+1])-Y(q[lq]))<=d[i-1]*(X(q[lq+1])-X(q[lq]))) ++lq;
		int j = q[lq];
		f[i] = fed[i]+fee[i]-(d[i-1]-d[j-1])*w[j];
		while(lq<rq&&(Y(q[rq])-Y(q[rq-1]))*(X(i)-X(q[rq]))>=(X(q[rq])-X(q[rq-1]))*(Y(i)-Y(q[rq]))) rq--;
		q[++rq] = i;
	}
	int ans = 2000000000;
	for(int i = 2; i<=n; i++){
		ans = min(f[i], ans);
	}
	printf("%d\n", ans);
  //  system("pause");
    return 0;
}
2023/6/17 22:03
加载中...