现在的位置: 首页 > 综合 > 正文

UVA 5864 – Register Allocation

2012年04月22日 ⁄ 综合 ⁄ 共 883字 ⁄ 字号 评论关闭

 

题目地址:

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3875

 

2011 年 台湾 新竹赛区的题目~~

 

简单的一道线段树,求区间最大覆盖次数。。。。

 

WA了一次~~    原因懒得再写Query,直接在Update的同时判断最大覆盖次数 ~   把子节点上的覆盖次数给忽略了。。。囧 ~

 

代码简单,方法简单,就不解释了~

 

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll (v<<1)
#define rr (v<<1|1)
#define tmid ((l+r)>>1)

using namespace std;

const int maxn=30010;
int num[maxn*4],mx;
int a,b;

void make_tree(){
	memset(num,0,sizeof(num));
}

void update(int l,int r,int v){
	if(l>b || r<a) return;
	if(a<=l && r<=b){
		num[v]++;
		return ;
	}
	update(l,tmid,ll);
	update(tmid+1,r,rr);
}
void query(int l,int r,int v,int m){
	m+=num[v];
	if(l==r){
		if(mx<m) mx=m;
		return;
	}
	query(l,tmid,ll,m);
	query(tmid+1,r,rr,m);
}

int main(){
	int n,t,i;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		make_tree();
		while(n--){
			if(a>b) swap(a,b);
			scanf("%d%d",&a,&b);
			update(1,maxn,1);
		}
		mx=0;
		query(1,maxn,1,0);
		printf("%d\n",mx);
	}
    return 0;
}

 

抱歉!评论已关闭.