Successor hdu 4366 线段树
题意:
现在n个人,其中编号0的是老板,之后n-1个员工,每个员工只有一个上司,有一个忠诚值和能力值。每次要解雇一个人的时候,从他的下属中选取能力值大于他的且忠诚值最高的一个,若不存在则输出-1.共m次询问,每次询问i,输出解雇i会选择哪个编号的员工代替值。(所有询问都不相互影响)
#include<bits/stdc++.h>
using namespace std;
#define N 50020 struct peo
{
int a,v,id;
peo()
{
a=;v=;id=;
} }s[N];
int t[N<<];
int cnt,n,q;
vector<int>v[N];
int ha[],l[N],r[N],ans[N]; void dfs(int x)
{
l[x]=++cnt;
for(int i=;i<v[x].size();i++)
dfs(v[x][i] );
r[x]=cnt;
} void build(int L,int R,int pos)
{
t[pos]=-;
if(L==R)
return ;
int mid=(L+R)>>;
build(L,mid,pos<< );
build(mid+,R,pos<<|);
} bool cmp(peo a,peo b)
{
return a.a>b.a;
} void update(int x,int v,int L,int R,int pos)
{
if(L==R)
{
t[pos]=v;
return ;
}
int mid=(L+R)>>;
if(x<=mid)
update(x,v,L,mid,pos<<);
else
update(x,v,mid+,R,pos<<|);
t[pos]=max(t[pos<<],t[pos<<|]);
} int query(int l,int r,int L,int R,int pos)
{
int ans=-;
if(l<=L&&r>=R)
return t[pos];
int mid=(L+R)>>;
if(l<=mid)ans=max(ans,query(l,r,L,mid,pos<<));
if(r>mid)ans=max(ans,query(l,r,mid+,R,pos<<|));
return ans;
} int main()
{
int cas;cin>>cas;
while(cas--)
{
scanf("%d%d",&n,&q);
for(int i=;i<n;i++)
v[i].clear(); for(int i=;i<n;i++)
{
int pre;
scanf("%d%d%d",&pre,&s[i].v,&s[i].a);
v[pre].push_back(i);
s[i].id=i;
ha[s[i].v]=i;
}
cnt=;
dfs();
build (,n-,);
sort(s+,s+n,cmp);
int i=,j;
while(i<n)
{
j=i;
while(j<n&&s[i].a==s[j].a)
{
int k=query( l[s[j].id ],r[s[j].id ]-,,n-, );
if(k==-)
ans[s[j].id ]=-;
else
ans[s[j].id]=ha[k];
j++;
}
j=i;
while(j<n&&s[i].a==s[j].a)
{
update(l[s[j].id ]-,s[j].v,,n-, );
j++;
}
i=j;
}
while(q--)
{
int x;
scanf("%d",&x);
printf("%d\n",ans[x]);
}
}
return ;
}
Successor hdu 4366 线段树的更多相关文章
- Successor HDU - 4366 (预处理,线段树,dfs序)
Successor HDU - 4366 Sean owns a company and he is the BOSS.The other Staff has one Superior.every s ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- luogu2038 [NOIp2014]无线网络发射器选址 (前缀和)
貌似不用做前缀和也能过? #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a, ...
- Burpsuit分块传输插件绕WAF原理和技巧(转)
0x00 原理 给服务器发送payload数据包,使得waf无法识别出payload,当apache,tomcat等web容器能正常解析其内容.如图一所示 0x02 实验环境 本机win10+x ...
- bzoj3920: Yuuna的礼物(莫队+分块套分块)
思路挺简单的,但是总感觉好难写...码力还是差劲,最后写出来也挺丑的 这题显然是个莫队题,考虑怎么转移和询问... 根据莫队修改多查询少的特点,一般用修改快查询慢的分块来维护.查第$k_1$小的出现次 ...
- DCT变换、DCT反变换、分块DCT变换
一.引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能.DCT变换本身是无损 ...
- C#访问和操作MYSQL数据库
这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 下载地址:MyS ...
- LVS NAT/DR
LVS介绍:http://www.linuxvirtualserver.org/zh/lvs3.html DR 工作流: HOST发送服务请求报文(源IP为HOST IP,目的IP为VSIP) Gen ...
- bzoj千题计划240:bzoj3900: 交换茸角
http://www.lydsy.com/JudgeOnline/problem.php?id=3900 dp[i]表示让状态为i的鹿满足要求的最少交换次数 不能枚举两头鹿交换,因为一头鹿可能交换多次 ...
- bzoj千题计划175:bzoj1303: [CQOI2009]中位数图
http://www.lydsy.com/JudgeOnline/problem.php?id=1303 令c[i]表示前i个数中,比d大的数与比d小的数的差,那么如果c[l]=c[r],则[l+1, ...
- 关于Web安全的那些事(XSS攻击)
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发 ...
- javascript柯里化
function curry(fn){ var slice = Array.prototype.slice; var arr = slice.call(arguments,1); return fun ...