【线段树】 HDOJ 4366 Successor

这道题做的崩溃。。。从昨天晚上开始想,一直做到今天下午4点多。。。题目的意思啊!!!!我看错了好多次啊啊啊啊啊。。竟然是离线的,题目你这么坑,你父母知道吗。。。还有那个父节点啊,第一个输入是父节点啊啊啊啊啊。。尼玛啊,我直接当成职位编号了。。。。题目是一颗树啊啊啊啊啊,是我英语不好还是出题人英语不好啊啊啊啊。。。。最后还是多亏了hyf大神为渣渣答疑解惑,渣渣从坑里爬出来啊啊啊啊啊啊啊啊。。。崩溃啊。。还有吐槽一下数据弱啊啊啊啊,排序的时候能力相同按原始编号排也能过啊啊啊啊啊。。尼玛这怎么可能啊啊啊,后来我准备在相同的时候按节点的辖域排。。。hyf大神直接说按dfs层排就好了啦。。。跪拜hyf大神。。。尼玛啊,这道题以前写过类似的,是dfs序+树状数组。这道题就是dfs序+线段树。就是一水题啊啊啊啊啊,我还写过类似的啊啊啊啊,还被卡了这么久啊啊啊。。。火死了。。。


#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#define maxn 200005
#define eps 1e-6
#define mod 1000000007
#define INF 99999999
#define lowbit(x) (x&(-x))
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
typedef long long LL;
using namespace std;

int H[maxn], next[maxn], v[maxn];
struct node
{
	int b, c;
	int number;
	int pre, back, floor;
}tmp[maxn];
int dfs_clock, dfs_floor;
int cnt, n, m;
int segtree[maxn];
int ans, print[maxn];
int ql, qr, p, loynum;
queue<int> q;

void addedge(int x, int y)
{
	next[cnt]=H[x], H[x]=cnt, v[cnt]=y, cnt++;
}
void read(void)
{
	int i, up;
	scanf("%d%d",&n,&m);
	cnt=0;
	tmp[0].b=-1, tmp[0].c=-1;
	tmp[1].b=INF, tmp[1].c=INF;
	tmp[1].number=1;
	memset(H, -1, sizeof H);
	for(i=2;i<=n;i++){
		scanf("%d%d%d",&up,&tmp[i].b,&tmp[i].c);
		tmp[i].number=i;
		up++;
		addedge(up, i);
	}
}
void dfs(int now)
{
	dfs_clock++, dfs_floor++;
	tmp[now].pre=dfs_clock;
	for(int e=H[now];~e;e=next[e]) dfs(v[e]);
	tmp[now].back=dfs_clock;
	tmp[now].floor=dfs_floor--;
}
int cmp(node a, node b)
{
	if(a.c!=b.c) return a.c>b.c;
	else return a.floor<b.floor;
}
int query(int o, int L, int R)
{
	if(ql<=L && qr>=R) return segtree[o];
	int mid=(R+L)/2, temp;
	if(ql<=mid){
		temp=query(lson);
		if(tmp[temp].b>tmp[ans].b) ans=temp;
	} 
	if(qr>mid){
		temp=query(rson);
		if(tmp[temp].b>tmp[ans].b) ans=temp;
	}
	return ans;
}
void updata(int o, int L, int R)
{
	if(L==R){
		segtree[o]=loynum;
		return;
	}
	int mid=(R+L)>>1;
	if(p<=mid) updata(lson);
	else updata(rson);
	if(tmp[segtree[o<<1]].b>tmp[segtree[o<<1 | 1]].b)
		segtree[o]=segtree[o<<1];
	else segtree[o]=segtree[o<<1 | 1];
}
void solve(void)
{
	int temp;
	sort(tmp+1, tmp+n+1, cmp);
	memset(segtree, 0, sizeof segtree);
	for(int i=1;i<=n;i++){
		ql=tmp[i].pre, qr=tmp[i].back;
		ans=0;
		ans=query(1, 1, n);
		if(!ans) print[tmp[i].number-1]=-1;
		else print[tmp[i].number-1]=tmp[ans].number-1;
		p=tmp[i].pre, loynum=i;
		updata(1, 1, n);
	}
	while(m--){
		scanf("%d", &temp);
		printf("%d\n",print[temp]);
	}
}
int main(void)
{
	int _;
	while(scanf("%d",&_)!=EOF){
		while(_--){
			read();
			dfs_clock=0;
			dfs_floor=0;
			dfs(1);
			solve();
		}
	}
	return 0;
}


你可能感兴趣的:(线段树,HDU)