P1473 校门外的树3
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K=1,读入l,r表示在l~r之间种上的一种树
K=2,读入l,r表示询问l~r之间能见到多少种树
(l,r>0)
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K=1,读入l,r表示在l~r之间种上的一种树
K=2,读入l,r表示询问l~r之间能见到多少种树
(l,r>0)
输入格式
第一行n,m表示道路总长为n,共有m个操作
接下来m行为m个操作
接下来m行为m个操作
输出格式
对于每个k=2输出一个答案
测试样例1
输入
5 4
1 1 3
2 2 5
1 2 4
2 3 5
输出
1
2
备注
范围:20%的数据保证,n,m<=100
60%的数据保证,n <=1000,m<=50000
100%的数据保证,n,m<=50000
注意:树是可以重叠的,比如1号位置上可以种多种树
60%的数据保证,n <=1000,m<=50000
100%的数据保证,n,m<=50000
注意:树是可以重叠的,比如1号位置上可以种多种树
让总的操作数减去对查询区间不起作用的操作数,用两个线段树,更新 a b 时,一颗【0.a-1】都加1,一颗【b+1 n】都加1,查询时不起作用的操作数就是a的第二颗单点查询和b的第一颗单点查询的和
ac代码
记录号 S1306202
评测状态 Accepted
题目 P1473 校门外的树3
提交时间 2015-08-31 00:02:13
代码语言 C++
消耗时间 589 ms
消耗内存 2024 KiB
#include<stdio.h>
#include<string.h>
int n,m;
struct s
{
int l,r;
}node[50050<<2];
void build(int l,int r,int tr)
{
node[tr].l=node[tr].r=0;
if(l==r)
return;
int mid=(l+r)>>1;
build(l,mid,tr<<1);
build(mid+1,r,tr<<1|1);
}
void insertl(int L,int R,int l,int r,int tr)
{
if(L<=l&&r<=R)
{
node[tr].l++;
return;
}
int mid=(l+r)>>1;
if(L<=mid)
insertl(L,R,l,mid,tr<<1);
if(R>mid)
insertl(L,R,mid+1,r,tr<<1|1);
}
void insertr(int L,int R,int l,int r,int tr)
{
if(L<=l&&r<=R)
{
node[tr].r++;
return;
}
int mid=(l+r)>>1;
if(L<=mid)
insertr(L,R,l,mid,tr<<1);
if(R>mid)
insertr(L,R,mid+1,r,tr<<1|1);
}
int queryl(int pos,int l,int r,int tr)
{
if(l==r)
return node[tr].l;
int mid=(l+r)>>1;
if(pos<=mid)
{
return node[tr].l+queryl(pos,l,mid,tr<<1);
}
else
return node[tr].l+queryl(pos,mid+1,r,tr<<1|1);
}
int queryr(int pos,int l,int r,int tr)
{
if(l==r)
return node[tr].r;
int mid=(l+r)>>1;
if(pos<=mid)
{
return node[tr].r+queryr(pos,l,mid,tr<<1);
}
else
return node[tr].r+queryr(pos,mid+1,r,tr<<1|1);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
build(0,n,1);
int num=0;
while(m--)
{
int op,a,b;
scanf("%d%d%d",&op,&a,&b);
if(op==1)
{
insertl(0,a-1,0,n,1);
insertr(b+1,n,0,n,1);
num++;
}
else
{
a=queryr(a,0,n,1);
b=queryl(b,0,n,1);
printf("%d\n",num-a-b);
}
}
}
}