hdu5756
http://www.cnblogs.com/duoxiao/p/5777644.html 官方题解在这里
其实这道题不难,当初训练的时候不会做说明自己太弱
lazy标记不pushdown就是用lazy表示这个区间整体有哪些加减操作(大区间答案正确,子区间答案需要被所有祖先区间的lazy修正)
#include<bits/stdc++.h> using namespace std;
struct way{int po,next;} e[];
struct node{int laz,l,r,s,mx,mi;} tr[*];
struct qst{int l,r;} q[];
int l[],r[],a[],fa[],c[],d[],p[],h[];
int n,len,t,op,ans,qq,m; bool cmp(int a,int b)
{
if (l[a]==l[b]) return r[a]<r[b];
return l[a]<l[b];
} void add(int x,int y)
{
e[++len].po=y;
e[len].next=p[x];
p[x]=len;
} void dfs(int x)
{
l[x]=++t; c[t]=x;
for (int i=p[x]; i; i=e[i].next)
{
int y=e[i].po;
if (fa[x]!=y)
{
d[y]=d[x]+;
fa[y]=x;
dfs(y);
}
}
r[x]=t;
} void update(int i,int sz)
{
int l=tr[i].l, r=tr[i].r;
tr[i].s=tr[l].s+tr[r].s+tr[i].laz*sz;
tr[i].mx=max(tr[l].mx,tr[r].mx)+tr[i].laz;
tr[i].mi=min(tr[l].mi,tr[r].mi)+tr[i].laz;
} int build(int l,int r)
{
tr[++t].laz=;
if (l==r)
{
tr[t].mx=tr[t].mi=tr[t].s=d[c[l]];
return t;
}
int m=(l+r)>>,q=t;
tr[q].l=build(l,m);
tr[q].r=build(m+,r);
update(q,r-l+);
return q;
} void work(int i,int sz,int z)
{
tr[i].laz+=z;
tr[i].s+=z*sz;
tr[i].mx+=z;
tr[i].mi+=z;
} int add(int last,int l,int r,int x,int y)
{
tr[++t]=tr[last];
if (x<=l&&y>=r)
{
work(t,r-l+,-);
return t;
}
int m=(l+r)>>,q=t;
if (x<=m) tr[q].l=add(tr[last].l,l,m,x,y);
if (y>m) tr[q].r=add(tr[last].r,m+,r,x,y);
update(q,r-l+);
return q;
} void get(int x)
{
for (int i=p[x]; i; i=e[i].next)
{
int y=e[i].po;
if (fa[x]!=y)
{
h[y]=add(h[x],,n,l[y],r[y]);
work(h[y],n,);
get(y);
}
}
} void ask(int q,int l,int r,int x,int y,int laz)
{
if (op==&&laz+tr[q].mi>=ans) return;
if (op==&&laz+tr[q].mx<=ans) return;
if (x<=l&&y>=r)
{
if (op==) ans+=tr[q].s+(r-l+)*laz;
else if (op==) ans=min(ans,tr[q].mi+laz);
else if (op==) ans=max(ans,tr[q].mx+laz);
return;
}
int m=(l+r)>>;
if (x<=m) ask(tr[q].l,l,m,x,y,laz+tr[q].laz);
if (y>m) ask(tr[q].r,m+,r,x,y,laz+tr[q].laz);
} int main()
{
while (scanf("%d%d",&n,&qq)!=EOF)
{
len=; memset(p,,sizeof(p));
for (int i=; i<n; i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
t=; dfs(); t=;
h[]=build(,n); get();
ans=;
while (qq--)
{
int k,x; bool ff=;
scanf("%d%d%d",&k,&x,&op);
x=(x+ans)%n+;
for (int i=; i<=k; i++) scanf("%d",&a[i]);
if (op==) ans=;
else if (op==) ans=1e9;
else ans=-;
if (!k) {ff=; ask(h[x],,n,,n,);}
else {
sort(a+,a++k,cmp);
q[m=].l=l[a[]]; q[].r=r[a[]];
for (int i=; i<=k; i++)
if (l[a[i]]>q[m].r)
{
q[++m].l=l[a[i]];
q[m].r=r[a[i]];
}
else q[m].r=max(q[m].r,r[a[i]]);
q[m+].l=n+;
int st=, en=q[].l-;
for (int i=; i<=m; i++)
{
if (st<=en) {ff=; ask(h[x],,n,st,en,);}
st=q[i].r+,en=q[i+].l-;
}
if (st<=en) {ff=; ask(h[x],,n,st,en,);}
}
if (!ff) {puts("-1"); ans=;}
else printf("%d\n",ans);
}
}
}
hdu5756的更多相关文章
随机推荐
- STL使用总结
转载于http://blog.csdn.net/daisy_chenting/article/details/6898184 1. 概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可 ...
- node记录
集中管理 require('sequelize'); require('node-schedule')
- [iptables]iptables日志记录
Mar :: kernel: [:] IN=eth1 OUT= MAC=f0:1f:af:da:6f:1e::fb::ae:fa::: SRC= TOS= ID= DF PROTO=TCP SPT= ...
- HDU1394 逆序数
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- BIRT-商务智能报表工具开发案例指南
BIRT 报表 脚本 开发 数据库 http://www.iteye.com/topic/1128694 打算近期出版一本全面介绍BIRT使用的书籍,能够帮助大家全面了解BIRT的方方面面,用丰富的案 ...
- 2015/9/17 Python基础(13):函数
函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象. ...
- [洛谷P3763] [TJOI2017]DNA
洛谷题目链接:[TJOI2017]DNA 题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其 ...
- 耐心排序Patience Sorting
这个排序的关键在建桶和入桶规则上 建桶规则:如果没有桶,新建一个桶;如果不符合入桶规则那么新建一个桶 入桶规则:只要比桶里最上边的数字小即可入桶,如果有多个桶可入,那么按照从左到右的顺序入桶即可 举个 ...
- Jumpserver代码规范
Jumpserver 项目规范(Draft) 语言框架 Python 3.6.1 (当前最新) Django 1.11 (当前最新) Flask 0.12 Luna (当前最新) Paramiko 2 ...
- Eclipse Tomcat Project报错:HTTP Status 404错误
想要在eclipse里部署tomcat,结果tomcat单独可以通过连接测试,用eclipse就404了 404肯定都是目录不对,试了半天在eclipse下改了一下配置和文件位置就行了 1.先在菜单栏 ...