GFS打算去郊外建所别墅,享受生活,于是他耗费巨资买下了一块风水宝地,但令他震惊的是,一群DSJ对GFS的富贵生活深恶痛绝,决定打洞以搞破坏。

现在我们简化一下这个问题,在这片土地上会按顺序发生一系列事件。

①一只DSJ在(x,y) 这个点打了一个洞。

②有着高雅品味GFS想建一个等腰直角三角形的别墅,即由(x,y) ,(x+d,y) ,(x,y+d) 三点围成的三角形,但为了地基的牢固,他想知道当前这块三角形土地内的洞的个数。

GFS现在对DSJ已经忍无可忍了,请你帮他回答这些询问。

初始土地上没有洞。GFS毕竟是GFS,你可以认为土地无限大。

這道題是四維偏序問題

我們考慮一下什麼時候一個洞(a,b)會對一次查詢(x,y,d)產生影響

則有x<=a<=x+d,y<=b<=y+d,x+y<=a+b<=x+y+d這三種條件

將(時間,a,b,a+b)看做平面上的一個點,這樣問題就轉換為了3維查詢

每一個查詢操作查詢空間內滿足x<=a<=x+d,y<=b<=y+d,a+b<=x+y+d的(a,b,a+b)

這個可以直接4維偏序

我們可以考慮將a+b這一維在cdq1中排序,因為a+b這一維沒有任何左邊界限制

這樣,我們就可以知道,我們在這一維cdq中將其排序過後,左右兩邊的a+b值都是有序的

我們再次遞歸下一層的cdq2,在cdq2中將區間[l,mid]和[mid+1,r]中的x值從小到大排序一遍

這樣子會將x值都排序一遍,a+b值會變亂

但是左邊的a+b值還是大於x值,所以還是可以使用左邊的更新右邊的值

這樣子還是3維偏序問題,要拆成4個詢問,會tle,需要優化

然而這道題中,我們因為已經在cdq1中將a+b排序了,所以我們可以保證,接下來序列中從左邊取出來的x值最小的修改操作,這個操作的x+y值會恆小於所有後來的查詢操作

所以,這個修改操作可以用來影響後面的查詢操作

由於a+b<=x+y+d這個條件,等價于a<=x+d且b<=y,也等價于b<=y+d 且a<=x,所以我們只需要查詢x<=a且y<=b的數對即可

這個數對怎麼求?

首先我們可以將x值排一遍序

將所有的左邊修改操作,右邊的查詢操作放進2個數組中

每次,掃描所有右邊的查詢操作,維護一個指針p,初始值為第二個數組的元素個數

當現在循環的查詢操作的x小於現在p指向的元素的x時,則現在p指向的元素可能會對現在的查詢操作有影響,所以可以將其y值加進樹狀數組,通過while不斷的添加,直到不滿足條件為止

然後,我們可以知道,在循環過後,所有數組內1-p的元素的x值都小於現在的x值,不可能對現在的答案產生任何影響

所以只有樹狀數組內的所有元素才會對現在的答案產生影響

但是,所有元素都不一定會對現在的答案產生影響

只有y值比現在詢問的值大的元素才會對現在的答案產生影響

所以,我們可以使用樹狀數組維護這個答案

這樣子,我們就成功的解決了本題

注意事項:必須將y+1,因為bits遇到y=0的情況下會死循環!!!!!!!!

cdq分治要寫成l>=r

代碼:

#include<bits/stdc++.h>
using namespace std;
struct no{
    int a,b,c,p;
}q[100010],a[100010],b[100010],c[100010];
int n,x,y,d,t[10000000],mx,ct,v,ans[100010];
bool cp1(no x,no y){return x.c<y.c||x.c==y.c&&x.p<y.p;}
bool cp2(no x,no y){return x.a<y.a;}
void add(int x,int y){for(;x<=mx;x+=x&-x)t[x]+=y;v+=y;}
int qu(int x){int r=v;for(;x;x-=x&-x)r-=t[x];return r;}
void cdq2(int l,int r){
    if(l>=r)return;
    int c1=0,c2=0,mid=(l+r)/2;
    cdq2(l,mid);cdq2(mid+1,r);
    for(int i=l;i<=mid;i++)
        if(!a[i].p)b[++c1]=a[i];
    for(int i=mid+1;i<=r;i++)
        if(a[i].p)c[++c2]=a[i];
    sort(b+1,b+c1+1,cp2);sort(c+1,c+c2+1,cp2);
    int p=c1+1;
    for(int i=c2;i>=1;i--){
        while(p>1&&b[p-1].a>=c[i].a){
            p--;
            add(b[p].b,1);
        }
        ans[c[i].p]+=qu(c[i].b-1);
    }
    for(int i=p;i<=c1;i++)
        add(b[i].b,-1);
}
void cdq1(int l,int r){
    if(l>=r)return;
    int c1=0,mid=(l+r)/2;
    cdq1(l,mid);cdq1(mid+1,r);
    for(int i=l;i<=mid;i++)
        if(!q[i].p)a[++c1]=q[i];
    for(int i=mid+1;i<=r;i++)
        if(q[i].p)a[++c1]=q[i];
    sort(a+1,a+c1+1,cp1);
    cdq2(1,c1);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&x,&y,&d);
        q[i].a=x;q[i].b=y;q[i].c=x+y+d;
        q[i].b++;
        mx=max(mx,y+d);
        if(d)q[i].p=++ct;
    }
    cdq1(1,n);
    for(int i=1;i<=ct;i++)
        printf("%d\n",ans[i]);
    printf("\n");
}

jzoj4419的更多相关文章

随机推荐

  1. Django之XSS攻击

    一.什么是XSS攻击 xss攻击:----->web注入    xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称 ...

  2. 利用ks构建ISO中的一些坑

    构建ISO的基本流程 1.获取rpm包源码 2.将源码增量编译成二进制包 3.编写ks的包列表决定ISO制作时需要从什么地方(二进制仓库repo)取哪些二进制包 4.通过createiso命令并指定k ...

  3. 模板练习(LUOGU)

    1:并查集 P3183食物链 #define man 300050 ; int find(int x){ if(fa[x]==x) return fa[x]; return fa[x]=find(fa ...

  4. pyspider示例代码七:自动登陆并获得PDF文件下载地址

    自动登陆并获得PDF文件下载地址 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: pdf_sp ...

  5. 2018.08.28 集合堆栈机(模拟+STL)

    描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...

  6. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  7. redis与ssm整合(用 redis 替代mybatis二级缓存)

    SSM+redis整合 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存在就会新建缓存,所有的insert,update操作都 ...

  8. lpm_clshift ip仿真

    今天仿真了一下lpm_clshift ip 其中din为输入的信号,sh_out为输出的信号. 以上为IP的设置. 可以看到din 的00000010 对应的step的2,一个时钟后sh_out的输出 ...

  9. 百度上传插件(webupload)单文件(单图片)上传设置

    var uploader = WebUploader.create({                 //auto : true,                 swf : '${ctx}/sta ...

  10. PAT甲 1048. Find Coins (25) 2016-09-09 23:15 29人阅读 评论(0) 收藏

    1048. Find Coins (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva loves t ...