[Usaco2015 dec]Breed Counting
2024-09-06 02:20:04
原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397
用线段树维护区间和即可。时间复杂度\(O((N+Q)logN)\)。
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 100010
using namespace std;
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,q,a[maxn];
struct SegmentTree{
struct node{
int l,r,sum[4];
}t[maxn<<2];
void build(int d,int l,int r){
t[d].l=l,t[d].r=r;
if(l==r){
for(register int i=1;i<=3;i++) t[d].sum[i]=0;
t[d].sum[a[l]]=1; return;
}
int mid=(l+r)>>1;
build(d<<1,l,mid),build(d<<1|1,mid+1,r);
for(register int i=1;i<=3;i++)
t[d].sum[i]=t[d<<1].sum[i]+t[d<<1|1].sum[i];
}
void getsum(int d,const int &l,const int &r,int &ans1,int &ans2,int &ans3){
if(l<=t[d].l&&t[d].r<=r){ ans1=t[d].sum[1],ans2=t[d].sum[2],ans3=t[d].sum[3]; return; }
int mid=(t[d].l+t[d].r)>>1,sum[4]={0,0,0,0};
if(l<=mid)
getsum(d<<1,l,r,sum[1],sum[2],sum[3]),ans1=sum[1],ans2=sum[2],ans3=sum[3];
if(r>mid)
getsum(d<<1|1,l,r,sum[1],sum[2],sum[3]),ans1+=sum[1],ans2+=sum[2],ans3+=sum[3];
}
}tree;
int main(){
n=read(),q=read();
for(register int i=1;i<=n;i++) a[i]=read();
tree.build(1,1,n);
for(register int i=1;i<=q;i++){
int l=read(),r=read(),ans1=0,ans2=0,ans3=0;
tree.getsum(1,l,r,ans1,ans2,ans3);
printf("%d %d %d\n",ans1,ans2,ans3);
}
return 0;
}
最新文章
- WPF中的Pack URI
- JQuery中each()的使用方法说明
- C语言笔记一
- MATLAB 秒表函数 tic toc 计算程序运行时间
- hdu Super Jumping
- Android开发之XML的创建和解析
- CSS Unicode 编码
- poj2386Lake Counting
- machine learn in python 第二章2.1.1
- WCF学习笔记之事务编程
- Dubbo应用文档
- Python自学笔记-列表生成式(来自廖雪峰的官网Python3)
- python 小白(无编程基础,无计算机基础)的开发之路 day2
- Core Graphics框架是Quartz的核心,也是内容描画的基本接口。
- 040、Docker managed volume(2019-03-01 周五)
- linux grep find查找文件夹、代码中的某行/字符串
- CentOS 6.7 配置 yum 安装 nginx
- 31网络通信之Select模型
- NB-IoT移远BC95使用小结
- initialProps被React-Navigation的navigation属性覆盖解决方案