社区讨论

刚学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 条回复,欢迎继续交流。

正在加载回复...