树链剖分+线段树,每个节点维护以下信息:

(1)单独在某个点分配$i$个人的最大收益。可以$O(m)$合并。

(2)分配$i$个人的最大收益。可以用$O(m^2)$合并。

时间复杂度$O(c(m^2\log n+m\log^2n))$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=20010,M=51,T=65600;
int n,m,q,X=1<<16,Y=~0U>>1,A,B,Q,i,op,x,y;
int g[N],nxt[N],f[N],d[N],size[N],son[N],st[N],en[N],top[N],seq[N],dfn;
struct P{
ll v[M];
P(){for(int i=0;i<M;i++)v[i]=0;}
P operator+(P b){
P c;
for(int i=0;i<M;i++)c.v[i]=max(v[i],b.v[i]);
return c;
}
P operator*(P b){
P c;
for(int i=0;i<M;i++)for(int j=0;j<M-i;j++)c.v[i+j]=max(c.v[i+j],v[i]+b.v[j]);
return c;
}
}tmp,a[N],v0[T],v1[T],s0,s1;
inline int getint(){
A=((A^B)+B/X+B*X)&Y;
B=((A^B)+A/X+A*X)&Y;
return(A^B)%Q;
}
inline void gettmp(){
for(int i=1;i<=m;i++)tmp.v[i]=getint();
sort(tmp.v+1,tmp.v+m+1);
}
void dfs(int x){
size[x]=1;
for(int i=g[x];i;i=nxt[i]){
d[i]=d[x]+1,dfs(i),size[x]+=size[i];
if(size[i]>size[son[x]])son[x]=i;
}
}
void dfs2(int x,int y){
seq[st[x]=++dfn]=x;top[x]=y;
if(son[x])dfs2(son[x],y);
for(int i=g[x];i;i=nxt[i])if(i!=son[x])dfs2(i,i);
en[x]=dfn;
}
inline void up(int x){
v0[x]=v0[x<<1]+v0[x<<1|1];
v1[x]=v1[x<<1]*v1[x<<1|1];
}
void build(int x,int a,int b){
if(a==b){v0[x]=v1[x]=::a[seq[a]];return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b),up(x);
}
void change(int x,int a,int b,int c){
if(a==b){v0[x]=v1[x]=tmp;return;}
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c);else change(x<<1|1,mid+1,b,c);
up(x);
}
void ask0(int x,int a,int b,int c,int d){
if(c<=a&&b<=d){s0=s0+v0[x];return;}
int mid=(a+b)>>1;
if(c<=mid)ask0(x<<1,a,mid,c,d);
if(d>mid)ask0(x<<1|1,mid+1,b,c,d);
}
void ask1(int x,int a,int b,int c,int d){
if(c<=a&&b<=d){s1=s1*v1[x];return;}
int mid=(a+b)>>1;
if(c<=mid)ask1(x<<1,a,mid,c,d);
if(d>mid)ask1(x<<1|1,mid+1,b,c,d);
}
inline void chain(int x,int y){
if(x==y)return;
x=f[x];
while(top[x]!=top[y])ask0(1,1,n,st[top[x]],st[x]),x=f[top[x]];
ask0(1,1,n,st[y],st[x]);
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&A,&B,&Q);
for(i=2;i<=n;i++)scanf("%d",&f[i]),nxt[i]=g[f[i]],g[f[i]]=i;
for(i=1;i<=n;i++)gettmp(),a[i]=tmp;
dfs(1),dfs2(1,1),build(1,1,n);
scanf("%d",&q);
while(q--){
scanf("%d%d",&op,&x);
if(!op)gettmp(),change(1,1,n,st[x]);
else{
scanf("%d",&y);
s0=s1=P();
chain(x,y),ask1(1,1,n,st[x],en[x]);
s0=s0*s1;
printf("%lld\n",s0.v[m]);
}
}
return 0;
}

  

BZOJ2164 : 采矿的更多相关文章

  1. [BZOJ2164]采矿【模拟+树链剖分+线段树】

    Online Judge:Bzoj2164 Label:模拟,树链剖分,线段树 题目描述 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有 ...

  2. Bzoj2164 采矿(线段树+树链剖分)

    题面 Bzoj 题解 对于每个节点,我们可以用树链剖分和线段树维护以下信息: 单独在某个点分配\(i\)个人的最大收益(可以\(O(m)\)计算) 分配\(i\)的最大收益(可以\(O(m^2)\)计 ...

  3. 【BZOJ2164】采矿 树链剖分+线段树维护DP

    [BZOJ2164]采矿 Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n ...

  4. 【转载】 Deepmind星际争霸2平台使用第一轮-完成采矿

    原文地址: https://blog.csdn.net/woaipichuli/article/details/78645999 ----------------------------------- ...

  5. 8F - 采矿

    某天gameboy玩魔兽RPG.有一个任务是在一个富含金矿的圆形小岛上建一个基地,以最快的速度采集完这个小岛上的所有金矿.这个小岛上有n(0<n<1000000)个金矿,每个金矿的矿藏量是 ...

  6. bzoj 2164: 采矿

    Description 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有n个节点的有根树,我们把每个节点用1到n的整数编号.为了方便起见, ...

  7. 洛谷P2380 狗哥采矿

    P2380 狗哥采矿 题目背景 又是一节平静的语文课 狗哥闲来无事,出来了这么一道题 题目描述 一个n*m的矩阵中,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是 ...

  8. HDU 1173 采矿

    采矿 题解:如果给你一条线段(左右端点设为A,B), 那么在这条线上的任意一点到A B距离之和是一个定值, 然后如果再这条线段内在任意确定一个定点C, 那么这条线段上再任意取一个点,这个点到 A B ...

  9. 加密采矿僵尸网路病毒还在蔓延! kinsing kdevtmpfsi redis yarn docker

    Hadoop yarn 加密采矿僵尸网路病毒还在继续蔓延! 解决步骤 如果你同样遇到了kdevtmpfsi异常进程,占用了非常高的CPU和出网带宽,影响到了你的正常业务,建议使用以下步骤解决 杀掉异常 ...

随机推荐

  1. web页面记住密码存在安全问题 - 处理方式

    现在一般安全网站都不会做记住密码功能,因为记住密码存在安全缺陷. 不考虑网络拦截问题,如果是登录页面记住密码,第二次登录,直接进入开发者模式修改类型为text即可看到密码. 处理方式: 1.把auto ...

  2. Java实现颜色渐变效果

    RGB色彩,在自然界中肉眼所能看到的任何色彩都可以由红(R).绿(G).蓝(B)这三种色彩混合叠加而成,因此我们只要递增递减的修改其特定值就能得到相应的渐变效果. 运行效果:(图1) 运行5秒后:(图 ...

  3. IE6中使用通用选择器模拟子选择器效果

    IE6及更低版本不支持高级选择器:IE7有个bug,对于子选择器和相邻同胞选择器,如果父元素和子元素有HTML注释,会出问题. 下面我们使用通用选择器来模拟子选择器的效果. 原理:首先在所有后代上应用 ...

  4. poj 3461Oulipo

    题目链接:http://poj.org/problem?id=3461 统计字符串出现的次数 #include<cstdio> #include<iostream> #incl ...

  5. 《CLR via C#》读书笔记(6)类型和成员基础

    6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容 ...

  6. 在python3.5下安装scrapy包

    此前scrapy只支持python2.x 但是最新的1.1.0rc1已结开始支持py3了 如果电脑上安装了scrapy的依赖包,诸如lxml.OpenSSL 1.你直接下载Scrapy-1.1.0rc ...

  7. 【转载】有哪些省时小技巧,是每个Linux用户都应该知道的

    http://www.cnblogs.com/amberly/p/4352682.html

  8. GPT vs MBR 分区 ,,, Legacy BIOS vs UEFI BIOS

    MBR与GPT两种磁盘分区格式的区别 http://itoedr.blog.163.com/blog/static/120284297201378114053240 GPT Partition Tab ...

  9. 使用html5 canvas绘制图片

    注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链 ...

  10. rhel7初体验

    Redhat7界面明显比之前的版本华丽了不少,貌似Redhat对普通用户的使用也要进行普及 可以在安装的同时修改root密码和创建新用户