题意:给定n*m的网格,且给出n个(x,y)表示该网格已被占有,q次询问(x1,y1)到(x2,y2)的网格中有多少个被占有,n,m范围1e7,q范围5e5

cdq按x轴排序,树状数组维护y轴

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define erep(i,u) for(int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 2.5e6+11;
const int MAXM = 1e7+11;
const int MOD = 1e9+7;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int MAXV;
struct QUERY{
int x,y,val,type;
bool operator < (const QUERY &rhs) const{
if(x!=rhs.x) return x<rhs.x;
return abs(type)<abs(rhs.type);
}
}Q[MAXN],tmp[MAXN];
QUERY node(int _x,int _y,int _v,int _t){
QUERY q;
q.x=_x;q.y=_y;q.val=_v;q.type=_t;
return q;
}
int ans[MAXN];
struct FT{
int ft[MAXN];
inline int lowbit(int x){return x&-x;}
void add(int k,int v){
while(k<=MAXV){
ft[k]+=v;
k+=lowbit(k);
}
}
int query(int k){
int res=0;
while(k>0){
res+=ft[k];
k-=lowbit(k);
}
return res;
}
void clear(int k){
while(k<=MAXV){
if(ft[k]){
ft[k]=0;
}else{
break;
}
k+=lowbit(k);
}
}
void init(){
memset(ft,0,sizeof ft);
}
}ft;
void solve(int l,int r){
if(l==r) return;
int mid=l+r>>1;
solve(l,mid);
solve(mid+1,r);
int cnt=0,p=l,q=mid+1;
while(p<=mid&&q<=r){
if(Q[p]<Q[q]){
if(Q[p].type==0) ft.add(Q[p].y,1);
tmp[++cnt]=Q[p++];
}else{
// if(Q[q].type==-1) sum-=ft.sum(Q[q].y);
if(Q[q].type==-1) ans[Q[q].val]-=ft.query(Q[q].y);
if(Q[q].type==1) ans[Q[q].val]+=ft.query(Q[q].y);
tmp[++cnt]=Q[q++];
}
}
while(p<=mid) tmp[++cnt]=Q[p++];
while(q<=r){
if(Q[q].type==-1) ans[Q[q].val]-=ft.query(Q[q].y);
if(Q[q].type==1) ans[Q[q].val]+=ft.query(Q[q].y);
tmp[++cnt]=Q[q++];
}
rep(i,1,cnt) Q[i+l-1]=tmp[i];
rep(i,1,cnt) ft.clear(tmp[i].y);
}
int main(){
int n,m;
while(cin>>n>>m){
int cnt=0,ansid=0;
MAXV=0;
ft.init(); memset(ans,0,sizeof ans);
rep(i,1,n){
int x=read()+1;
int y=read()+1; MAXV=max(MAXV,y);
Q[++cnt]=node(x,y,0,0);
}
rep(i,1,m){
int x_1=read()+1;
int y_1=read()+1;
int x_2=read()+1;
int y_2=read()+1;
Q[++cnt]=node(x_1-1,y_1-1,++ansid,1);
Q[++cnt]=node(x_2,y_1-1,ansid,-1);
Q[++cnt]=node(x_1-1,y_2,ansid,-1);
Q[++cnt]=node(x_2,y_2,ansid,1);
MAXV=max(MAXV,y_1);
MAXV=max(MAXV,y_2);
}
solve(1,cnt);
rep(i,1,ansid) println(ans[i]);
}
return 0;
}

同款题目,1176多了矩阵初始值和不同的加权

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define erep(i,u) for(int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 2.5e6+11;
const int MOD = 1e9+7;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int MAXV;
struct QUERY{
int x,y,val,type;
bool operator < (const QUERY &rhs) const{
if(x!=rhs.x) return x<rhs.x;
return abs(type)<abs(rhs.type);
}
}Q[MAXN],tmp[MAXN];
QUERY node(int _x,int _y,int _v,int _t){
QUERY q;
q.x=_x;q.y=_y;q.val=_v;q.type=_t;
return q;
}
int ans[MAXN],S,W;
struct FT{
ll ft[MAXN];
inline int lowbit(int x){return x&-x;}
void add(int k,int v){
while(k<=MAXV){
ft[k]+=v;
k+=lowbit(k);
}
}
int query(int k){
int res=0;
while(k>0){
res+=ft[k];
k-=lowbit(k);
}
return res;
}
void clear(int k){
while(k<=MAXV){
if(ft[k]){
ft[k]=0;
}else{
break;
}
k+=lowbit(k);
}
}
void init(){
memset(ft,0,sizeof ft);
}
}ft;
void solve(int l,int r){
if(l==r) return;
int mid=l+r>>1;
solve(l,mid);
solve(mid+1,r);
int cnt=0,p=l,q=mid+1;
while(p<=mid&&q<=r){
if(Q[p]<Q[q]){
if(Q[p].type==0) ft.add(Q[p].y,Q[p].val);
tmp[++cnt]=Q[p++];
}else{
// if(Q[q].type==-1) sum-=ft.sum(Q[q].y);
if(Q[q].type==-1) ans[Q[q].val]-=ft.query(Q[q].y);
if(Q[q].type==1) ans[Q[q].val]+=ft.query(Q[q].y);
tmp[++cnt]=Q[q++];
}
}
while(p<=mid) tmp[++cnt]=Q[p++];
while(q<=r){
if(Q[q].type==-1) ans[Q[q].val]-=ft.query(Q[q].y);
if(Q[q].type==1) ans[Q[q].val]+=ft.query(Q[q].y);
tmp[++cnt]=Q[q++];
}
rep(i,1,cnt) Q[i+l-1]=tmp[i];
rep(i,1,cnt) ft.clear(tmp[i].y);
}
int xiuzheng[MAXN][2];
int main(){
while(cin>>S>>W){
int cnt=0,ansid=0;
MAXV=0;
ft.init(); memset(ans,0,sizeof ans);
while(1){
int op=read();
if(op==1){
int x=read()+1;
int y=read()+1; MAXV=max(MAXV,y);
Q[++cnt]=node(x,y,read(),0);
}else if(op==2){
int x_1=read()+1;
int y_1=read()+1;
int x_2=read()+1;
int y_2=read()+1;
Q[++cnt]=node(x_1-1,y_1-1,++ansid,1);
Q[++cnt]=node(x_2,y_1-1,ansid,-1);
Q[++cnt]=node(x_1-1,y_2,ansid,-1);
Q[++cnt]=node(x_2,y_2,ansid,1);
xiuzheng[ansid][0]=x_2-x_1+1;
xiuzheng[ansid][1]=y_2-y_1+1;
MAXV=max(MAXV,y_1);
MAXV=max(MAXV,y_2);
}else break;
}
solve(1,cnt);
rep(i,1,ansid) println(ans[i]+xiuzheng[i][0]*xiuzheng[i][1]*S);
}
return 0;
}

BZOJ - 1935 / 1176 cdq分治 三维偏序的更多相关文章

  1. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  2. BZOJ 2244: [SDOI2011]拦截导弹 (CDQ分治 三维偏序 DP)

    题意 略- 分析 就是求最长不上升子序列,坐标取一下反就是求最长不下降子序列,比较大小是二维(h,v)(h,v)(h,v)的比较.我们不看概率,先看第一问怎么求最长不降子序列.设f[i]f[i]f[i ...

  3. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

  4. 【算法】CDQ分治 -- 三维偏序 & 动态逆序对

    初次接触CDQ分治,感觉真的挺厉害的.整体思路即分而治之,再用之前处理出来的答案统计之后的答案. 大概流程是(对于区间 l ~ r): 1.处理 l ~mid, mid + 1 ~ r 的答案: 2. ...

  5. NEUOJ 1702:撩妹全靠魅力值(CDQ分治三维偏序)

    http://acm.neu.edu.cn/hustoj/problem.php?id=1702 思路:三维偏序模板题,用CDQ分治+树状数组或者树套树.对于三元组(x,y,z),先对x进行排序,然后 ...

  6. cdq分治·三维偏序问题

    转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...

  7. CDQ分治 三维偏序

    这应该是一道CDQ分治的入门题目 我们知道,二维度的偏序问题直接通过,树状数组就可以实现了,但是三维如何实现呢? 我记得以前了解过一个小故事,应该就是分治的. 一个皇帝,想给部下分配任务,但是部下太多 ...

  8. BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)

    题目链接 矩形查询可以拆成四个点的前缀和查询(树套树显然 但是空间不够) 每个操作表示为(t,x,y),t默认有序,对x分治,y用树状数组维护 初始赋值需要靠修改操作实现. //119964kb 43 ...

  9. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

随机推荐

  1. char a[] = "hello world1"和char *p = "hello world2";的区别(转)

    转自:jianchi88 http://blog.csdn.net/jianchi88/article/details/6876405 #include<stdio.h> int main ...

  2. CRISPR/Cas9基因敲除原理及实验建议

    CRISPR/Cas9基因敲除原理及实验建议   CRISPR Cas9已经成为了最受欢迎的基因编辑技术之一,在2016年的国自然基金中也有很多项目是关于 CRISPR Cas9的.目前在市场上已经有 ...

  3. Vmware下CentOs7 桥接模式下配置固定IP

    1.安装完CentOS7后 修改虚拟机网络适配器配置:改成桥接模式 2.设置Vmware的 编辑->虚拟网络编辑器 3.重启CentOs7 , 查看网络 # ip addr interface是 ...

  4. [GO]空接口

    package main import "fmt" //空接口的实际意义就在于在使用函数时,空接口可以接收任意类型的值,类似于python中的*args, **kwargs fun ...

  5. mysql:unknown variable 'default -collation=utf8_general_ci'

    无法登陆,因为在配置文档中设置了默认编码方式 将它注释掉,问题就解决了 在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.utf8_gener ...

  6. 编写高质量代码改善C#程序的157个建议——建议135: 考虑使用肯定性的短语命名布尔属性

    建议135: 考虑使用肯定性的短语命名布尔属性 布尔值无非就是True和False,所以应该用肯定性的短语来表示它,例如,以Is.Can.Has作为前缀. 布尔属性正确命名的一个示例如下: class ...

  7. 12306GT多线程、分流免费抢票工具使用心德

    大事记背景 我相信很多远游他乡的朋友每逢佳节都会遇到一个难题,就是购票难,这个难题有多难呢?经常在12306官网购票的小伙伴应该知道每个地方的放票时间是不一样的,但是逢年过节的那几天即使你在放票几分钟 ...

  8. (二)ASP.NET中JavaScript的中英文(多语言)实现方案(二)

    在ASP.NET中JavaScript的中英文(多语言)实现方案中简单的介绍了js实现多语言的一种方案.下面将要讲述另外一种方法,尽管很相似,但是有些地方也是需要细细琢磨的,不说了,先看看. 在Lan ...

  9. SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  10. Acrobat_8_Pro_SC 激活老是提示你输入的授权码无效

    假如安装了Adobe Acrobat Professional 8 的时候无法激活, 或在恢复安装时 Adobe Acrobat Professional 8 需要重新激活, 激活的时候,总是提示你输 ...