社区讨论
wqs二分 有个小疑问
P1484种树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlivyz3u
- 此快照首次捕获于
- 2026/02/12 11:15 上周
- 此快照最后确认于
- 2026/02/14 16:30 5 天前
写 wqs 二分90pts于是我把取答案改成
ans=x.second-k*mid就过了,求教。90pts
CPP#include <bits/stdc++.h>
using namespace std;
#ifdef __linux__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc _getchar_nolock
#define pc _putchar_nolock
#endif
#define int long long
#define rint register int
#define R register
#define _ read<int>()
template<class T>inline T read()
{
R T r=0,f=1;R char c=gc();
while(!isdigit(c))
{
if(c=='-') f=-1;
c=gc();
}
while(isdigit(c)) r=(r<<1)+(r<<3)+(c^48),c=gc();
return f*r;
}
inline void out(rint x)
{
if(x<0) pc('-'),x=-x;
if(x<10) pc(x+'0');
else out(x/10),pc(x%10+'0');
}
const int N=3e5+10,INF=1145141919810;
int a[N],n;
pair<int,int>dp[N][2];
inline pair<int,int> check(rint x)
{
for(rint i=0;i<=n;++i) dp[i][0]=dp[i][1]={INF,-INF};
dp[0][0]={0,0};
rint tmp;
for(rint i=1;i<=n;++i)
{
tmp=dp[i-1][0].second+a[i]+x;
if(dp[i][1].second<=tmp)
{
dp[i][1].second=tmp;
if(dp[i][1].second==tmp) dp[i][1].first=min(dp[i-1][0].first+1,dp[i][1].first);
else dp[i][1].first=dp[i-1][0].first+1;
}
if(dp[i-1][0].second<dp[i-1][1].second) dp[i][0]=dp[i-1][1];
else if(dp[i-1][0].second>dp[i-1][1].second) dp[i][0]=dp[i-1][0];
else dp[i][0]=dp[i-1][1],dp[i][0].first=min(dp[i][0].first,dp[i-1][0].first);
}
if(dp[n][0].second>dp[n][1].second||(dp[n][0].second==dp[n][1].second&&dp[n][1].first>dp[n][0].first)) return dp[n][0];
else return dp[n][1];
}
signed main()
{
n=_;rint k=_;
for(rint i=1;i<=n;++i) a[i]=_;
rint l=-2e11,r=2e11,mid,ans=0;
while(l<=r)
{
mid=l+r>>1;
auto x=check(mid);
// if(x.first<=k) cout<<x.second-x.first*mid<<' '<<x.first<<endl;
if(x.first<=k)
{
l=mid+1;if(x.second-x.first*mid>ans) ans=x.second-x.first*mid;
}
else r=mid-1;
}
out(ans);
return 0;
}
100pts
CPP#include <bits/stdc++.h>
using namespace std;
#ifdef __linux__
#define gc getchar_unlocked
#define pc putchar_unlocked
#else
#define gc _getchar_nolock
#define pc _putchar_nolock
#endif
#define int long long
#define rint register int
#define R register
#define _ read<int>()
template<class T>inline T read()
{
R T r=0,f=1;R char c=gc();
while(!isdigit(c))
{
if(c=='-') f=-1;
c=gc();
}
while(isdigit(c)) r=(r<<1)+(r<<3)+(c^48),c=gc();
return f*r;
}
inline void out(rint x)
{
if(x<0) pc('-'),x=-x;
if(x<10) pc(x+'0');
else out(x/10),pc(x%10+'0');
}
const int N=3e5+10,INF=1145141919810;
int a[N],n;
pair<int,int>dp[N][2];
inline pair<int,int> check(rint x)
{
for(rint i=0;i<=n;++i) dp[i][0]=dp[i][1]={INF,-INF};
dp[0][0]={0,0};
rint tmp;
for(rint i=1;i<=n;++i)
{
tmp=dp[i-1][0].second+a[i]+x;
if(dp[i][1].second<=tmp)
{
dp[i][1].second=tmp;
if(dp[i][1].second==tmp) dp[i][1].first=min(dp[i-1][0].first+1,dp[i][1].first);
else dp[i][1].first=dp[i-1][0].first+1;
}
if(dp[i-1][0].second<dp[i-1][1].second) dp[i][0]=dp[i-1][1];
else if(dp[i-1][0].second>dp[i-1][1].second) dp[i][0]=dp[i-1][0];
else dp[i][0]=dp[i-1][1],dp[i][0].first=min(dp[i][0].first,dp[i-1][0].first);
}
if(dp[n][0].second>dp[n][1].second||(dp[n][0].second==dp[n][1].second&&dp[n][1].first>dp[n][0].first)) return dp[n][0];
else return dp[n][1];
}
signed main()
{
n=_;rint k=_;
for(rint i=1;i<=n;++i) a[i]=_;
auto tmp=check(0);
if(tmp.first<=k)
{
out(tmp.second);return 0;
}
rint l=-2e11,r=0,mid,ans=0;
while(l<=r)
{
mid=l+r>>1;
auto x=check(mid);
// cout<<x.second-x.first*mid<<' '<<x.first<<' '<<mid<<endl;
if(x.first<=k)
{
l=mid+1;ans=x.second-k*mid;
}
else r=mid-1;
}
out(ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...