先知道这道题目的所求

  • 求出一个 \(num_i\) 使 \(a\leq num_i\leq b\) 且在 \(l\leq place_i\leq r\)。然后统计 \(num_i\) 的个数。

  • 求出一个 \(num_i\) 使 \(a\leq num_i\leq b\) 且在 \(l\leq place_i\leq r\)。然后统计 \(num_i\) 存在过。(不同于上一问的是这里只是 $inc(ans) $,而上一问是 \(inc(ans,num_i\)在区间里出现的次数) )。

明白所求之后开始做题。我们可以用莫队来维护每一次的 \(l,r\) 之间的状态,然后用分块进行修改。分块维护的是权值,并且维护上面的两个数。

procedure add(x,i:longint); // 增加一个数
begininc(block[x,1]); inc(intersum[Locate(x),1]); // 出现次数++if block[x,1]=1 then begin block[x,2]:=1;  inc(intersum[Locate(x),2]); end; // 有出现过,只可能是 1 或 0 表示出现或者没有出现
end;procedure dim(x,i:longint); // 减少一个数字
begindec(block[x,1]); dec(intersum[Locate(x),1]);if block[x,1]=0 then begin block[x,2]:=0; dec(intersum[Locate(x),2]); end;
end;

可能大家会问为什么分块,其实上面几篇题解讲得不对,因为分块的单点修改是 \(O(1)\) 的,而树状数组什么的是 \(O(\log\ n)\),会导致时间复杂度下降为 \(O(n\sqrt{n}\log\ n)\),将近 \(4e8\)。所以并不是方便才用的。

以下的就非常简单了。

// luogu-judger-enable-o2
varblock_num,node_num,sum,i,j,n,m,l,r:longint;num,id,left,right,vall,valr,recf:array[-1..110000] of longint;block:array[-1..110000,1..2] of longint;intersum:array[-1..400,1..2] of longint;ans:array[-1..110000,1..2] of longint;procedure Swap(var x,y:longint); var t:longint; begin t:=x; x:=y; y:=t; end;function Locate(node:longint):longint;
begin if node mod node_num=0 then exit(node div node_num); exit(node div node_num+1);
end;procedure Sort(l,r:longint);
var i,j,s1,s2:longint;
begini:=l; j:=r; s1:=recf[(l+r) div 2]; s2:=right[(l+r) div 2];repeatwhile ((recf[i]<s1)or((recf[i]=s1)and(right[i]<s2))) do inc(i);while ((recf[j]>s1)or((recf[j]=s1)and(right[j]>s2))) do dec(j);if i<=j thenbeginSwap(recf[i],recf[j]); Swap(id[i],id[j]); Swap(left[i],left[j]);Swap(right[i],right[j]); Swap(vall[i],vall[j]); Swap(valr[i],valr[j]);inc(i); dec(j);end;until i>=j;if i<r then Sort(i,r);if j>l then Sort(l,j);
end;function Query(l,r,mode:longint):longint;
vari:longint;real:array[1..2] of longint;
beginQuery:=0; real[1]:=Locate(l); real[2]:=Locate(r);if real[2]-real[1]<=1 then for i:=l to r do inc(Query,block[i,mode])elsebeginfor i:=real[1]+1 to real[2]-1 do inc(Query,intersum[i,mode]);for i:=l to real[1]*node_num do inc(Query,block[i,mode]);for i:=(real[2]-1)*node_num+1 to r do inc(Query,block[i,mode]);end;
end;procedure add(x,i:longint);
begininc(block[x,1]); inc(intersum[Locate(x),1]);if block[x,1]=1 then begin block[x,2]:=1; inc(intersum[Locate(x),2]); end;
end;procedure dim(x,i:longint);
begindec(block[x,1]); dec(intersum[Locate(x),1]);if block[x,1]=0 then begin block[x,2]:=0; dec(intersum[Locate(x),2]); end;
end;procedure Ready;
beginread(n,m); node_num:=trunc(sqrt(n)); block_num:=node_num;if block_num<>sqrt(n) then inc(block_num);for i:=1 to n do read(num[i]);for i:=1 to m do begin id[i]:=i; read(left[i],right[i],vall[i],valr[i]); recf[i]:=Locate(left[i]); end;Sort(1,m);
end;beginReady; l:=1; r:=0; sum:=0;for i:=1 to m dobeginwhile r<right[i] do begin  inc(r); add(num[r],i); end;while r>right[i] do begin dim(num[r],i); dec(r); end;while l<left[i] do begin dim(num[l],i); inc(l); end;while l>left[i] do begin dec(l); add(num[l],i); end;ans[id[i],1]:=Query(vall[i],valr[i],1); ans[id[i],2]:=Query(vall[i],valr[i],2);end;for i:=1 to m do writeln(ans[i,1],' ',ans[i,2]);
end.

转载于:https://www.cnblogs.com/FibonacciHeap/articles/9785391.html

[AHOI2013]作业相关推荐

  1. BZOJ 3236[AHOI2013]作业

    题面: 3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MB Submit: 1704  Solved: 685 [Submit][ ...

  2. P4396 [AHOI2013]作业 cdq分治

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的数列aaa,有qqq个询问,每次询问[l,r][l,r][l,r]中值域在[a,b][a,b][a,b]中的数出现的次数和在[a,b][ ...

  3. P4396 [AHOI2013]作业

    P4396 [AHOI2013]作业 题目描述 详见:P4396 [AHOI2013]作业 solution 莫队+树状数组的裸题(莫队+分块,CDQ分治都可以,莫队+线段树大概需要卡常). 时间复杂 ...

  4. Bzoj3236:[Ahoi2013]作业:莫队算法+树状数组

    题目链接:3236:[Ahoi2013]作业 这题-- 很水的一道莫队,只要用一个树状数组维护数值出现的前缀和就行就行 然而-- 可怜的我真是T得蛋疼了QAQ 先是写了一发裸莫队,T 卧槽T了? 快速 ...

  5. BZOJ3236 [Ahoi2013]作业

    昨天晚上做的...差错一直查到今天= = 最后没办法问管理员要了数据才知道原来ans数组开小了233,简直沙茶 这道题不就是裸的莫队嘛= =||| 只要用树状数组维护当前的两种个数即可. 1 /*** ...

  6. [BZOJ 3236] [Ahoi2013] 作业 [BZOJ 3809] 【莫队(+分块)】

    题目链接: BZOJ - 3236   BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删 ...

  7. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  8. [BZOJ3236][Ahoi2013]作业(莫队+树状数组)

    此题的询问是一个位置和权值都有限制的二维区间,但是题目具备无修改和允许离线两个条件,可以用莫队算法解决. 一个想法是:用莫队维护位置,树状数组维护权值. 具体的说,用一个数组 cnt cnt,维护莫队 ...

  9. Jozky 刷题目录

    文章目录 本目录参考OI-Wiki 还未解决专区 算法基础 枚举 模拟 递归&分治 贪心 排序 前缀和&差分 二分 倍增 构造 搜索 DFS && BFS 双向搜索 启 ...

最新文章

  1. 我的自白——华夏藏珍第一周
  2. blockchain paper
  3. 林华达视角-概率图模型与计算机视觉
  4. vue商城项目开发:axios发送请求及列表数据展示
  5. 如何关闭idea中反编译文件时的弹框提示?
  6. SparkSQL发展历史,DataFrame,SparkSQL的数据源,运行框架,tree和rule,Rule,Context运行过程,hiveContext运行过程,SparkSQL CLI等
  7. Java代码风格:最终决定
  8. 评测任务征集 | 全国知识图谱与语义计算大会(CCKS 2022)
  9. discuz 环境安装
  10. 17现代软件工程十五组第三次作业
  11. python有什么用-python有什么用(用处和用途)
  12. zynq开发系列4:EMIO连接按键控制MIO连接的灯
  13. paip.gch预编译头不生效的原因以及解决:
  14. Oracle PL/SQL游标的学习
  15. Redis势不可挡系列之概念剖析
  16. 记录一个小程序 input输入框格式手机号方法
  17. 电商平台电子面单打印对接
  18. 怎样用Python自制好看的指数估值图
  19. windows聚焦壁纸不更新_win10系统聚焦壁纸不更新怎么办?
  20. Linux 访问 Windows 代理服务器配置

热门文章

  1. sys.argv[] 的使用详解
  2. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— Arduino相关设置
  3. 百练1724:ROADS
  4. eclipse创建springboot项目_Spring Initializer+IntelliJ IDEA创建Spring Boot项目(图文)
  5. 1载波把32个信道按_OFDM技术:相比FDM提高频带利用率,子载波间隔可以随意选取吗?...
  6. 和java通信_[源码和文档分享]基于JAVA的即时通信软件
  7. hive(1)——用mysql进行元数据存储
  8. 网站服务器windows登陆密码忘记,网站服务器windows登陆密码忘记
  9. 从QQ进程内存中搜索出QQ号码
  10. 8086汇编常用代码总结(个人向),包含换行函数(过程),执行输出,结束程序