求助,扫描线 TLE
查看原帖
求助,扫描线 TLE
231600
zhangboju楼主2021/3/14 11:13
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,mx;
#define y1 y11
#define y2 y22
// #define int long long
#define ll long long
struct node{
    int x,y,w,id,op;
    bool operator < (const node &b) const
    {
        if(x!=b.x) return x<b.x;
        return id<b.id;
    }
    void print()
    {
        cout<<x<<' '<<y<<" "<<w<<" "<<id<<" "<<op<<endl;
    }
}a[N*6];
struct Q{
    int x1,y1,x2,y2;
}q[N];
vector<int>x,y;
inline void ch(int &x,vector<int>ve)
{
    x=lower_bound(ve.begin(),ve.end(),x)-ve.begin()+2;
}
int k;
ll ans[N];
ll c[N*4];
inline int lowbit(int x)
{
    return x&(-x);
}
inline void add(int x,int y)
{
    for(int i=x;i<=mx;i+=lowbit(i)) c[i]+=y;
}
inline ll query(int x)
{
    ll res=0;
    for(int i=x;i;i-=lowbit(i)) res+=c[i];
    return res;
}
signed main()
{ 
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);a[i].id=0;
        x.push_back(a[i].x),y.push_back(a[i].y);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2);
        x.push_back(q[i].x1),x.push_back(q[i].x2);
        y.push_back(q[i].y1),y.push_back(q[i].y2);
    }
    sort(x.begin(),x.end()),sort(y.begin(),y.end());
    x.erase(unique(x.begin(),x.end()),x.end());
    y.erase(unique(y.begin(),y.end()),y.end());
    mx=2*(x.size()+y.size())+2;
    // cout<<mx<<endl;
    for(int i=1;i<=n;i++) ch(a[i].x,x),ch(a[i].y,y);
    for(int i=1;i<=m;i++) ch(q[i].x1,x),ch(q[i].y1,y),ch(q[i].x2,x),ch(q[i].y2,y);
    k=n;
    for(int i=1;i<=m;i++) a[++k]={q[i].x1-1,q[i].y1-1,0,i,1},a[++k]={q[i].x2,q[i].y2,0,i,1},a[++k]={q[i].x2,q[i].y1-1,0,i,-1},a[++k]={q[i].x1-1,q[i].y2,0,i,-1};
    // cout<<k<<endl;
    sort(a+1,a+k+1);
    for(int i=1;i<=k;i++)
    {
        node &t=a[i];
        if(t.op==0) add(t.y,t.w);
        else 
        {
            // t.print();
            ans[t.id]+=t.op*query(t.y);
            // cout<<ans[t.id]<<endl;
        }
    }
    for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
}

感觉是一个 log\log 的,不知道为什么 T 翻了

救救孩子

2021/3/14 11:13
加载中...