zoukankan      html  css  js  c++  java
  • CDQ 入门

    推荐博客 : https://blog.csdn.net/wu_tongtong/article/details/78785836

          https://www.cnblogs.com/mlystdcall/p/6219421.html

    其实可以先引一下偏序

    一维偏序 : 给定 n 个数字,求比某一个数字小的个数

      很简单的问题,我们只需要排个序就可以了

    二维偏序 : 给定 n 个二元组(x, y), 求 x1 <= x && y1 <= y 的个数

      我们可以先对所有数的 x 进行排序,对另外一维用一个树状数组去维护就可以了

    三维偏序 : 给定 n 个三元组 (x, y, z) 求 x1 <= x && y1 <= y && z1 <= z 的个数

      我们仍然可以先对所有数的 x 进行排序,对第二个维度用 CDQ 分治, 对第三个维度再用树状数组去维护

      注意,每次使用完树状数组要把树状数组清零 !!!

    基本的CDQ模型是这样的:

    void CDQ(int l, int r){
    	if (l == r) return;
    	
    	int mid = (l+r)>>1;
    	CDQ(l, mid);
    	CDQ(mid+1, r);
    	
    	int p1 = l, p2 = mid+1;
    	int num = 0;
    	for(int i = l; i <= r; i++){
    		if (p1<=mid && (p2 > r || arr[p1].y <= arr[p2].y)){
    			add(arr[p1].z, arr[p1].cnt);
    			f[num++] = arr[p1++];
    		}
    		else {
    			int num2 = query(arr[p2].z);
    			arr[p2].num += num2;
    			f[num++] = arr[p2++];
    		}
    	}
    	
    	num = 0;
    	for(int i = l; i <= r; i++) {
    		if (i <= mid) add(arr[i].z, -arr[i].cnt);
    		arr[i] = f[num++];	
    	} 	
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    pwn1_sctf_2016
    warmup_csaw_2016
    网鼎杯2020 joker逆向
    网鼎杯2020 伪虚拟机wp
    WannaRen病毒逆向分析
    v2ex源代码相关资料
    iOS自学
    ios牛博
    你有什么问题需要问我的吗?
    类族的写法
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/9530321.html
Copyright © 2011-2022 走看看