1. 程式人生 > >2016vijos 6-1 松鼠聚會(LCA+卡空間)

2016vijos 6-1 松鼠聚會(LCA+卡空間)

#include<cstdio>

using namespace std;

#define N 1000001

const int D=576;

struct node
{
    char a,b,c;
}f[N],g[N];

inline int F(int i)
{
    return ((f[i].a<<7)+f[i].b<<7)+f[i].c; 
}

inline int G(int i)
{
    return ((g[i].a<<7)+g[i].b<<7)+g[i].c; 
}

inline 
int d(int i) { return G(i)<N ? G(i):G(F(i))+1; } void read(int &x) { x=0; char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); } } node turn(int x) { node y; y.a=x>>14; y.b=(x>>7
)&127; y.c=x&127; return y; } int lca(int x,int y) { int u; if(d(x)<d(y)) u=x,x=y,y=u; int dis=d(x)-d(y); while(dis>=D) { if(G(x)<N) x=F(x),dis--; else x=G(x)-N,dis-=D; } while(dis) x=F(x),dis--; while(x!=y) {
if(G(x)<N||G(x)==G(y)) x=F(x),y=F(y); else x=G(x)-N,y=G(y)-N; } return x; } int main() { freopen("squirrel.in","r",stdin); freopen("squirrel.out","w",stdout); int n,m; read(n); read(m); g[0]=turn(N); int x; for(int i=2;i<=n;++i) { read(x); f[i]=turn(x),g[i]=turn(G(F(i))+1); } for(int i=n;i;i--) if(G(i)&1) { x=i; for(int j=1;j<=6;++j) x=F(x); g[i]=turn(x+N); } for(int i=n;i;i--) if(G(i)>N) { x=i; for(int j=1;j<=6;++j) x=G(x)-N; g[i]=turn(x+N); } for(int i=n;i;i--) if(G(i)>N) { x=i; for(int j=1;j<=4;++j) x=G(x)-N; g[i]=turn(x+N); } for(int i=n;i;i--) if(G(i)>N) { x=i; for(int j=1;j<=4;++j) x=G(x)-N; g[i]=turn(x+N); } int y; while(m--) { read(x); read(y); printf("%d\n",lca(x,y)); } }

相關推薦

2016vijos 6-1 松鼠聚會LCA+空間)

#include<cstdio> using namespace std; #define N 1000001 const int D=576; struct node { char a,b,c; }f[N],g[N]; inline int F(i

「AHOI2008」「LuoguP4281」緊急集合 / 聚會LCA

距離 好玩 left 正整數 聯系 code pen tchar through 題目描述 歡樂島上有個非常好玩的遊戲,叫做“緊急集合”。在島上分散有N個等待點,有N-1條道路連接著它們,每一條道路都連接某兩個等待點,且通過這些道路可以

[TJOI2013]松鼠聚會枚舉)

題目 [] 聽說 絕對值 include 一個點 turn i++ getchar [TJOI2013]松鼠聚會 題目描述 草原上住著一群小松鼠,每個小松鼠都有一個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。 每個小松鼠的家可以用

6-1 刪除字元 20 分) c語言解答附關鍵注意點

6-1 刪除字元 (20 分) 本題要求實現一個刪除字串中的指定字元的簡單函式。 函式介面定義: void delchar( char *str, char c ); 其中char *str是傳入的字串,c是待刪除的字元。函式delchar的功能是將字串str中出現的所有c字元刪

【資料結構】6-1內部排序選擇、插入、快排)

dataList類定義: class dataList { private: int number; int *data, *bdata;//data陣列是隨機生成的,排序更改的都是這個陣列,bdata就是用來存放排序前的 void reset();//重置陣列為初始生成的亂序

6-1 Topological Sort 25 分)

6-1 Topological Sort (25 分) 編寫程式以在有向圖中找到拓撲順序。 功能格式: bool TopSort( LGraph Graph, Vertex TopOrder[] ); 其中LGrap

Liferay 6.1開發學習一):環境搭建

一、資源準備 liferay-plugins-sdk-6.1.1(Plugins SDK)liferay-portal-6.1.1-ce-ga2(Bundled with Tomcat)liferay-portal-src-6.1.1-ce-ga2(Portal Sour

紅米Note4G TD/W單dior) 專用TWRP2.8.6.1中文版recovery

此recovery 特點: 1、 介面全面中文化, 支援中文刷機包,刷機指令碼等 2、 支援單獨清除電池資訊(在高階選項裡) 3、 支援usb掛載外接儲存/支援MTP掛載內外接儲存,方便從電腦拷刷機包 4、 支援OTG掛載U盤, 支援從OTG u盤刷機 5、 支援截圖命

2017-6-1 Linq 基礎查詢 增刪改查)

load title -1 style part ids deb control idt 用小型人員管理系統的項目實戰來練習linq的基礎增刪改查: using System; using System.Collections.Generic; using System

寫一個函數計算但參數為nn很大)時的值1-2+3-4+5-6+7……+n。考慮程序執行效率)

參數 color n) col sys class n-1 == code 1 private static void jisuan(int n) { 2 int sum=0; 3 if(n%2==0){ 4 sum=-(n/2)

[填坑]樹上差分 例題:[JLOI2014]松鼠的新家LCA

sca esp name tmp mes font efi 同學 節點 今天算是把LCA這個坑填上了一點點,又復習(其實是預習)了一下樹上差分。其實普通的差分我還是會的,樹上的嘛,也是懂原理的就是沒怎麽打過。 我們先來把樹上差分能做到的看一下: 1.找所有路徑公共覆蓋的

四周第四次課1月5日) 6.1 壓縮打包介紹 6.2 gzip壓縮工具 6.3 bzip2壓縮工具 6.4 xz壓縮工具

時間 force med 時間戳 dev iyu 文本文 是個 cups 四周第四次課(1月5日)6.1 壓縮打包介紹6.2 gzip壓縮工具6.3 bzip2壓縮工具6.4 xz壓縮工具 ==========================================

一周第二次課1月23日) 1.6/1.7 配置IP 1.8 網絡問題排查

51cto ext 獲取ip 靜態ip p地址 cbe ffffff com 有變 由於我們用的網絡連接是NAT模式,所以我們要先執行dhclient命令,這個命令是自動獲取IP的命令。*NAT模式的概念:不受限與當前的網絡環境,只要我們的宿主機能上網,那麽我們的虛擬機也就

6-1 單鏈表逆轉20 分)

結構定義 ++ return pri 輸出 int view 鏈表 一個 6-1 單鏈表逆轉(20 分) 本題要求實現一個函數,將給定的單鏈表逆轉。 函數接口定義: List Reverse( List L ); 其中List結構定義如下: typedef stru

中M2018春C入門和進階練習集 函數題 6-1 使用函數求素數和20 分)

|| bre 題目 span lse for mes view html 函數題 6-1 使用函數求素數和(20 分) 本題要求實現一個判斷素數的簡單函數、以及利用該函數計算給定區間內素數和的函數。 素數就是只能被1和自身整除的正整數。註意:1不是素數,2是素數。 函

AIX--操作系統安裝AIX 6.1

AIX 前一段時間,胡哥我接到老板的任務,要在AIX系統上安裝zabbix agent呀。可是胡哥只是玩過linux對於AIX這種需要硬件支持的才能玩的高端玩意可是從來沒接觸過呀,雖說linux是類unix,可是與unix系統還是有區別。 有啥辦法了,老板的命令,只能硬著上(老板可是花錢租來一臺I

vs2017創建支持多框架net4.6.1;net4.6.2;netstandard2.0;netcoreapp2.0)版本

get span ram 6.2 works framework target app 新建 1、新建netcore或netstandard或net4.6.1項目2、編輯項目文件:<Project Sdk="Microsoft.NET.Sdk"> <Pr

6-1 爆內存函數實例 6 分)

result 輔助 空間復雜度 部分 分組 執行 裁判 調用次數 其中 本題要求實現一個遞歸函數,用戶傳入非負整型參數n,用戶依次輸出1到n之間的整數。所謂遞歸函數就是指自己調用自己的函數。 說明: (1)遞歸函數求解問題的基本思想是把一個大規模問題的求解歸結為一個相對較小

Flink二)CentOS7.5搭建Flink1.6.1分布式集群

驗證 sin yarn paths sla dash eight specified oca 一. Flink的下載 安裝包下載地址:http://flink.apache.org/downloads.html ,選擇對應Hadoop的Flink版本下載 [a

1011 - C語言程式設計教程第三版)課後習題6.1

1011 - C語言程式設計教程(第三版)課後習題6.1 時間限制:1秒 記憶體限制:128兆 題目描述 輸入兩個正整數m和n,求其最大公約數和最小公倍數。 輸入 兩個整數 輸出 最大公約數,最小公倍數 樣例輸入 5 7 樣例輸出 1 35 最大公約數求法我是用的是輾轉相除法進行