AC日记——[LNOI2014]LCA bzoj 3626
思路:
离线操作+树剖;
代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm maxn<<2
#define ll long long
#define mod 201314
struct QueryType {
int now,id,pos,z;
bool operator<(const QueryType pos)const
{
return now<pos.now;
}
};
struct QueryType qu[maxn<<];
int n,m,f[maxn],top[maxn],lar[maxn],size[maxn],id[maxn],deep[maxn];
int L[maxm],R[maxm],mid[maxm],head[maxn],E[maxn],V[maxn],cnt;
ll dis[maxm],ans[maxn],flag[maxm],Qes;
inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'')Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
void dfs1(int now)
{
size[now]=,deep[now]=deep[f[now]]+;
for(int i=head[now];i;i=E[i])
{
dfs1(V[i]),size[now]+=size[V[i]];
if(size[lar[now]]<size[V[i]]) lar[now]=V[i];
}
}
void dfs2(int now,int chain)
{
top[now]=chain,id[now]=++cnt;
if(lar[now]) dfs2(lar[now],chain);
for(int i=head[now];i;i=E[i])
{
if(V[i]==lar[now]) continue;
dfs2(V[i],V[i]);
}
}
void build(int now,int l,int r)
{
L[now]=l,R[now]=r;if(l==r) return;mid[now]=l+r>>;
build(now<<,l,mid[now]),build(now<<|,mid[now]+,r);
}
void downdata(int now)
{
flag[now<<]+=flag[now],flag[now<<|]+=flag[now];
dis[now<<]+=flag[now]*(R[now<<]-L[now<<]+);
dis[now<<|]+=flag[now]*(R[now<<|]-L[now<<|]+);
flag[now]=;
}
void add(int now,int l,int r)
{
if(L[now]>=l&&R[now]<=r)
{
dis[now]+=R[now]-L[now]+,flag[now]+=;
return;
}
if(flag[now]) downdata(now);
if(l<=mid[now]) add(now<<,l,r);
if(r>mid[now]) add(now<<|,l,r);
dis[now]=dis[now<<]+dis[now<<|];
}
void query(int now,int l,int r)
{
if(L[now]>=l&&R[now]<=r)
{
Qes+=dis[now];return;
}
if(flag[now]) downdata(now);
if(l<=mid[now]) query(now<<,l,r);
if(r>mid[now]) query(now<<|,l,r);
}
void add(int x,int y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) add(,id[top[y]],id[y]),y=f[top[y]];
else add(,id[top[x]],id[x]),x=f[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);add(,id[x],id[y]);
}
ll query(int x,int y)
{
ll res=;
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])
{
Qes=,query(,id[top[y]],id[y]);
res+=Qes,y=f[top[y]];
}
else
{
Qes=,query(,id[top[x]],id[x]);
res+=Qes,x=f[top[x]];
}
}
if(deep[x]>deep[y]) swap(x,y);
Qes=,query(,id[x],id[y]);
return res+Qes;
}
int main()
{
freopen("data.txt","r",stdin);
in(n),in(m);int u,v,w;
for(int i=;i<=n;i++)
{
in(u),u++,f[i]=u;
E[++cnt]=head[u],V[cnt]=i,head[u]=cnt;
}
cnt=,dfs1(),dfs2(,),build(,,n),cnt=;
for(int i=;i<=m;i++)
{
in(u),in(v),in(w),w++;
qu[++cnt].now=u,qu[cnt].id=i,qu[cnt].pos=-,qu[cnt].z=w;
qu[++cnt].now=v,qu[cnt].id=i,qu[cnt].pos=,qu[cnt].now++,qu[cnt].z=w;
}
sort(qu+,qu+cnt+);int tot=;
for(int i=;i<=cnt;i++)
{
if(qu[i].now==) continue;
while(tot<qu[i].now) add(++tot,);
ans[qu[i].id]+=query(qu[i].z,)*qu[i].pos;
}
for(int i=;i<=m;i++) printf("%lld\n",ans[i]%mod);
return ;
}
AC日记——[LNOI2014]LCA bzoj 3626的更多相关文章
- AC日记——[HNOI2014]世界树 bzoj 3572
3572 思路: 虚树+乱搞: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300005 #define ...
- AC日记——[Sdoi2013]森林 bzoj 3123
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3216 Solved: 944[Submit][Status] ...
- AC日记——[Hnoi2017]影魔 bzoj 4826
4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...
- AC日记——[ZJOI2012]网络 bzoj 2816
2816 思路: 多个LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 10005 #define l ...
- AC日记——[SCOI2009]游戏 bzoj 1025
[SCOI2009]游戏 思路: 和为n的几个数最小公倍数有多少种. dp即可: 代码: #include <bits/stdc++.h> using namespace std; #de ...
- AC日记——NOI2016区间 bzoj 4653
4653 思路: 线段树,指针滑动: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 #def ...
- AC日记——Rmq Problem bzoj 3339
3339 思路: 恶心: 代码: #include <cstdio> #include <cstring> #include <iostream> #include ...
- AC日记——[HNOI2008]越狱 bzoj 1008
1008 思路: 越狱情况=总情况-不越狱情况: 代码: #include <cstdio> #include <cstring> #include <iostream& ...
- AC日记——[FJOI2007]轮状病毒 bzoj 1002
1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...
随机推荐
- ACE主动对象模式(1)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...
- 手脱ASProtect v1.23 RC1(有Stolen Code)
1.载入PEID ASProtect v1.23 RC1 常见ASprotect版本壳: ASProtect 1.23 RC4 按shift+f9键26次后来到典型异常 ASProtect 1.31 ...
- jQuery无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案
用jQuery写一个通过点击左右图标来翻阅图片的小插件,写好后测试可以正常运行,但是放到Tab中后发现只有第一个Tab中的代码能够正常运行,其它全部罢工了. 用Chrome自带的开发工具一查,发现罢工 ...
- C#中excel读取和写入
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...
- Intellij IDEA 使用jrebel运行spring-boot并实现自动编译进行热部署
在使用jrebel运行spring-boot的时候,会发现一个很棘手的问题,就是项目不能自动编译,不能自动编译就不能实现热部署.(使用jar包方式运行的时候) 那么我们就要解决自动编译的问题,首先: ...
- spring常用管理bean注解
spring提供了多个注解声明Bean为spring管理的Bean @Controller 声明此类是一个MVC类,通常与@RequestMapping一起使用 @Controller @Reques ...
- vijos 1448 校门外的树 树状数组
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表 ...
- MYSQL查找总结
a.条件判断where select * from 表 where id > 1 and name != 'alex' and num = 12; select * from 表 where ...
- 集合类HashMap,HashTable,ConcurrentHashMap区别?
1.HashMap 简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null), ...
- CentOS7修改默认运行级别
新装了一个虚拟机,图形界面启动太慢,想调整一下按照以前的经验改运行级别,输入: vi /etc/inittab 然后发现跟之前不一样了,在inittab设置不再生效: # inittab is no ...