[邊分治+線段樹合并]「CTSC2018」暴力寫掛

題目梗概

給出兩棵1為根的樹,求\(d[x]+d[y]-d[lca(x,y)]-d'[lca(x,y)]\)的最大值

解題思路

套路化簡之后\((d[x]+d[y]+dis(x,y)-2*d'[lca(x,y)])/2\)

第二棵樹上的lca化不掉,所以考慮在第二棵上枚舉lca

先說說這題的解法,邊分樹的合并.

邊分和點分有什么區別,邊分在合并類似\(d[x]+d[y]+dis(x,y)\)這種貢獻是很方便,只要記錄一條邊兩端的點集中\(d[x]+dis(x,u)\)最大值即可,而點分合并這種貢獻時復雜度與度數有關.

所以我們邊分治第一棵樹,建出邊分樹之后,遍歷第二棵樹,每次加入一個點,在邊分樹上維護答案

考慮左右兒子的答案如何合并,因為邊分樹是二叉樹,像線段樹一樣合并即可,復雜度\(O(n\) \(log n)\).

邊分治:將原圖轉成二叉樹(保證復雜度),每次找左右兩端節點數最大值最小的邊分開即可.

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=370005;
const LL INF=(LL)1e18;
inline int _read(){int num=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=getchar();return f*num;
}
struct jz{int x,y,w;jz(int x=0,int y=0,int w=0):x(x),y(y),w(w){}
};
int lnk[maxn<<2],son[maxn<<3],nxt[maxn<<3],w[maxn<<3],tot=1;
int n,cnt,zo,rx,ry,mi,rh,s[maxn<<2],rs[maxn<<3],ls[maxn<<3],d[maxn<<2],val[maxn<<3],fa[maxn<<3];
int rt[maxn],id,lc[maxn*46],rc[maxn*46],h[maxn*46];
LL rw[maxn*46],lw[maxn*46],dis[23][maxn<<2],ans=-INF;
vector<jz> Q;
bool vis[maxn<<3];
void add(int x,int y,int z){nxt[++tot]=lnk[x];lnk[x]=tot;son[tot]=y;w[tot]=z;}
void DFS(int x,int fa){int pre=x;for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=fa){Q.push_back(jz(pre,son[j],w[j]));Q.push_back(jz(pre,++cnt,0));pre=cnt;DFS(son[j],x);}
}
void get_ro(int x,int fa,int dep,int lst){s[x]=1;for (int j=lnk[x];j;j=nxt[j]) if (!vis[j]&&son[j]!=fa){dis[dep][son[j]]=dis[dep][x]+w[j];get_ro(son[j],x,dep,j),s[x]+=s[son[j]];}int w=max(zo-s[x],s[x]);if (w<=mi) mi=w,rx=x,ry=fa,rh=lst;
}
int work(int x,int dep,int sz){if (sz<=1) return d[x]=dep,x;mi=zo=sz;int now=++cnt;get_ro(x,0,dep,0);vis[rh]=vis[rh^1]=1;val[now]=w[rh];int X=rx,Y=ry;rs[now]=work(Y,dep+1,sz-s[X]);ls[now]=work(X,dep+1,s[X]);fa[ls[now]]=fa[rs[now]]=now;return now;
}
int add(int x){int lst=0,now=x;for (int i=d[x];i;i--){h[++id]=fa[now];lw[id]=rw[id]=-INF; if (now==ls[fa[now]]) lw[id]=dis[i][x]+dis[0][x],lc[id]=lst;if (now==rs[fa[now]]) rw[id]=dis[i][x]+dis[0][x],rc[id]=lst;lst=id;now=fa[now];}return id;
}
void merge(int &x,int y,LL dep){if (!x||!y){x=x+y;return;}ans=max(ans,lw[x]+rw[y]+val[h[x]]-dep);ans=max(ans,lw[y]+rw[x]+val[h[x]]-dep);lw[x]=max(lw[x],lw[y]);rw[x]=max(rw[x],rw[y]);merge(lc[x],lc[y],dep);merge(rc[x],rc[y],dep);
}
void solve(int x,int fa,LL dep){rt[x]=add(x);ans=max(ans,dis[0][x]*2-dep*2);for (int j=lnk[x];j;j=nxt[j]) if (son[j]!=fa){solve(son[j],x,dep+w[j]);merge(rt[x],rt[son[j]],dep*2);}}
int main(){freopen("exam.in","r",stdin);freopen("exam.out","w",stdout);n=_read();cnt=n;for (int i=1;i<n;i++){int x=_read(),y=_read(),z=_read();add(x,y,z);add(y,x,z);}DFS(1,0);memset(lnk,0,sizeof(lnk));tot=1;for (int i=0;i<Q.size();i++) add(Q[i].x,Q[i].y,Q[i].w),add(Q[i].y,Q[i].x,Q[i].w);work(1,0,cnt);memset(lnk,0,sizeof(lnk));tot=1;for (int i=1;i<n;i++){int x=_read(),y=_read(),z=_read();add(x,y,z);add(y,x,z);}solve(1,0,0);printf("%lld\n",ans/2);return 0;
} 

轉載于:https://www.cnblogs.com/CHNJZ/p/10554011.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HEVC/H265 文檔獲得

HEVC/H265文檔是很重要的標準&#xff0c;因為代碼有時由于效率問題而修改&#xff0c;這是最重要的參考&#xff1a; HEVC approved by ITU-T and ISO/IEC "Geneva, 25 January 2013 – A new video coding standard building on the PrimeTime Emmy award winning IT…

期權計算隱含波動率

牛頓迭代法 from scipy.stats import norm import numpy as np def bscall(S,K,r,sigma,t):d1(np.log(S/K)(r0.5*sigma**2)*t)/(sigma*np.sqrt(t))d2d1-sigma*np.sqrt(t)return S*norm.cdf(d1)-K*np.exp(-r*t)*norm.cdf(d2) def bsput(S,K,r,sigma,t):d1(np.log(S/K)(r0.5*sigm…

進擊的二維碼 | ArcBlock 課堂預告

ArcBlock Technical Learning Series 第十七期進擊的二維碼本周三&#xff0c;1 月 30 日下午 1:30 時 &#xff08;美國太平洋時間 29日下午 21:30 時&#xff09;&#xff0c;由 ArcBloc 后端工程師孫博山 授課。復制代碼二維碼源于日本,如今世界各國都在使用。一張簡單的二維…

期權數據計算

判斷是否為調倉日 ef is_adjust_day(self, dom1):判斷是否是每月的調倉日。 :params int dom: 每月第幾個交易日進行調倉&#xff0c;缺省是第1個交易日。:return: 如果是調倉日&#xff0c;返回True&#xff0c;否則返回False。ret Falsetoday self.datetime.date()…

由Docker的MySQL官方鏡像配置的容器無法啟動問題解決辦法(修改配置后無法啟動)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 為了方便閱讀&#xff0c;我在原文基礎上加了一些批注&#xff0c;說明我自己的情況&#xff0c;用紅色標示。 這篇文章記錄了我在使用…

HEVC/H265 主要設計者談HEVC/H265

Overview of the High Ef?ciency Video Coding (HEVC) Standard Gary J. Sullivan, Fellow, IEEE, Jens-Rainer Ohm, Member, IEEE, Woo-Jin Han, Member, IEEE, and Thomas Wiegand, Fellow, IEEE Gary J. Sullivan是H263&#xff…

阿里云 Aliplayer高級功能介紹(九):自動播放體驗

基本介紹經常會碰到客戶詢問&#xff0c;為什么我設置了autoplay為true&#xff0c;但是沒有自動播放&#xff0c;每次都要向客戶解釋這個是瀏覽器從用戶體驗角度考慮做的限制&#xff0c;客戶會繼續詢問那我要怎么做&#xff1f; 針對這個問題Aliplayer也專們做過優化&#xf…

指數定投(行不行學習)

import tushare as ts import pandas as pd import numpy as np from scipy import stats import tushare as ts import matplotlib.pyplot as plt %matplotlib inline #正常顯示畫圖時出現的中文和負號 from pylab import mpl mpl.rcParams[font.sans-serif][SimHei] mpl…

centOS安裝python3.7.2

1.查看centos中自帶的Python地址&#xff1a;which python&#xff08;一般在 /usr/bin/python&#xff09; 2.切換到python安裝目錄&#xff1a;cd /usr/bin 3.查看對應的Python版本指向&#xff1a;ls -l python* 4.創建一個空目錄&#xff1a;mkdir /usr/local/python3 5.…

有進度條圓周率Π計算

圓周率π的計算 一、圓周率π的簡介 圓周率的介紹圓周率用希臘字母 π&#xff08;讀作pi&#xff09;表示&#xff0c;是一個常數&#xff08;約等于3.141592654&#xff09;&#xff0c;是代表圓周長和直徑的比值。它是一個即無限不循環小數&#xff0c;在日常生活中&#xf…

期權制作回測數據

將指定的檔位的期權&#xff0c;指定階段剩余到期日的期權數據合并&#xff0c;用于回測 import pandas as pd import numpy as np import akshare as ak pd.set_option("display.max_rows",None) pd.set_option("display.max_columns",None)nh_price ak…

HEVC/H265 HM10.0 分析(一)NALread.cpp

下面分析 NALread.cpp 函數和代碼。 void read(InputNALUnit& nalu, vector<uint8_t>& nalUnitBuf) {/* perform anti-emulation prevention */TComInputBitstream *pcBitstream new TComInputBitstream(NULL);convertPayloadToRBSP(nalUnitBuf, (nalUnitBuf[0]…

Docker run 命令 參數說明

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 docker run &#xff1a;創建一個新的容器并運行一個命令 語法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...][OPTIONS] IMAGE [COM…

【云周刊】第205期:阿里云重磅開源實時計算平臺Blink,挑戰計算領域的“珠峰”...

本期頭條 阿里云重磅開源實時計算平臺Blink&#xff0c;挑戰計算領域的“珠峰” 信息爆炸的時代&#xff0c;智能推薦已經被應用到各類互聯網產品中&#xff0c;但為千萬級甚至億級規模的用戶實時做精準的推薦難度極高。這一難題已經被阿里攻克了&#xff1a;雙11的第1分鐘&…

凱特勒通道(backtrader)

import backtrader as bt import datetime import pandas as pd import matplotlib.pyplot as plt import backtrader.analyzers as btanalyzers#定義指標 class Ketler(bt.Indicator):params dict(ema20,atr 17)lines (expo,atr,upper,lower)plotinfo dict(subplot False)p…

MYSQL安裝報錯 -- 出現Failed to find valid data directory.

運行環境&#xff1a;windows10數據庫版本&#xff1a;mysql.8.0.12安裝方式&#xff1a;rpm包直接安裝 問題描述&#xff1a;mysql初始化的時候找不到對應的數據庫存儲目錄 報錯代碼&#xff1a; 2018-10-13T03:29:24.179826Z 0 [System] [MY-010116] [Server] D:\Program Fil…

Mysql 取用逗號分隔的字串的子串的方法:SUBSTRING_INDEX

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 有一張部門表&#xff1a;appbricks_department &#xff0c;有 id 字段和 rank_tree 字段。 rank_tree&#xff1a;記錄的是當前部門的…

UCloud首爾機房整體熱遷移是這樣煉成的

2019獨角獸企業重金招聘Python工程師標準>>> 2018年下半年&#xff0c;UCloud首爾數據中心因外部原因無法繼續使用&#xff0c;需要在很短時間內將機房全部遷走。為了不影響用戶現網業務&#xff0c;我們放棄了離線遷移方案&#xff0c;選擇了非常有挑戰的機房整體熱…

akshare雙均線backtrader

# -*- coding: utf-8 -*- """ Created on Tue Aug 4 16:52:23 2020author: 四屏 """from datetime import datetime %matplotlib inline import backtrader as bt import matplotlib.pyplot as plt import akshare as akplt.rcParams["fon…

與python相關計算機基礎知識

一、編程與編程的目的1、什么是語言&#xff1f;什么是編程語言&#xff1f; 語言是一種事物與另外一個事物溝通的介質 編程語言是程序員與計算機溝通的介質 2、什么是編程&#xff1f; 程序員把自己想讓計算機做的事用編程語言表達出來 編程的結果就是一系…