当前位置: 首页 > news >正文

BZOJ3236:[AHOI2013]作业(莫队,分块)

Description

Input

Output

Sample Input

3 4
1 2 2
1 2 1 3
1 2 1 1
1 3 1 3
2 3 2 3

Sample Output

2 2
1 1
3 2
2 1

HINT

N=100000,M=1000000

Solution

首先有一个比较显然的做法就是用莫队加树状数组……然而这样的话复杂度是$n\sqrt nlog$。

因为树状数组的修改和查询都是$log$的,所以我们用一个修改$O(1)$,查询$O(\sqrt n)$的分块代替树状数组,那么总的复杂度就是$n\sqrt n$了。

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define N (100009)
 7 #define M (1000009)
 8 #define S (359)
 9 using namespace std;
10 
11 int n,m,a[N],l,r,x,y,ans2,Keg[N],q_num;
12 int ID[N],L[S],R[S],Val[N][2],Sum[N][2];
13 struct Que
14 {
15     int l,r,a,b,id,ans1,ans2;
16     bool operator < (const Que &a) const
17     {
18         if (ID[l]==ID[a.l]) return r<a.r;
19         return ID[l]<ID[a.l];
20     }
21 }Q[M];
22 bool cmp(Que a,Que b) {return a.id<b.id;}
23 
24 inline int read()
25 {
26     int x=0,w=1; char c=getchar();
27     while (c<'0' || c>'9') {if (c=='-') w=-1; c=getchar();}
28     while (c>='0' && c<='9') x=x*10+c-'0', c=getchar();
29     return x*w;
30 }
31 
32 void Build()
33 {
34     int unit=sqrt(n);
35     int num=n/unit+(n%unit!=0);
36     for (int i=1; i<=num; ++i)
37         L[i]=(i-1)*unit+1, R[i]=i*unit;
38     R[num]=n;
39     for (int i=1; i<=num; ++i)
40         for (int j=L[i]; j<=R[i]; ++j) ID[j]=i;
41 }
42 
43 int Query(int l,int r,int opt)
44 {
45     int ans=0;
46     if (ID[l]==ID[r])
47     {
48         for (int i=l; i<=r; ++i) ans+=Val[i][opt];
49         return ans;
50     }
51     for (int i=l; i<=R[ID[l]]; ++i) ans+=Val[i][opt];
52     for (int i=L[ID[r]]; i<=r; ++i) ans+=Val[i][opt];
53     for (int i=ID[l]+1; i<=ID[r]-1; ++i) ans+=Sum[i][opt];
54     return ans;
55 }
56 
57 void Del(int p)
58 {
59     Val[a[p]][0]--; Sum[ID[a[p]]][0]--;
60     if (!Val[a[p]][0]) Val[a[p]][1]--, Sum[ID[a[p]]][1]--;
61 }
62 
63 void Ins(int p)
64 {
65     Val[a[p]][0]++; Sum[ID[a[p]]][0]++;
66     if (Val[a[p]][0]==1) Val[a[p]][1]++, Sum[ID[a[p]]][1]++;
67 }
68 
69 int main()
70 {
71     n=read(); m=read();
72     Build();
73     for (int i=1; i<=n; ++i) a[i]=read();
74     for (int i=1; i<=m; ++i)
75     {
76         l=read(); r=read(); x=read(); y=read();
77         Q[++q_num]=(Que){l,r,x,y,i};
78     }
79     sort(Q+1,Q+m+1);
80     int l=1,r=0;
81     for (int i=1; i<=m; ++i)
82     {
83         while (l<Q[i].l) Del(l++);
84         while (l>Q[i].l) Ins(--l);
85         while (r<Q[i].r) Ins(++r);
86         while (r>Q[i].r) Del(r--);
87         Q[i].ans1=Query(Q[i].a,Q[i].b,0);
88         Q[i].ans2=Query(Q[i].a,Q[i].b,1);
89     }
90     sort(Q+1,Q+m+1,cmp);
91     for (int i=1; i<=m; ++i)
92         printf("%d %d\n",Q[i].ans1,Q[i].ans2);
93 }

转载于:https://www.cnblogs.com/refun/p/10365714.html

相关文章:

  • HTML5新特性总结
  • 数据结构学习之队列
  • prometheus jmx exporter原理
  • Python 3 字符串转MD5形式
  • Vue常见指令
  • 寒假作业三——抓老鼠啊~亏了还是赚了?
  • 【剑指offer】让抽象问题具体化
  • 读书笔记1--力哥说理财:手把手教你玩转基金
  • [学习笔记]二叉树的遍历
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • leetcode388. Longest Absolute File Path
  • 后端_MYSQL
  • Java的Interrupt与线程中断
  • Go 领军人物谢孟军:智能制造渴望银弹,首先要摒弃偏见
  • Spark2.4.0源码分析之WorldCount ShuffleMapTask处理(八)
  • 【翻译】babel对TC39装饰器草案的实现
  • Docker 笔记(2):Dockerfile
  • iOS 系统授权开发
  • JAVA并发编程--1.基础概念
  • Java小白进阶笔记(3)-初级面向对象
  • log4j2输出到kafka
  • markdown编辑器简评
  • npx命令介绍
  • SpringCloud集成分布式事务LCN (一)
  • 闭包--闭包之tab栏切换(四)
  • 基于游标的分页接口实现
  • 盘点那些不知名却常用的 Git 操作
  • 问题之ssh中Host key verification failed的解决
  • 写给高年级小学生看的《Bash 指南》
  • 用jQuery怎么做到前后端分离
  • NLPIR智能语义技术让大数据挖掘更简单
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云服务器购买完整流程
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 如何在招聘中考核.NET架构师
  • ​VRRP 虚拟路由冗余协议(华为)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ###STL(标准模板库)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2.2w字)前端单元测试之Jest详解篇
  • (搬运以学习)flask 上下文的实现
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core 中间件验签
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net流程开发平台的一些难点(1)
  • .net生成的类,跨工程调用显示注释
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2023-年度总结]凡是过往,皆为序章
  • [Android 数据通信] android cmwap接入点