这份代码是怎么过编译的
  • 板块P4983 忘情
  • 楼主_HL_
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/3/15 21:31
  • 上次更新2023/10/23 21:27:40
查看原帖
这份代码是怎么过编译的
223560
_HL_楼主2023/3/15 21:31

rt 我标了注释的那行 调用了 bool better(line A,line B,line C) 这一函数 但是我前两个参数传了俩 int 它过编译了 甚至过了俩样例 甚至得了 30 分 所以它干了啥呀 求助是啥子原理/kel

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define mk make_pair
const int N=1e5+7;
int a[N],s[N],n;
int f[N],g[N];
struct line
{
	int k,b,id;
	line(int k=0,int b=0,int id=0):k(k),b(b),id(id){}
}q[N];
inline bool cmin(int &x,int y){return x>y?x=y,1:0;}
#define lll __int128
inline bool better(line C,line A,line B)
{
	return (lll)(C.b-A.b)*(B.k-C.k)<(lll)(C.b-B.b)*(A.k-C.k);
}
pii solve(int W)
{
	memset(f,0x1f,sizeof(f));
	f[0]=g[0]=0;
	int L=1,R=1;
	q[1]=line(0,1,0);
	for(int i=1;i<=n;i++)
	{
		while(L<R&&q[L].k*s[i]+q[L].b>q[L+1].k*s[i]+q[L+1].b)L++;
		f[i]=q[L].k*s[i]+q[L].b+s[i]*s[i]+2*s[i]+W,g[i]=g[q[L].id]+1;
		line nw=line(-2*s[i],f[i]-2*s[i]+1+s[i]*s[i],i);
		while(L<R&&better(R-1,R,nw))R--;////////////////////
		q[++R]=nw;
	}
	return mk(f[n],g[n]);
}

int wqs(int k)
{
	int l=-1e18,r=1e18,ans;
	while(l<r)
	{
		int mid=l+r>>1;
		if(solve(mid).se<=k)r=mid-1,ans=mid;
		else l=mid+1;
	}
	return ans;
}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
	int k=wqs(m);
	cout<<solve(k).fi-m*k;
	return 0;
}
2023/3/15 21:31
加载中...