P8726
1.CF1209G2 Into Blocks (hard version)2.「POJ 3744」Scout YYF I3.记录trick4.洛谷P10936 导弹防御塔5.CF1635E Cars
6.P8726
7.CF633G8.CF1436E9.[BJOI2017] 喷式水战改10.「CF407E」k-d-sequence11.「雅礼集训 2017 Day5」珠宝12.AT_jsc2019_final_h Distinct Integers13.CF1430G Yet Another DAG Problem14.[2022CCPC广州] B Ayano and sequences15.[2022CCPC广州] Infection16.[2022CCPC广州] XOR Sum首先很显然可以得出
#include <bits/stdc++.h>
#define int long long
#pragma GCC optimeze(2)
using namespace std;
const int N = 5e5 + 5;
long long read() {
long long flag = 1, x = 0;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-')
flag = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
return x * flag;
}
int dp[N], n, t[N], f[N], ans = 0;
signed main() {
n = read();
for (int i = 1; i <= n; i++) {
t[i] = read();
}
for (int i = 1; i <= n; i++) {
f[i] = read();
}
memset(dp, 0xc0, sizeof dp);
dp[1] = 0;
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
dp[i] = max(dp[i], dp[j] / 2 + t[i] * t[j] - f[j]);
}
ans = max(ans, dp[i]);
}
cout << ans;
return 0;
}
AC Code:
#include <bits/stdc++.h>
#pragma GCC optimeze(2)
#pragma GCC optimeze(3)
#define int long long
#define PII pair<int, int>
using namespace std;
const double eps=1e-9;
const int N=5e5+5;
const int V=2e4;//题面中t的值域,也就是所有一次函数x的取值范围
int read(){
int x=0, flag=1;
char ch=0;
while (ch<'0'||ch>'9'){
if (ch=='-')
flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*flag;
}
struct lcxds{
int l,r;
int v;
}tr[V*4];
struct line{
double k,b;
}l[N];
int q,n,t[N],f[N],dp[N];
double c(double a,int bh){
return a*l[bh].k+l[bh].b;
}
bool pd(double x,int i,int j){
if(c(x,i)-c(x,j)>eps)return 1;//double有精度误差,所以用了一个eps
if(c(x,j)-c(x,i)>eps)return 0;
}
void change(int l,int r,int p,int s,int t,int i){
if(s>=l&&t<=r){
if(pd(s,i,tr[p].v)&&pd(t,i,tr[p].v)){
tr[p].v=i;
return;
}
int m=(s+t)>>1;
if(pd(m,i,tr[p].v))swap(i,tr[p].v);
if(pd(s,i,tr[p].v))change(l,r,p*2,s,m,i);
if(pd(t,i,tr[p].v))change(l,r,p*2+1,m+1,t,i);
return;
}
int m=(s+t)>>1;
if(m>=l)change(l,r,p*2,s,m,i);
if(m<r)change(l,r,p*2+1,m+1,t,i);
}
int query(double k,int p,int s,int t){
if(s==t)return tr[p].v;
int m=(s+t)>>1,ans1=0,ans=tr[p].v;
if(m>=k)ans1=query(k,p*2,s,m);
else ans1=query(k,p*2+1,m+1,t);
if(pd(k,ans1,ans))ans=ans1;
return ans;
}//以上两个函数就是李超线段树的实现
signed main() {
n=read();
for(int i=1;i<=n;i++){
t[i]=read();
}
for(int i=1;i<=n;i++){
f[i]=read();
}
memset(dp,0xc0,sizeof dp);
dp[1]=0;
l[1].k=t[1],l[1].b=dp[1]/2-f[1];
change(1,V,1,1,V,1);//先将1这根直线插进去
int ans=0;
for(int i=2;i<=n;i++){
int j=query(t[i],1,1,V);//找到使值最大的那一条直线
j=max(j,1ll);//这里要和1取一个max,避免选到0这根直线
dp[i]=dp[j]/2+t[i]*t[j]-f[j];
l[i].k=t[i],l[i].b=dp[i]/2-f[i];
change(1,V,1,1,V,i);//插入直线
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}
本文作者:Xdik
本文链接:https://www.cnblogs.com/Xdik/p/18708134
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步