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.pswp.cn/news/396209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396209.shtml
英文地址,請注明出處:http://en.pswp.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…