• BZOJ 1176 MOKIA


    cdq分治。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 2000500
    #define maxq 400050
    using namespace std;
    int s,w,type,a,b,c,d,cnt=0,m=0,ans[maxq];
    struct ques
    {
        int val,opt,x,y,pos,id;
    }q[maxq],tmp[maxq];
    int t[maxn];
    bool cmp(ques a,ques b)
    {
        if ((a.x==b.x) && (a.y==b.y)) return a.opt<b.opt;
        if (a.x==b.x) return a.y<b.y;
        return a.x<b.x;
    }
    int lowbit(int x)
    {
        return (x&(-x));
    }
    void add1(int x)
    {
        scanf("%d%d%d",&a,&b,&c);
        q[++m].id=m;q[m].pos=0;q[m].val=c;q[m].opt=0;
        q[m].x=a;q[m].y=b;
    }
    void add2(int x)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        cnt++;
        q[++m].val=1;q[m].opt=1;q[m].x=c;q[m].y=d;q[m].pos=cnt;q[m].id=m;
        q[++m].val=1;q[m].opt=1;q[m].x=a-1;q[m].y=b-1;q[m].pos=cnt;q[m].id=m;
        q[++m].val=-1;q[m].opt=1;q[m].x=a-1;q[m].y=d;q[m].pos=cnt;q[m].id=m;
        q[++m].val=-1;q[m].opt=1;q[m].x=c;q[m].y=b-1;q[m].pos=cnt;q[m].id=m;
    }
    void add(int x,int val)
    {
        for (int i=x;i<=w;i+=lowbit(i))
            t[i]+=val;
    }
    int query(int x)
    {
        int ret=0;
        for (int i=x;i>=1;i-=lowbit(i))
            ret+=t[i];
        return ret;
    }
    void cdq(int left,int right)
    {
        if (left==right) return;
        int mid=left+right>>1;
        int l1=left,l2=mid+1;
        for (int i=left;i<=right;i++)
        {
            if ((q[i].id<=mid) && (!q[i].opt)) add(q[i].y,q[i].val);
            else if ((q[i].id>mid) && (q[i].opt)) ans[q[i].pos]+=q[i].val*query(q[i].y);
        }
        for (int i=left;i<=right;i++)
            if ((q[i].id<=mid) && (!q[i].opt)) add(q[i].y,-q[i].val);
        for (int i=left;i<=right;i++)
        {
            if (q[i].id<=mid) tmp[l1++]=q[i];
            else tmp[l2++]=q[i];
        }
        for (int i=left;i<=right;i++)
            q[i]=tmp[i];
        cdq(left,mid);cdq(mid+1,right);
    }
    int main()
    {
        scanf("%d%d",&s,&w);
        while (scanf("%d",&type)!=EOF)
        {
            if (type==3) break;
            if (type==1) add1(cnt);
            else add2(cnt);
        }
        sort(q+1,q+m+1,cmp);
        cdq(1,m);
        for (int i=1;i<=cnt;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    P3386 【模板】二分图最大匹配 题解(匈牙利算法)
    B. Repetitions Decoding 题解(思维+构造)
    D. Big Brush 题解(构造+bfs)
    软件使用 蓝湖的基础使用
    破解版navicate数据库 15版本
    大腕web2.0版
    JPA(JPQL)批量操作的示例及真实执行逻辑
    Java线程池的使用示例及注意事项
    解决docker开启端口映射后,会直接穿透本机防火墙的问题
    PostgreSQL用户访问多个schema及其他常用命令
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5867918.html
Copyright © 2020-2023  润新知