1. 程式人生 > >凸包+三分 Codeforces631E roduct Sum

凸包+三分 Codeforces631E roduct Sum

傳送門:這裡寫連結內容
題意:允許交換兩個位置位置的數字,最終使得niiA[i] 最大,求最大值
思路:我們列出式子,很明顯的可以發現可以用斜率優化來做。
但是我們發現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