整体二分+线段树 0分求助
查看原帖
整体二分+线段树 0分求助
419144
luckydrawbox楼主2022/5/15 16:01
#include<bits/stdc++.h>
#define ll long long
#define pl p<<1
#define pr p<<1|1
using namespace std;
long long read(){
    long long x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=6e5+10;
int n,m,k,o[N],w[N];
ll p[N];
struct asdf{
    int l,r;
    ll a;
}s[N];
vector<int>e[N];
int q[N],t,ql[N],tl,qr[N],tr;
struct tree{
    int l,r;
    ll sum,tag;
}g[N<<2];
void pushup(int p){
    g[p].sum=g[pl].sum+g[pr].sum;
}
void pushdown(int p){
    g[pl].sum+=(g[pl].r-g[pl].l+1)*g[p].tag;
    g[pl].tag+=g[p].tag;
    g[pr].sum+=(g[pr].r-g[pr].l+1)*g[p].tag;
    g[pr].tag+=g[p].tag;
    g[p].tag=0;
}
void build(int p,int l,int r){
    g[p].l=l;g[p].r=r;
    if(l==r){
        g[p].sum=g[p].tag=0;
        return;
    }
    int mid=(l+r)>>1;
    build(pl,l,mid);build(pr,mid+1,r);
    pushup(p);
}
void add(int p,int l,int r,long long v){
    if(l<=g[p].l&&g[p].r<=r){
        g[p].tag+=v;
        g[p].sum+=(g[p].r-g[p].l+1)*v;
        return;
    }
    int mid=(g[p].l+g[p].r)>>1;
    pushdown(p);
    if(l<=mid)
        add(pl,l,r,v);
    if(r>mid)
        add(pr,l,r,v);
    pushup(p);
}
ll ask(int p,int l,int r){
    if(l<=g[p].l&&g[p].r<=r)
        return g[p].sum;
    int mid=(g[p].l+g[p].r)>>1;
    pushdown(p);
    ll ans=0;
    if(l<=mid)
        ans+=ask(pl,l,r);
    if(r>mid)
        ans+=ask(pr,l,r);
    return ans;
}
void solve(int l1,int r1,int l2,int r2){//国家l1~r1,操作l2~r2 
    if(l2>r2||l1>r1)
        return;
    if(l2==r2){
        for(int i=l1;i<=r1;i++)
            w[q[i]]=l2;
        return;
    }
    int mid=(l2+r2)>>1;
    tl=tr=0;
    for(int i=l2;i<=mid;i++)
        add(1,s[i].l,s[i].r,s[i].a);
    for(int i=l1;i<=r1;i++){
        ll sum=0;
        for(int j=0;j<e[q[i]].size();j++)
            sum+=ask(1,e[q[i]][j],e[q[i]][j]);
        if(sum>=p[q[i]])
            ql[++tl]=q[i];
        else
            qr[++tr]=q[i],p[q[i]]-=sum;
    }
    for(int i=1;i<=tl;i++)
        q[l1+i-1]=ql[i];
    for(int i=1;i<=tr;i++)
        q[l1+tl+i-1]=qr[i];
    for(int i=l2;i<=mid;i++)
        add(1,s[i].l,s[i].r,-s[i].a);
    solve(l1,l1+tl-1,l2,mid);
    solve(l1+tl,r1,mid+1,r2);
}
int main(){
    n=read();m=read();
    build(1,1,2*m-1);
    for(int i=1;i<=m;i++){
        o[i]=read();
        e[o[i]].push_back(i);
        if(i!=m)
            e[o[i]].push_back(i+m);
    }
    for(int i=1;i<=n;i++)
        p[i]=read(),q[++t]=i;
    k=read();
    for(int i=1;i<=k;i++){
        s[i].l=read();s[i].r=read();s[i].a=read();
        if(s[i].r<s[i].l)
            s[i].r+=m;
    }
    s[++k].l=1;s[k].r=m;
    s[k].a=1e9;
    solve(1,t,1,k);
    for(int i=1;i<=n;i++){
        if(w[i]<k){
            write(w[i]);
            puts("");
        }
        else
            puts("NIE");
    }
    return 0;
}
#include<bits/stdc++.h>
#define ll long long
#define pl p<<1
#define pr p<<1|1
using namespace std;
long long read(){
    long long x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=6e5+10;
int n,m,k,o[N],w[N];
ll p[N];
struct asdf{
    int l,r;
    ll a;
}s[N];
vector<int>e[N];
int q[N],t,ql[N],tl,qr[N],tr;
struct tree{
    int l,r;
    ll sum,tag;
}g[N<<2];
void pushup(int p){
    g[p].sum=g[pl].sum+g[pr].sum;
}
void pushdown(int p){
    g[pl].sum+=(g[pl].r-g[pl].l+1)*g[p].tag;
    g[pl].tag+=g[p].tag;
    g[pr].sum+=(g[pr].r-g[pr].l+1)*g[p].tag;
    g[pr].tag+=g[p].tag;
    g[p].tag=0;
}
void build(int p,int l,int r){
    g[p].l=l;g[p].r=r;
    if(l==r){
        g[p].sum=g[p].tag=0;
        return;
    }
    int mid=(l+r)>>1;
    build(pl,l,mid);build(pr,mid+1,r);
    pushup(p);
}
void add(int p,int l,int r,long long v){
    if(l<=g[p].l&&g[p].r<=r){
        g[p].tag+=v;
        g[p].sum+=(g[p].r-g[p].l+1)*v;
        return;
    }
    int mid=(g[p].l+g[p].r)>>1;
    pushdown(p);
    if(l<=mid)
        add(pl,l,r,v);
    if(r>mid)
        add(pr,l,r,v);
    pushup(p);
}
ll ask(int p,int l,int r){
    if(l<=g[p].l&&g[p].r<=r)
        return g[p].sum;
    int mid=(g[p].l+g[p].r)>>1;
    pushdown(p);
    ll ans=0;
    if(l<=mid)
        ans+=ask(pl,l,r);
    if(r>mid)
        ans+=ask(pr,l,r);
    return ans;
}
void solve(int l1,int r1,int l2,int r2){//国家l1~r1,操作l2~r2 
    if(l2>r2||l1>r1)
        return;
    if(l2==r2){
        for(int i=l1;i<=r1;i++)
            w[q[i]]=l2;
        return;
    }
    int mid=(l2+r2)>>1;
    tl=tr=0;
    for(int i=l2;i<=mid;i++)
        add(1,s[i].l,s[i].r,s[i].a);
    for(int i=l1;i<=r1;i++){
        ll sum=0;
        for(int j=0;j<e[q[i]].size();j++)
            sum+=ask(1,e[q[i]][j],e[q[i]][j]);
        if(sum>=p[q[i]])
            ql[++tl]=q[i];
        else
            qr[++tr]=q[i],p[q[i]]-=sum;
    }
    for(int i=1;i<=tl;i++)
        q[l1+i-1]=ql[i];
    for(int i=1;i<=tr;i++)
        q[l1+tl+i-1]=qr[i];
    for(int i=l2;i<=mid;i++)
        add(1,s[i].l,s[i].r,-s[i].a);
    solve(l1,l1+tl-1,l2,mid);
    solve(l1+tl,r1,mid+1,r2);
}
int main(){
    n=read();m=read();
    build(1,1,2*m-1);
    for(int i=1;i<=m;i++){
        o[i]=read();
        e[o[i]].push_back(i);
        if(i!=m)
            e[o[i]].push_back(i+m);
    }
    for(int i=1;i<=n;i++)
        p[i]=read(),q[++t]=i;
    k=read();
    for(int i=1;i<=k;i++){
        s[i].l=read();s[i].r=read();s[i].a=read();
        if(s[i].r<s[i].l)
            s[i].r+=m;
    }
    s[++k].l=1;s[k].r=m;
    s[k].a=1e9;
    solve(1,t,1,k);
    for(int i=1;i<=n;i++){
        if(w[i]<k){
            write(w[i]);
            puts("");
        }
        else
            puts("NIE");
    }
    return 0;
}
2022/5/15 16:01
加载中...