BZOJ 2683: 简单题 [CDQ分治]

news/2024/7/4 1:40:12

同上题

那你为什么又发一个?

因为我用另一种写法又写了一遍...

不用排序,$CDQ$分治的时候归并排序

快了1000ms...

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=1e6+5;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int n,op,m;
struct Operation{
    int x,y,v,id;
    int qid,op;
    Operation():op(0){}
    Operation(int x,int y,int v,int id,int qid,int op):
        x(x),y(y),v(v),id(id),qid(qid),op(op){}
    bool operator <(const Operation &r)const{
        return x==r.x?op<r.op:x<r.x;
    }
}a[N],t[N];
int ans[N],qid;
void devideQuery(){
    int x1=read()-1,y1=read()-1,x2=read(),y2=read();
    qid++;
    m++;a[m]=Operation(x2,y2,1,m,qid,1);
    m++;a[m]=Operation(x1,y2,-1,m,qid,1);
    m++;a[m]=Operation(x2,y1,-1,m,qid,1);
    m++;a[m]=Operation(x1,y1,1,m,qid,1);
}
int c[N];
inline int lowbit(int x){return x&-x;}
inline void add(int p,int v){for(;p<=n;p+=lowbit(p)) c[p]+=v;}
inline int sum(int p){
    int re=0;
    for(;p;p-=lowbit(p)) re+=c[p];
    return re;
}
void CDQ(int l,int r){
    if(l==r) return;
    int mid=(l+r)>>1;
    CDQ(l,mid);CDQ(mid+1,r);
    int i=l,j=mid+1,p=l;
    while(i<=mid||j<=r){
        if(j>r||(i<=mid&&a[i]<a[j])){
            if(!a[i].op) add(a[i].y,a[i].v);
            t[p++]=a[i++];
        }else{
            if(a[j].op) ans[a[j].qid]+=a[j].v*sum(a[j].y);
            t[p++]=a[j++];
        }
    }
    for(int i=l;i<=r;i++) if(a[i].id<=mid&&!a[i].op) add(a[i].y,-a[i].v);
    for(int i=l;i<=r;i++) a[i]=t[i];
}
int main(){
    freopen("in","r",stdin);
    n=read();
    m=0;
    while(true){
        op=read();
        if(op==1) a[++m].x=read(),a[m].y=read(),a[m].v=read(),a[m].id=m;
        else if(op==2) devideQuery();
        else break;
    }
    CDQ(1,m);
    for(int i=1;i<=qid;i++) printf("%d\n",ans[i]);
}

 


http://www.niftyadmin.cn/n/1748426.html

相关文章

CMFCShellList和自定义ShellList结合使用,达到“直接浏览缩略图,双击打开图片”...

在GOPaint的设计研究过程中&#xff0c;我一直希望能够实现这样的结果&#xff08;A B C 3个步骤)在我之前的博客里面&#xff0c;曾经有过缩略图显示的现就(http://www.cnblogs.com/jsxyhelu/p/5493329.html ),也应用到了实际的项目中。但是现在过了一段时间后回头再看&…

利用mybatis-generator自动生成代码

2019独角兽企业重金招聘Python工程师标准>>> 1、准备生成代码需要的文件和jar包&#xff08;下载地址&#xff09; 2、配置generatorConfig.xml文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC …

arm linux 从入口到start_kernel 代码分析——head.S分析——7end

arm linux 从入口到start_kernel 代码分析 - 7(end) (2008-07-30 16:08:30) 转载标签&#xff1a; it 分类&#xff1a;kernel 6. 切换数据 在 arch/arm/kernel/head-common.S 中: 00014: .type __switch_data, %object00015: __switch_data:00016: .long __mmap_switched000…

阿里云跨服务器文件拷贝

使用scp命令&#xff1a; 1、将当前一个文件copy到远程另外一台主机上&#xff1a; scp /home/daisy/full.tar.gz root远程ip:/home/root2、将文件从远程主机copy到当前系统上&#xff1a; scp root/full.tar.gz 远程ip:/home/root/full.tar.gz home/daisy/full.tar.gz尝试用ce…

基础算法----找出集合中和值为指定值的两个数

2019独角兽企业重金招聘Python工程师标准>>> 思想 假定集合为有序集合&#xff0c;对于有序集合来说&#xff0c;和值大于指定值则后位前移&#xff0c;否则则前位后移&#xff1b; 实现 int[] arr { 1, 3, 5, 7, 9, 15 }; // 找出和值为10的数static void find…

MyEclipse自动生成注释,编辑默认注释模板

自动生成方法注释&#xff1a;写完方法后&#xff0c;在该方法上方输入/**后&#xff0c;按下回车键&#xff0c;会自动生成该方法注释。/*** * param uid* return*/public Map<String, String> getSysUserId(String uid) {}编辑默认注释模板&#xff1a;1.类注释&#x…

在实践中深入理解VMware虚拟机的上网模式:桥接模式

0.说明本篇博文为《在实践中深入理解VMware虚拟机的上网模式》系列的其中一篇&#xff1a;NAT模式。有关于深入理解VMware虚拟机的上网模式的意义&#xff0c;可以参考本系列博文的另一篇《在实践中深入理解VMware虚拟机的上网模式&#xff1a;NAT模式》中的说明部分&#xff0…

linux内核启动过程——zImage自解压

linux内核启动过程——基于S3C2410(1)zImage自解压 linux内核启动过程——基于S3C2410 &#xff08;1&#xff09;zImage自解压 本文以流行的Samsung公司的S3C2410&#xff0c;mini2440平台和linux-2.6.29为例&#xff0c;介绍如何在ZIX嵌入式开发环境下探索linux内核启动过程…