凸包+三分 Codeforces631E roduct Sum
傳送門:這裡寫連結內容
題意:允許交換兩個位置位置的數字,最終使得
思路:我們列出式子,很明顯的可以發現可以用斜率優化來做。
但是我們發現A陣列並不是不遞減的,所以我們不能用單調佇列來維護。
對於這題,我們應該去維護下凸包,然後在凸包上二分來做。
但是在做的時候,發現有非常多的細節要處理,必須非常細心才行
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <bitset>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define fuck(x) cout<<"["<<x<<"]";
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w+",stdout);
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MX = 2e5 + 5;
struct Point {
LL x, y;
Point() {}
Point(LL _x, LL _y) {
x = _x; y = _y;
}
Point operator -(const Point &P)const {
return Point(x - P.x, y - P.y);
}
LL operator*(const Point &P)const {
return x * P.y - y * P.x;
}
} P[MX], W[MX];
LL A[MX];
int n, sz;
LL f1(int i, int j) {
return -P[j].y + P[i].y + A[i] * j - i * A[i];
}
LL f2(int i, int j) {
return P[j - 1].y - P[i].y - A[j] * (j - i - 1);
}
LL solve() {
LL ret = 0; sz = 0;
for(int i = n; i >= 1; i--) {
while(sz >= 2 && (P[i] - W[sz]) * (W[sz] - W[sz - 1]) <= 0) sz--;
W[++sz] = P[i];
int l = 1, r = sz, m1, m2;
while(l < r) {
m1 = (2 * l + r) / 3;
m2 = (l + 2 * r + 2) / 3;
if(f1(i, W[m1].x) < f1(i, W[m2].x)) l = m1 + 1;
else r = m2 - 1;
}
ret = max(ret, f1(i, W[l].x));
}
sz = 0;
for(int i = 1; i <= n; i++) {
while(sz >= 2 && (P[i - 1] - W[sz]) * (W[sz] - W[sz - 1]) >= 0) sz--;
W[++sz] = P[i - 1];
int l = 1, r = sz, m1, m2;
while(l < r) {
m1 = (2 * l + r) / 3;
m2 = (l + 2 * r + 2) / 3;
if(f2(W[m1].x, i) < f2(W[m2].x, i)) l = m1 + 1;
else r = m2 - 1;
}
ret = max(ret, f2(W[l].x, i));
}
return ret;
}
int main() {
//FIN;
scanf("%d", &n);
LL sum = 0, pre = 0, t;
for(int i = 1; i <= n; i++) {
scanf("%I64d", &A[i]);
sum += A[i];
P[i] = Point(i, sum);
pre += i * A[i];
}
printf("%I64d\n", pre + solve());
return 0;
}
相關推薦
凸包+三分 Codeforces631E roduct Sum
傳送門:這裡寫連結內容 題意:允許交換兩個位置位置的數字,最終使得∑nii∗A[i] 最大,求最大值 思路:我們列出式子,很明顯的可以發現可以用斜率優化來做。 但是我們發現A陣列並不是不遞減的,所以我們不能用單調佇列來維護。 對於這題,我們應該去維護下凸
Gym - 101635K - 凸包+(三分或叉積)
題目連結:https://vjudge.net/problem/Gym-101635K 解題思路: 尋找最小覆蓋矩形使得能把蛋糕上面所有的點都覆蓋,求出他的寬度,高度不限. 那麼首先求出n個點組成的凸包.列舉凸包上的所有邊,再找凸包上的一個離這條邊最遠的點,經過此點
[BZOJ4311]向量(凸包+三分+線段樹分治)
可以發現答案一定在所有向量終點形成的上凸殼上,於是在上凸殼上三分即可。 對於刪除操作,相當於每個向量有一個作用區間,線段樹分治即可。$O(n\log^2 n)$ 同時可以發現,當詢問按斜率排序後,每個凸殼上的決策點也是單調變化的,於是可以記錄每次的決策位置。$O(n\log n)$ $O(n\log^2
[BZOJ3203][SDOI2013]保護出題人(凸包+三分)
https://www.cnblogs.com/Skyminer/p/6435544.html 先不要急於轉化成幾何模型,先把式子化到底再對應到幾何圖形中去。 1 #include<cstdio> 2 #include<algorithm> 3 #define re
BZOJ 3203 [SDOI2013]保護出題人 (凸包+三分)
洛谷傳送門 題目大意:太長略 每新加入一個殭屍,容易得到方程$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s_{i}+d(i-j)}}$ 即從頭開始每一段殭屍都需要在規定距離內被消滅 展開式子,可得$ans[i]=max{\frac{sum_{i}-sum_{j-1}}{s
bzoj 2388: 旅行規劃 (分塊+凸包+三分)
2388: 旅行規劃 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 281 Solved: 78 [Submit][Status][Discuss] Description OIVillage是一個風景秀美的鄉村,為
codeforce514 D. Nature Reserve 凸函式三分
演算法 三分法 給定若干個點,求包含所有點且與x軸相切的圓的最小半徑 #include<bits/stdc++.h> using namespace std; const int MAX=1e5+5; const double eps=1e-8; int
[BZOJ2402]陶陶的難題II(樹鏈剖分+線段樹維護凸包+分數規劃)
五行 add urn build 一行 輸入格式 for res 限制 陶陶的難題II 時間限制:40s 空間限制:128MB 題目描述 輸入格式 第一行包含一個正整數N,表示樹中結點的個數。 第二行包含N個正實數,第i個數表示xi
bzoj1964: hull 三維凸包
typename opera ifdef ide esp urn print family www 傳送門 二維平面四個點求凸包面積->任選三個點面積之和/2 三維平面五個點求凸包體積->任選四個點體積之和/2 二維平面三個點面積->二個二維向量行列式
POJ 3528--Ultimate Weapon(三維凸包)
cep 一個 view swa acc esc 維護 3.1 lec Ultimate Weapon Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 2430 Accepted: 1
2018杭電多校第三場1007(凸包,極角排序)
棧模擬 include struct node 距離 然而 bit const 極角 #include<bits/stdc++.h>using namespace std;typedef const long long ll;struct node{ in
計算幾何_三維凸包
1.hdoj3662 3D Convex Hull 傳送:http://acm.hdu.edu.cn/showproblem.php?pid=3662 題意:給出空間n個點,問凸包表面的多邊形個數。 分析:rt。 1 #include<bits/stdc+
分治法求二維凸包問題java
https://blog.csdn.net/bone_ace/article/details/46239187 見解法2。 有一點需要說明的是,如果有多個到直線p1 pn的距離都最大的點,找pmax使的∠pmax p1 pn最大 下面為java程式碼 package fd; impo
三維凸包
#include <bits/stdc++.h> using namespace std; const int MAXN=505; const double EPS=1e-8; struct Point{ double x,y,z; Point(){}
HDU 4449 Building Design(計算幾何 三維凸包 + 座標轉化 模板)
題目: You are a notable architect. Recently, a company invites you to design their new building for them. It is not an easy task, becaus
bzoj[2402] 陶陶的難題II 樹鏈剖分+線段樹+二分答案+凸包
將y+q/x+p的值設為x 由於i,j互不干擾,所以我們可以將x,y p,q拉出來分別計算 問題轉化為存在x,y,滿足y-mid*x+q-mid*p>=0的情況下mid最大 不難發現答案具有單調性,於是二分答案 顯然要取出一對(x,y)或(p,q)使y(q)-x(p)*mid儘可能大 以x,y
swust oj凸包面積(0249)_分治法
本文目錄:oj題目 -> 分治法思路 -> 具體過程 -> tips -> 測試資料 -> 程式碼這道題本身不是很難喲,不要被嚇到,然後就可以開始做了O(∩_∩)O~~ 題目: 分治法思路:見http://download.csdn.n
P4724 【模板】三維凸包
\(\color{#0066ff}{題目描述}\) 給出空間中n個點,求凸包表面積。 \(\color{#0066ff}{輸入格式}\) 第一行一個整數n,表示點數。 接下來n行,每行三個實數x,y,z描述座標。 \(\color{#0066ff}{輸出格式}\) 輸出凸包表面積,保留3位小數。
2018.09.30【POJ3348】Cows(凸包)(三角剖分)
傳送門 解析: 讀優沒有寫負數又被卡了半個小時。。。 這裡採用JarrisJarrisJarris步進法求凸包。。主要講一講怎麼求多邊形面積。 思路: 滿足題意的顯然是這些點的凸包,而我們要做的就是求出凸包面積。 那麼怎麼求多邊形面積? 考慮三角剖分,我們將多
三維凸包學習小記
三維凸包 Tags:高階演算法 Part 1 平面幾何基礎 出門右拐:https://www.cnblogs.com/xzyxzy/p/10033130.html (附計算幾何題單) Part 2 立體幾何基礎 向量運算 加減運算 同平面向量,對應座標相加減 模長 \(|a|=\sqrt