2 条题解

  • 0
    @ 2025-10-8 17:07:54
    #include <bits/stdc++.h>
    #define maxn 100010
    #define int long long
    using namespace std;
    struct data{
        int x, y;
    }stk[maxn];
    int n, D, sum[maxn], top;
    double Ans;
    
    inline int read(){
        int s = 0, w = 1;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
        for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
        return s * w;
    }
    
    double slope(data x, data y){ return 1.0 * (x.y - y.y) / (x.x - y.x); }
    
    signed main(){
        n = read(), D = read();
        stk[0] = (data){0, 0};
        for (int i = 1; i <= n; ++i){
            int x = read(), y = read(); sum[i] = sum[i - 1] + x;
            data tmp = {i * D, sum[i - 1]};
            while (top && slope(stk[top - 1], stk[top]) > slope(stk[top], tmp)) --top;
            stk[++top] = tmp;
            tmp = (data){y + i * D, sum[i]};
            int l = 1, r = top, ans = 0;
            while (l <= r){
                int mid = (l + r) >> 1;
                if (slope(stk[mid], tmp) > slope(stk[mid - 1], tmp)) ans = mid, l = mid + 1; else r = mid - 1;
            }
            Ans += slope(stk[ans], tmp);
        }
        printf("%.0f\n", Ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:07:49
      #include <bits/stdc++.h>
      #define maxn 100010
      #define int long long
      using namespace std;
      struct data{
      	int x, y;
      }stk[maxn];
      int n, D, sum[maxn], top;
      double Ans;
      
      inline int read(){
      	int s = 0, w = 1;
      	char c = getchar();
      	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
      	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
      	return s * w;
      }
      
      double slope(data x, data y){ return 1.0 * (x.y - y.y) / (x.x - y.x); }
      
      signed main(){
      	n = read(), D = read();
      	stk[0] = (data){0, 0};
      	for (int i = 1; i <= n; ++i){
      		int x = read(), y = read(); sum[i] = sum[i - 1] + x;
      		data tmp = {i * D, sum[i - 1]};
      		while (top && slope(stk[top - 1], stk[top]) > slope(stk[top], tmp)) --top;
      		stk[++top] = tmp;
      		tmp = (data){y + i * D, sum[i]};
      		int l = 1, r = top, ans = 0;
      		while (l <= r){
      			int mid = (l + r) >> 1;
      			if (slope(stk[mid], tmp) > slope(stk[mid - 1], tmp)) ans = mid, l = mid + 1; else r = mid - 1;
      		}
      		Ans += slope(stk[ans], tmp);
      	}
      	printf("%.0f\n", Ans);
      	return 0;
      }
      • 1

      【计算几何:凸包】[SDOI2013] 保护出题人

      信息

      ID
      4868
      时间
      1000ms
      内存
      128MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者