码迷,mamicode.com
首页 > 其他好文 > 详细

TyvjOJ题目 P1473 校门外的树3(线段树区间染色种类数不覆盖)

时间:2015-08-31 01:12:55      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

P1473 校门外的树3
时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K=1,读入l,r表示在l~r之间种上的一种树
K=2,读入l,r表示询问l~r之间能见到多少种树
(l,r>0)

输入格式

第一行n,m表示道路总长为n,共有m个操作
接下来m行为m个操作

输出格式

对于每个k=2输出一个答案

测试样例1

输入

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

输出


2

备注

范围:20%的数据保证,n,m<=100
      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);
			}
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

TyvjOJ题目 P1473 校门外的树3(线段树区间染色种类数不覆盖)

标签:

原文地址:http://blog.csdn.net/yu_ch_sh/article/details/48116983

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!