博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[AHOI2013]作业
阅读量:6532 次
发布时间:2019-06-24

本文共 1217 字,大约阅读时间需要 4 分钟。

Description

给定了一个长度为\(n\)的数列和若干个询问,每个询问是关于数列的区间表示数列的第\(l\)个数到第\(r\)个数),首先你要统计该区间内大于等于\(a\),小于等于\(b\)的数的个数,其次是所有大于等于\(a\),小于等于\(b\)的,且在该区间中出现过的数值的个数。

\(n,m \leq 10^5\)

Solution

非常简单的莫队题目

追求更优的复杂度,可以采用\(cdq\)分治:

我们发现其实原题可以简化成一个三维数点

  • \(L \leq i\leq R\)
  • \(A\leq a[i] \leq B\)
  • \(pre[i]\leq L-1\)

于是把值离散一下,直接上\(cdq\)就行了

Code 

#include
#define ll long long#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)>(b)?(b):(a))#define reg registerinline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f;}const int MN=1e5+5;struct Node{ int x,y,z,sign,id; bool operator < (const Node&_)const { if(z^_.z) return z<_.z; return id<_.id; }}a[MN*5],b[MN*5];int ans1[MN],ans2[MN],tot;int t[MN];void C(int x,int val){for(;x<=MN;x+=(x&-x))t[x]+=val;}int G(int x){int r=0;for(;x;x-=(x&-x))r+=t[x];return r;}void cdq(int l,int r){ if(l==r) return; reg int i,j,p=l,mid=(l+r)>>1; cdq(l,mid);cdq(mid+1,r); for(i=l,j=mid+1;i<=mid||j<=r;) if(j>r||(i<=mid&&(a[i].y


Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10658672.html

你可能感兴趣的文章
主库 归档 删除策略
查看>>
linux服务器多网卡bond
查看>>
Chrome 更新策略大变:优先安装 64 位版本
查看>>
《Linux从入门到精通(第2版)》——导读
查看>>
路过下载攻击利用旧版 Android 漏洞安装勒索软件
查看>>
ThinkSNS 六大子版本体验及源码下载
查看>>
《算法基础》——1.5实际因素
查看>>
《Java数字图像处理:编程技巧与应用实践》——第3章 基本Swing UI组件与图像显示 3.1 JPanel组件与BufferedImage对象的显示...
查看>>
为什么有人讨厌 Google 的新 Logo?
查看>>
2022 年 AI 会发展成什么样子,IBM 做出了 5 大预测
查看>>
腾讯2017暑期实习编程题3
查看>>
整理收藏一份PHP高级工程师的笔试题
查看>>
Intellij IDEA 构建Spring Web项目 — 用户登录功能
查看>>
[AHOI2013]作业
查看>>
[bzoj 4241]历史研究
查看>>
git push被忽略的文件 处理
查看>>
C#中用ILMerge将所有引用的DLL打成一个DLL文件
查看>>
PHP生成HTML静态页面
查看>>
服务器启动django
查看>>
Makefile 中:= ?= += =的区别【转】
查看>>