BZOJ 4811 树链剖分+线段树
思路:
感觉这题也可神了..
(还是我太弱)
首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树
修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到的值
考虑贪心,从高往低,如果这一位填0可以得到1,那么填0一定是最优的
否则如果可以填1,就把这一位填为1
复杂度是nklog^2n或者nklogn,只能通过50%的数据
发现可以并行计算这k位,复杂度降为nlog^2n的树链剖分或者nlogn的LCT,可以通过100%的数据
这个题没有卡常,合并信息不是O( 1 )的算法没有通过是很正常的吧。。。
还有树链剖分没法做到logn,每条链建线段树也是log^2n的,还不能搞子树,似乎常数也一般。。。
最优复杂度是log^2n,不过期望下大概是lognloglogn的感觉
这个题的最优复杂度为O( n + q( logn + k ) ),至少目前来说是这样的
from 洛谷的题解.
unsigned long long +各种位运算
线段树要分别维护向上的和向下的
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
typedef unsigned long long ull;
ull a[N],zz,now,ans;
int n,m,k,op,xx,yy,Op[N],first[N],next[N*],v[N*],tot;
int size[N],fa[N],son[N],deep[N],rev[N],dfn[N],cnt,top[N];
struct Tree{
ull v0,v1;Tree(){}
Tree(int op,ull x){if(op==)v0=,v1=x;else if(op==)v0=x,v1=~;else v0=x,v1=(~)^x;}
Tree(ull x,ull y){v0=x,v1=y;}
}trl[N*],trr[N*];
Tree operator+(Tree x,Tree y){return Tree((x.v0&y.v1)|((~x.v0)&y.v0),(x.v1&y.v1)|((~x.v1)&y.v0));}
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){
size[x]=;
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
fa[v[i]]=x,deep[v[i]]=deep[x]+,dfs(v[i]),size[x]+=size[v[i]];
if(size[v[i]]>size[son[x]])son[x]=v[i];
}
}
void dfs2(int x,int tp){
rev[dfn[x]=++cnt]=x;top[x]=tp;
if(son[x])dfs2(son[x],tp);
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]&&v[i]!=son[x])dfs2(v[i],v[i]);
}
void build(int l,int r,int pos){
if(l==r){trl[pos]=trr[pos]=Tree(Op[rev[l]],a[rev[l]]);return;}
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
build(l,mid,lson),build(mid+,r,rson);
trl[pos]=trl[lson]+trl[rson],trr[pos]=trr[rson]+trr[lson];
}
void insert(int l,int r,int pos,int num){
if(l==r){trl[pos]=trr[pos]=Tree(Op[rev[l]],a[rev[l]]);return;}
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<num)insert(mid+,r,rson,num);
else insert(l,mid,lson,num);
trl[pos]=trl[lson]+trl[rson],trr[pos]=trr[rson]+trr[lson];
}
Tree query(int l,int r,int pos,int L,int R,int f){
if(l>=L&&r<=R)return f?trr[pos]:trl[pos];
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<L)return query(mid+,r,rson,L,R,f);
else if(mid>=R)return query(l,mid,lson,L,R,f);
else{if(!f)return query(l,mid,lson,L,R,f)+query(mid+,r,rson,L,R,f);
else return query(mid+,r,rson,L,R,f)+query(l,mid,lson,L,R,f);
}
}
Tree solve(int x,int y){
Tree vx=Tree((int),0ull),vy=Tree((int),0ull);
int fx=top[x],fy=top[y];
while(fx!=fy)
if(deep[fx]>deep[fy])vx=vx+query(,n,,dfn[fx],dfn[x],),x=fa[fx],fx=top[x];
else vy=query(,n,,dfn[fy],dfn[y],)+vy,y=fa[fy],fy=top[y];
if(deep[x]>deep[y])return vx+query(,n,,dfn[y],dfn[x],)+vy;
return vx+query(,n,,dfn[x],dfn[y],)+vy;
}
int main(){
memset(first,-,sizeof(first)),deep[]=;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)scanf("%d%llu",&Op[i],&a[i]);
for(int i=;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);
dfs(),dfs2(,),build(,n,);
while(m--){
scanf("%d%d%d%llu",&op,&xx,&yy,&zz);
if(op==)Op[xx]=yy,a[xx]=zz,insert(,n,,dfn[xx]);
else{Tree t=solve(xx,yy);now=ans=;
for(int i=k-;~i;i--)
if(t.v0&(1ull<<i))ans+=1ull<<i;
else if(t.v1&(1ull<<i)&&now+(1ull<<i)<=zz)now+=1ull<<i,ans+=1ull<<i;
printf("%llu\n",ans);
}
}
}
BZOJ 4811 树链剖分+线段树的更多相关文章
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)
BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- bzoj 2157: 旅游【树链剖分+线段树】
裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...
- BZOJ 3589 动态树 (树链剖分+线段树)
前言 众所周知,90%90\%90%的题目与解法毫无关系. 题意 有一棵有根树,两种操作.一种是子树内每一个点的权值加上一个同一个数,另一种是查询多条路径的并的点权之和. 分析 很容易看出是树链剖分+ ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
随机推荐
- Python 实现批量查询IP并解析为归属地
一.背景: 最近工作中做了一个小功能,目的是为了分析注册用户区域分布和订单的区域分布情况.所以需要将其对应的IP信息解析为归属地,并同步每天同步更新.线上跑起来效率还是有优化的空间,优化的方向:在调用 ...
- nyoj 19 擅长排列的小明(深搜,next_permutation)
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...
- Sigmoid Function
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51734189 Sigmodi 函数是一 ...
- noip模拟赛 序
[问题背景]zhx 给他的妹子们排序.[问题描述]zhx 有 N 个妹子, 他对第 i 个妹子的好感度为 ai,且所有 ai两两不相等. 现 在 N 个妹子随意站成一排, 他要将她们根据好感度从小到大 ...
- poj 2823单调队列模板题
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N 1100000 int getmin[N],getmax[N],num[N],n,k, ...
- 【Tomcat】tomcat配置多域名和虚拟路径
当我们用浏览器在访问网页的时候,如访问www.baidu.com,一般都认为会在DNS服务器上找这个域名对应的IP,然后向这个IP发送请求 并响应,其实在DNS服务器解析之前,本机会先在你的系统配置文 ...
- [poj2311]Cutting Game_博弈论
Cutting Game poj-2311 题目大意:题目链接 注释:略. 想法: 我们发现一次操作就是将这个ICG对应游戏图上的一枚棋子变成两枚. 又因为SG定理的存在,记忆化搜索即可. 最后,附上 ...
- FreeMarker与Spring MVC 4集合的HelloWorld示例
0.整体的项目结构 1.引入POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- MVC中路由的一些内容详解
使用路由的好处:1.能够根据系统需求,灵活的划分请求规则(不同模块请求的URL是不一样的)2.屏蔽物理路径,提高系统的安全性,以上情况是无法根据URL分析视图文件在站点目录中的位置3.有利于搜索引擎优 ...
- [Vue @Component] Pass Vue Render Functions as Props for Powerful Patterns
Render functions open up a world of customization and control by using pure JavaScript rather than V ...