整体二分 0 pts 求助
查看原帖
整体二分 0 pts 求助
339846
RuntimeErr楼主2021/10/31 18:39

RT,萌新刚学整体二分,全 WA 调不出来

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
template <typename T>
inline void read(T& r) {
    r=0;bool w=0; 
    char ch=getchar();
    while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
    while(ch>='0'&&ch<='9') r=(r<<3)+(r<<1)+(ch^48), ch=getchar();
    r=w?-r:r;
}

const int N=3e5+10;
#define lb (x&-x)
typedef long long ll;

int n,m,k,ans[N];
ll p[N],tre[N];
vector<int>o[N];
struct node{
    int l,r,val,id;
}q[N<<1];

void add(int x,int val){
    for(;x<=m;x+=lb)tre[x]+=val;
}
ll query(int x){
    ll res=0;
    for(;x;x-=lb)res+=tre[x];
    return res;
}

void solve(int l,int r,vector<int>qr){
    if(l==r){
        for(int i:qr)ans[i]=q[l].id;
        return;
    }
    int mid=l+r>>1;
    vector<int>q1,q2;
    for(int i=l;i<=mid;++i)add(q[i].l,q[i].val),add(q[i].r+1,-q[i].val);
    for(int i:qr){
        ll sum=0;
        for(int j:o[i])sum+=query(j);
        if(sum>=p[i])q1.push_back(i);
        else p[i]-=sum,q2.push_back(i);
    }
    solve(l,mid,q1),solve(mid+1,r,q2);
}

int main(){
    read(n),read(m);
    vector<int>qr;
    for(int i=1,x;i<=m;++i)read(x),o[x].push_back(i);
    for(int i=1;i<=n;++i)read(p[i]),qr.push_back(i);
    read(k);
    int tot=0,l,r,a;
    for(int i=1;i<=k;++i){
        read(l),read(r),read(a);
        if(l<=r){
            q[++tot]=(node){l,r,a,i};
        }else {
            q[++tot]=(node){l,m,a,i};
            q[++tot]=(node){1,r,a,i};
        }
    }
    q[++tot]=(node){1,m,0x7fffffff,k+1};
    solve(1,tot,qr);
    for(int i=1;i<=n;++i){
        if(ans[i]==k+1)printf("NIE\n");
        else printf("%d\n",ans[i]);
    }
    return 0;
}
2021/10/31 18:39
加载中...