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=100005;
typedef unsigned long long ull;
ull a[N],zz,now,ans;
int n,m,k,op,xx,yy,Op[N],first[N],next[N*2],v[N*2],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==1)v0=0,v1=x;else if(op==2)v0=x,v1=~0;else v0=x,v1=(~0)^x;}Tree(ull x,ull y){v0=x,v1=y;}
}trl[N*8],trr[N*8];
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]=1;for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){fa[v[i]]=x,deep[v[i]]=deep[x]+1,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)>>1,lson=pos<<1,rson=pos<<1|1;build(l,mid,lson),build(mid+1,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)>>1,lson=pos<<1,rson=pos<<1|1;if(mid<num)insert(mid+1,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)>>1,lson=pos<<1,rson=pos<<1|1;if(mid<L)return query(mid+1,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+1,r,rson,L,R,f);else return query(mid+1,r,rson,L,R,f)+query(l,mid,lson,L,R,f);}
}
Tree solve(int x,int y){Tree vx=Tree((int)3,0ull),vy=Tree((int)3,0ull);int fx=top[x],fy=top[y];while(fx!=fy)if(deep[fx]>deep[fy])vx=vx+query(1,n,1,dfn[fx],dfn[x],1),x=fa[fx],fx=top[x];else vy=query(1,n,1,dfn[fy],dfn[y],0)+vy,y=fa[fy],fy=top[y];if(deep[x]>deep[y])return vx+query(1,n,1,dfn[y],dfn[x],1)+vy;return vx+query(1,n,1,dfn[x],dfn[y],0)+vy;
}
int main(){memset(first,-1,sizeof(first)),deep[1]=1;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++)scanf("%d%llu",&Op[i],&a[i]);for(int i=1;i<n;i++)scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);dfs(1),dfs2(1,1),build(1,n,1);while(m--){scanf("%d%d%d%llu",&op,&xx,&yy,&zz);if(op==2)Op[xx]=yy,a[xx]=zz,insert(1,n,1,dfn[xx]);else{Tree t=solve(xx,yy);now=ans=0;for(int i=k-1;~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);}}
}

 

转载于:https://www.cnblogs.com/SiriusRen/p/6685529.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium框架安装及webdriver安装

本文介绍的是selenium安装及webdriver安装、小实例 1、selenium介绍 selenium是一个用于web应用程序测试的工具。 Selenium测试直接运行在浏览器&#xff0c;就向真正的用户操作一样。 支持的浏览器包括IE(7,8,9,10,11),Mazilla Firefox,Safari,Google Chrome,OperaL浏览器 这个…

idead断点调试_IDEA---断点调试Debug

Debug调试程序:可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug使用方式:在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)右键,选择Debug执行程序程序就会停留在添加的第一个断点处执行程序:f8:逐行执行程序f7:进入到方法中shiftf8:跳出…

svd medium_我们刚刚放弃了Medium博客。 您可能也应该这样做。

svd mediumOur blog helped our open source community reach an early critical mass.我们的博客帮助我们的开源社区达到了早期的临界质量。 In the 18 months since we launched our blog, it’s been viewed half a million times.自我们发布博客以来的18个月里&#xff0c…

写文件 追加和换行

file_put_contents("log.txt", "Hello world everyone.".PHP_EOL, FILE_APPEND); 转载于:https://www.cnblogs.com/yixi978/p/5422504.html

突然想到了王自如

刚刚不知道为什么突然想到了王自如。可能是因为下午在腾讯视频首页看到了老罗罗永浩的一个访谈节目&#xff0c;然后神经元一短路的原因吧。 想到王自如不禁又联想到了王自如和罗永浩的那场著名的撕逼之战。场面上王自如是被罗老师教做人的一个结果。然后就很长时间没有听到关于…

UOJ Test Round 3

A.几何冲刺 感觉自己的智商爆炸。 显然是按照极角序排列之后依次加点&#xff0c;判断是否有点。 保证一个点在两个角的范围内就OK了啊&#xff0c;想了半天叉积。。。 #include "triangles.h" #include <bits/stdc.h> #define for1(a,b,i) for(int ia,end_b;i…

万能素材库_自媒体运营必备3款黑科技工具,一个万能素材网站,你都在用吗?...

原标题&#xff1a;自媒体运营必备3款黑科技工具&#xff0c;一个万能素材网站&#xff0c;你都在用吗&#xff1f;现在刷短视频几乎是我们每个人每天必做的一个娱乐方式了&#xff0c;也有很多的小伙伴加到我问&#xff0c;怎么做抖音&#xff0c;抖音怎么运营&#xff0c;那么…

java怎么处理ajax请求,java怎么用ajax请求?jquery ajax请求后台的简单例子

jQuery.ajax(url,[settings])概述通过 HTTP 请求加载远程数据。jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数&#xff0c;除非你需要操作不常用的选项&#xff0c;以获得更多…

训练代码_代码简介:是的,有完全免费的代码训练营

训练代码Here are three stories we published this week that are worth your time:这是我们本周发布的三个值得您关注的故事&#xff1a; You might not need that $15K coding bootcamp: 6 minute read 您可能不需要$ 15K的编码训练营&#xff1a; 6分钟的阅读时间 How a b…

MySQL(五) —— 子查询

子查询&#xff08;SubQuery&#xff09;是指出现在其他SQL语句内的SELECT语句。 如&#xff1a; SELECT * FROM t1 WHERE col1 (SELECT col2 FROM t2); 其中 SELECT * FROM t1,称为Outer Query/Outer Statement SELECT col2 FROM t2,称为SubQuery 子查询指嵌套在查询内部&…

PPP认证方式pap chap chap2

2019独角兽企业重金招聘Python工程师标准>>> PPP点到点协议&#xff08;Point to Point Protocol&#xff0c;PPP&#xff09;是IETF&#xff08;Internet Engineering Task Force&#xff0c;因特网工程任务组&#xff09;推出的点到点类型线路的数据链路层协议。它…

Nexus-配置vPC 实验三

配置EvPC&#xff08;增强的vPC&#xff09;&#xff0c;下面两个FEX可以同时被两个N5K管理。注意&#xff1a;FEX只支持静态的Channel-group&#xff08;mode on&#xff09; N5K-1配置&#xff1a;配置FEXN5K-1&#xff08;config&#xff09;#feature fexN5K-1&#xff08;c…

python中字符串转xml对象_Python实现对象转换为xml的方法示例

本文实例讲述了Python实现对象转换为xml的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;# -*- coding:UTF-8 -*-Created on 2010-4-20author: 忧里修斯import xml.etree.ElementTree as ETimport xml.dom.minidom as minidomfrom addrbook.domain import Person…

python现在时间 命令,Python 日期格式和时间以及当前时间和时间戳

Python 程序在运行的时候可能需要获得当前的时间。在这个时候我们需要导入 datetime 包。获得当前时间例如&#xff0c;可以使用下面的代码获得当前的日期。today datetime.date.today()print("Todays date:", today)在上面的代码中&#xff0c;将会输出&#xff1a…

谷歌入职邮件_为什么我全职学习了8个月以接受Google采访

谷歌入职邮件by Googley as Heck由Googley饰演Heck 为什么我全职学习了8个月以接受Google采访 (Why I studied full-time for 8 months for a Google interview) It’s true. I’ve spent thousands of hours reading books, writing code, and watching computer science lec…

关于meta便签详解

<!-- 声明文档 --> <meta charsetutf-8> <meta http-equiv"X-UA-Compatible" content"IEedge" /> //指示IE以目前可用的最高模式显示内容 <!-- SEO 优化 --> <meta name"description" content"不超过150个字符&…

go grpc 深入笔记

为什么80%的码农都做不了架构师&#xff1f;>>> grpc 深入 生命周期 grpc 的生命周期由4种请求的方式不同而不同&#xff1a;(详细查看router示例) 普通rpc: 客户端发送请求&#xff0c;通知服务端调用rpc服务&#xff0c;服务端返回请求&#xff0c;如果状态"…

messagedigest 图片加密_MessageDigest 加密和解密2

-------------------解密---------------------------package com.drawthink.platform.util;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java…

34个省市自治区排序_freeCodeCamp的1,000多个学习小组现已完全自治

34个省市自治区排序by Justin Sane贾斯汀桑恩(Justin Sane) freeCodeCamp的1,000多个学习小组现已完全自治 (freeCodeCamp’s 1,000 study groups are now fully autonomous) When the first local freeCodeCamp (fCC) study group popped up, we had no idea that within les…

oracle rac alter日志,ORACLE 11G RAC 增加日志组及增大日志文件

1、查看目前日志组和日志文件情况SQL> select * from v$logfile order by 1;GROUP# STATUS TYPE MEMBER IS_---------- ------- ------- -------------------------------------------------- ---1 ONLINE FRA/st…