社区讨论
刚学OI,不是妹子,求查错
P2048[NOI2010] 超级钢琴参与者 5已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yetl6
- 此快照首次捕获于
- 2025/11/21 05:39 4 个月前
- 此快照最后确认于
- 2025/11/21 05:39 4 个月前
样例可过,评测233
CPP#include<bits/stdc++.h>
using namespace std;
const int maxn=500005;
struct node{
int num;
int s;
int t;
int left;
int right;
bool operator <(const node &b)const{
return num<b.num;
}
};
int n,m,dp[maxn][30],logg[maxn],sum[maxn],l,r,k,flag,ans[maxn][20];
priority_queue<node>q;
void RMQ(){
//for(int i=1;i<=n;i++)dp[i][0]=sum[i],ans[i][0]=i;
for(int j=1;j<=logg[n];j++)
for(int i=1;i<=n;i++)
if(i+(1<<j)-1<=n){
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
if(dp[i][j-1]>dp[i+1<<(j-1)][j-1])ans[i][j]=ans[i][j-1];
else ans[i][j]=ans[i+(1<<(j-1))][j-1];
}
}
void query(int i,int p1,int q1){
node x;
int t;
int tmp=logg[q1-p1+1];
if(dp[p1][tmp]>dp[q1-(1<<tmp)+1][tmp])t=ans[p1][tmp];
else t=ans[q1-(1<<tmp)+1][tmp];
x.num=sum[t]-sum[i-1];
x.t=t;
x.s=i;
x.left=p1;
x.right=min(q1,n);
q.push(x);
//cout<<x.num<<" "<<endl;
}
int main(){
scanf("%d%d%d%d",&n,&k,&l,&r);
logg[0]=-1;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
sum[i]=sum[i-1]+x;
dp[i][0]=sum[i];
ans[i][0]=i;
logg[i]=logg[i/2]+1;
}
RMQ();
for(int i=1;i+l-1<=n;i++)
query(i,i+l-1,min(i+r-1,n));
long long anss=0;
for(int i=1;i<=k;i++){
node kk=q.top();
q.pop();
anss+=kk.num;
cout<<kk.t<<" "<<kk.left<<" "<<kk.right<<" "<<kk.num<<endl;
if(kk.t>kk.left)query(kk.s,kk.left,kk.t-1);
if(kk.t<kk.right)query(kk.s,kk.t+1,kk.right);
}
cout<<anss<<endl;
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...