hdu 4366 线段树+dfs序列

来源:互联网 发布:淘宝买洋酒靠谱吗 编辑:程序博客网 时间:2024/05/03 11:57
#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<map>#include<algorithm>#define MS(x,y) memset(x,y,sizeof(x))#define pi acos(-1.0)#define ls o<<1#define rs o<<1|1#define root 1,0,time-1using namespace std;void fre(){freopen("t.txt","r",stdin);}typedef long long LL;typedef unsigned long long ULL;const int MAXN = 50005;const int inf = 0x3f3f3f3f;struct staff{    int l,a,id;}st[MAXN];struct node{    int v,next;}e[MAXN];int m,n,ed,time;int head[MAXN],in[MAXN*2],out[MAXN*2],ans[MAXN],maxv[8*MAXN];map<int,int>mp;bool cmp(staff a,staff b){    return a.a > b.a;}void dfs(int x){    in[x] = time++;    for(int i = head[x]; i!=-1; i=e[i].next)    {        dfs(e[i].v);    }    out[x] = time++;}void init(){    int fa;    ed = time = 0;    MS(head,-1);MS(ans,-1);MS(maxv,-1);    mp.clear();    for(int i = 1; i < n; ++i)    {        scanf("%d%d%d",&fa,&st[i].l,&st[i].a);        st[i].id = i;        mp[st[i].l] = i;        e[ed].v = i;        e[ed].next = head[fa];        head[fa] = ed++;    }    dfs(0);    sort(st+1,st+n,cmp);}int query(int ql,int qr,int o,int l,int r){    if(ql <= l && qr >= r) return maxv[o];    int m = l+(r-l)/2,ans = -1;    if(ql<= m) ans = query(ql,qr,ls,l,m);    if(qr > m) ans = max(query(ql,qr,rs,m+1,r),ans);    return ans;}void update(int p,int v,int o,int l,int r){    if(l==r) maxv[o] = v;    else    {        int m = l+(r-l)/2;        if(p <= m) update(p,v,ls,l,m);        else update(p,v,rs,m+1,r);        maxv[o] = max(maxv[ls],maxv[rs]);    }}int solve(){    int f;    for(int i = 1; i <= m; ++i)    {        scanf("%d",&f);        if(ans[f]==-1) printf("-1\n");        else printf("%d\n",mp[ans[f]]);    }}int main(){    // fre();    int i,j,t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        init();        for(i = 1; i < n; i = j)        {            j = i;            while(j < n && st[i].a == st[j].a)//能力值相等,成一批            {                int id = st[j].id;                ans[id] = query(in[id]+1,out[id]-1,root);                j++;            }            j = i;            while(j < n && st[i].a == st[j].a)            {                int id = st[j].id;                update(in[id],st[j].l,root);                j++;            }        }        solve();    }}

0 0