只过特殊性质和hack求诊断
查看原帖
只过特殊性质和hack求诊断
521283
wangif424楼主2024/11/28 09:21
#include <bits/stdc++.h>
#define R(x) x = read()
#define int long long
#define double long double
#define pii pair<int,int>
#define iax INT_MAX
#define iin INT_MIN
#define lax LLONG_MAX
#define lin LLONG_MIN
#define sqrt sqrtl
bool Mbe;
using namespace std;
char pbuf[1<<20], *pp=pbuf;
inline void push(const char &c){(pp-pbuf==1<<20)?fwrite(pbuf,1,1<<20,stdout),pp=pbuf,*pp++=c:*pp++=c;}
class io {public:~io() {fwrite(pbuf, 1, pp - pbuf, stdout);}} _;
inline void write(int x) {
    x<0&&(push('-'),x=-x);
    static int sta[60]={},top=0;
    do{sta[top++]=x%10,x/=10;}while(x);
    while(top)push(sta[--top]^'0');
}
#ifndef LOCAL
    char buf[1<<23],*p1=buf,*p2=buf;
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
inline int read() {
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){ch=='-'&&(f=-1);ch=getchar();}
    while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
    return x*f;
}
int c;
constexpr int N=1e5+100;
int n,m,q;
struct line{
    int x1,x2,y,tp;
}e[N<<1];
pair<pii,int>h[N];
pair<int,pii>d[N];
int lh,ld;
int l;
pair<pii,pii> p[6];
int a[N<<2];
struct node{
    int ls,rs,s,len;
}t[N<<2];
int siz=1;
void build(int i,int l,int r){
    if(l^r){
        int mid=(l+r)>>1;t[i].ls=++siz;
        build(siz,l,mid);t[i].rs=++siz;
        build(siz,mid+1,r);
    }
}
void add(int i,int l,int r,int ll,int rr,int k){
    if(ll<=l&&r<=rr){
        t[i].s+=k*(r-l+1);
    }else{
        int mid=(l+r)>>1;
        if(ll<=mid)add(t[i].ls,l,mid,ll,rr,k);
        if(rr>mid) add(t[i].rs,mid+1,r,ll,rr,k);
    }
    if(t[i].s){
        // cerr << i << ' ' << l << ' ' << r << '\n';
        t[i].len=a[r+1]-a[l];
    }else t[i].len=t[t[i].ls].len+t[t[i].rs].len;
    // cerr <<  ':' << l << ' ' << r << ' ' << t[i].len << ' ' << t[i].s << '\n';
}
int f(pair<pii,pii> a){
    return a.first.first-a.first.second;
}
bool Med;
signed main(){
#ifndef LOCAL
#else
    cerr << (&Med-&Mbe)/1024.0/1024 << "MB\n";
#endif
    R(c);
    R(n);R(m);R(q);
    m=n=0;
    for(int i=1;i<=q;i++){
        int R(t),R(x1),R(y1),R(x2),R(y2);
        a[++n]=x1;
        a[++n]=x2;
        a[++n]=x1+1;
        a[++n]=x2+1;
        if(t<=2)e[++m]={x1,x2,y1,1},e[++m]={x1,x2,y2+1,-1};
        else p[++l]={{x1,y1},{x2,y2}};
        if(t==1)h[++lh]={{x1,x2},y1};
        if(t==2)d[++ld]={x1,{y1,y2}};
    }
    sort(a+1,a+1+n);
    n=unique(a+1,a+1+n)-a-1;
    for(int i=1;i<=m;i++){
        e[i].x1=lower_bound(a+1,a+1+n,e[i].x1)-a;
        e[i].x2=lower_bound(a+1,a+1+n,e[i].x2)-a;
    }
    int ans=0;
    sort(e+1,e+1+m,[](line x,line y){return x.y<y.y;});
    build(1,1,n);
    for(int i=1;i<=m;i++){
        ans+=t[1].len*(e[i].y-e[i-1].y);
        // cerr << e[i].y-e[i-1].y << ' ' << t[1].len << ' ' << e[i].x1 << ' ' << e[i].x2 << ' ' << '\n';
        add(1,1,n,e[i].x1,e[i].x2,e[i].tp);
    }
    set<pii> s;
    for(int _=1;_<=l;_++){
        pii p1,p2;
        tie(p1,p2)=p[_];
        int x1,x2,y1,y2;
        tie(x1,y1)=p1;
        tie(x2,y2)=p2;
        ans+=x2-x1+1;
        for(int i=1;i<=lh;i++){
            int l,r;
            tie(l,r)=h[i].first;
            int y=h[i].second;
            if(y1<=y&&y<=y2){
                int del=y-y1;
                int x=x1+del;
                if(l<=x&&x<=r&&x1<=x&&x<=x2){
                    s.emplace(x,y);
                }
            }
        }
        for(int i=1;i<=ld;i++){
            int l,r;
            tie(l,r)=d[i].second;
            int x=d[i].first;
            if(x1<=x&&x<=x2){
                int del=x-x1;
                int y=y1+del;
                if(l<=y&&y<=r&&y1<=y&&y<=y2){
                    s.emplace(x,y);
                }
            }
        }
    }
    ans-=s.size();
    write(ans);
    return 0;
}

答案偏大,可能是斜线和横竖线的交点有遗漏

2024/11/28 09:21
加载中...