WA!只有20分!求大佬帮忙!

P4064 [JXOI2017] 加法

Supor__Shoep @ 2022-07-16 13:49:24

个人感觉思路没有错误,但是只有 20 分。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+5;
int n,m,k,s;
int a[MAXN],c[MAXN];
struct node
{
    int l,r;
    bool operator<(const node &x)const
    {
        return r<x.r;
    }
}List[MAXN];
bool cmp(node x,node y){return x.l<y.l;}
int lowbit(int x)
{
    return x & -x;
}
priority_queue<node> que;
void add(int x,int k)
{
    for(int i=x;i<=n;i+=lowbit(i))  c[i]+=k;    
}
int ask(int x)
{
    int ans=0;
    for(int i=x;i>=1;i-=lowbit(i))  ans+=c[i];
    return ans;
}
bool check(int x)
{
    while(!que.empty()) que.pop();
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++)   add(i,a[i]-a[i-1]);
    int si=1;
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        while(si<=m&&List[si].l<=i) que.push(List[si++]);
        while(ask(i)<x&&!que.empty())
        {
            node t;
            while(t.r<i&&!que.empty())
            {
                t=que.top();
                que.pop();
            }
            if(t.r<i||++cnt>k)  return false;
            add(t.l,s);
            add(t.r+1,-s);
        }
        if(ask(i)<x)    return 0;
    }
    return 1;
}
int ans;
signed main()
{
    int T;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld%lld%lld",&n,&m,&k,&s);
        int l=INT_MAX,r=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            l=min(l,a[i]);
            r=max(r,a[i]);
        }
        for(int i=1;i<=m;i++)   scanf("%lld%lld",&List[i].l,&List[i].r);
        sort(List+1,List+m+1,cmp);
        r+=k*s;
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(check(mid))  l=mid+1,ans=mid;
            else    r=mid-1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

|