社区讨论

QWQ cdq+扫描线 WA的死去活来

P4390[BalkanOI 2007] Mokia 摩基亚参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6yj5p7
此快照首次捕获于
2025/11/20 12:54
4 个月前
此快照最后确认于
2025/11/20 12:54
4 个月前
查看原帖
有点wa在了第两千多组询问,不知道怎么调了,求dalao 帮忙调一下QWQ
CPP
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rint register int
#define mid ((l+r)>>1)
using namespace std;

const int maxn=400086;
const int maxm=maxn<<1;

typedef long long ll;
int yy[maxn],n,m,nn,Top;
ll ans[maxn],sum[maxn];

struct node {
    int x1,y1,x2,y2,ops;
}a[maxn];

struct Node {
    int x,y1,y2,ops,pos;
}tmp[maxn];

inline int Read(){
    int x=0;char c=getchar();
    while (!isdigit(c))c=getchar();
    while (isdigit(c)){
        x=(x<<3)+(x<<1)+(c^48);
        c=getchar();
    }
    return x;
} 

inline int cmp(Node x,Node y){return x.x<y.x;}

inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y){for (rint i=x;i<=nn;i+=lowbit(i))sum[i]+=y;}
inline ll query(int x){ll ans=0;for (rint i=x;i;i-=lowbit(i))ans+=sum[i];return ans;}

inline void cdq(int l,int r){
    if (l==r)return ;
    cdq(l,mid);cdq(mid+1,r);
    Top=0;
    for (rint i=l;i<=mid;++i){
        if (a[i].ops==2){
            tmp[++Top].ops=2;
            tmp[Top].x=a[i].x1;
            tmp[Top].y1=a[i].y1;
            tmp[Top].y2=a[i].y2;
        }
    }
    for (rint i=mid+1;i<=r;++i){
        if (a[i].ops!=2){
            tmp[++Top].ops=-1;
            tmp[Top].x=a[i].x1-1;
            tmp[Top].y1=a[i].y1;
            tmp[Top].y2=a[i].y2;		
            tmp[Top].pos=i;
            tmp[++Top].ops=1;
            tmp[Top].x=a[i].x2;
            tmp[Top].y1=a[i].y1;
            tmp[Top].y2=a[i].y2;		
            tmp[Top].pos=i;	
        }
    }
    sort(tmp+1,tmp+1+Top,cmp);
    for (rint i=1;i<=Top;++i){
        if (tmp[i].ops==2){
            add(tmp[i].y1,tmp[i].y2);
        }
        else {
            ans[tmp[i].pos]+=(tmp[i].ops*(query(tmp[i].y2)-query(tmp[i].y1-1)));
        }
    }
    for (rint i=1;i<=Top;++i)
        if (tmp[i].ops==2)
            add(tmp[i].y1,-tmp[i].y2);
}

int main(){
    nn=Read(),nn=Read();nn=0;
    while (1){
        int tadyz_xz_sm=Read();
        if (tadyz_xz_sm==3)break;
        if (tadyz_xz_sm==2){
            a[++n].x1=Read(),a[n].y1=Read(),a[n].x2=Read(),a[n].y2=Read(),a[n].ops=1;
            yy[++nn]=a[n].y1,yy[++nn]=a[n].y2;
        }
        else {
            a[++n].x1=Read(),a[n].y1=Read(),a[n].y2=Read(),a[n].ops=2;yy[++nn]=a[n].y1;
        }
    }
    
    sort(yy+1,yy+1+nn);
    nn=unique(yy+1,yy+1+nn)-yy-1;
    
    for (rint i=1;i<=n;++i){
        a[i].y1=lower_bound(yy+1,yy+1+nn,a[i].y1)-yy;
        if (a[i].ops!=2){
            a[i].y2=lower_bound(yy+1,yy+1+nn,a[i].y2)-yy;		
        }
    }
    
    cdq(1,n);
    
    for (rint i=1;i<=n;++i){
        if (a[i].ops!=2)printf("%lld\n",ans[i]);
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...