[HNOI2015] 開店

来源:https://www.cnblogs.com/nosta/archive/2019/03/24/10590773.html
-Advertisement-
Play Games

~~「前言」為防止在某巨巨的毒瘤idea 紫荊花之“店" 面前一臉懵,特滾來補此題。~~ ~~我還是太naive了。~~ 「題義」給出一棵單點度數很小的無根帶邊權、點權的樹,每次詢問在所有點權在\[l,r\]的點到c的距離之和。 「分析」考慮建立點分樹,分治結構每個點都儲存對應分治範圍(簡稱範圍)內 ...


「前言」為防止在某巨巨的毒瘤idea 紫荊花之“店" 面前一臉懵,特滾來補此題。 我還是太naive了。

「題義」給出一棵單點度數很小的無根帶邊權、點權的樹,每次詢問在所有點權在[l,r]的點到c的距離之和。

「分析」考慮建立點分樹,分治結構每個點都儲存對應分治範圍(簡稱範圍)內的信息,詢問時從c向後跳分治鏈,並逐級將信息合併得到整棵樹的答案。

對於鏈上某一點x,設前一個點為px,顯然我們需要用到的,x範圍中(除去px範圍)的所有合法的點(即點權在[l,r]內的點)到c的距離之和,拆開為這些點到x的距離和+這些點的個數乘以x到c的距離。對於第一部分我們將它看作x範圍內所有點到x的距離和-px範圍內所有點到x的距離和,第二部分同理。

這樣,我們只需要對每個節點x儲存範圍內所有點點權age、到x的距離dis以及到上一級分治中心fa[x]的距離ldis(放在集合d[x])。然後將d[x]按照age排序,那麼x的分治範圍對於查詢中心c的產生貢的點獻處於d[x]的一段區間上。利用前(後)綴和+二分就能地很好處理了。

#include <bits/stdc++.h>
#define IL inline 
#define LL long long 
using namespace std;

const int N=150010;
const int inf=0x3f3f3f3f;

int n,Q,A,age[N];
int head[N],to[N<<1],last[N<<1],len[N<<1];

IL void addEdge(int x,int y,int w) {
    static int cnt=0;
    to[++cnt]=y,len[cnt]=w,last[cnt]=head[x],head[x]=cnt;
    to[++cnt]=x,len[cnt]=w,last[cnt]=head[y],head[y]=cnt;
}
namespace dbl {
    int fa[N][20],dep[N];
    LL ds[N][20];
    void prDfs(int x,int d) {
        dep[x]=dep[fa[x][0]=d]+1;
        for(int i=1; (1<<i)<=dep[x]; ++i) {
            fa[x][i]=fa[fa[x][i-1]][i-1];
            ds[x][i]=ds[fa[x][i-1]][i-1]+ds[x][i-1];
        }
        for(int i=head[x]; i; i=last[i]) {
            if(to[i]!=d) ds[to[i]][0]=len[i],prDfs(to[i],x);
        }
    }
    IL LL gtDis(int x,int y) {
        if(dep[x]<dep[y]) swap(x,y);
        LL ret=0; int dif=dep[x]-dep[y];
        for(int i=19; ~i; --i) if((dif>>i)&1) 
            ret+=ds[x][i],x=fa[x][i];
        if(x==y) return ret;
        for(int i=19; ~i; --i) if(fa[x][i]!=fa[y][i]) 
            ret+=ds[x][i],x=fa[x][i],ret+=ds[y][i],y=fa[y][i];
        return ret+ds[x][0]+ds[y][0];
    }
}
namespace dpd {
    struct node {
        LL dis,ldis; int age;
        IL node(LL d=0,LL ld=0,int a=0):dis(d),ldis(ld),age(a){}    
        IL bool operator<(const node&d) const {
            return age<d.age;
        }
    };
    vector<node> d[N];
    int root,siz[N],fa[N];
    bool ban[N];
    void prSiz(int x,int d) {
        siz[x]=1; 
        for(int i=head[x]; i; i=last[i]) if(!ban[to[i]]&&to[i]!=d) 
            prSiz(to[i],x),siz[x]+=siz[to[i]];
    }
    void gtRoot(int x,int d,int t) {
        static int f[N]={inf}; f[x]=siz[t]-siz[x];
        for(int i=head[x]; i; i=last[i]) if(!ban[to[i]]&&to[i]!=d) 
            gtRoot(to[i],x,t),f[x]=max(f[x],siz[to[i]]);
        if(f[x]<f[root]) root=x;
    }
    void prNode(int x,int d,LL dis) {
        dpd::d[root].push_back(node(dis,dbl::gtDis(x,fa[root]),age[x]));
        for(int i=head[x]; i; i=last[i]) {
            if(!ban[to[i]]&&to[i]!=d) prNode(to[i],x,dis+len[i]);
        }
    }
    void build(int x,int lrt) {
        root=0; prSiz(x,0); gtRoot(x,0,x); 
        x=root; fa[x]=lrt; ban[x]=1; prNode(x,0,0);
        sort(d[x].begin(),d[x].end());
        d[x].push_back(node(0,0,A));
        for(unsigned i=d[x].size()-2; ~i; --i) {
            d[x][i].dis+=d[x][i+1].dis;
            d[x][i].ldis+=d[x][i+1].ldis;
        }
        for(int i=head[x]; i; i=last[i]) {
            if(!ban[to[i]]) build(to[i],x);
        }
    }
    IL LL query(int c,int l,int r) {
        vector<node>::iterator L,R; LL ans=0;
        for(int x=c; x; x=fa[x]) {
            L=lower_bound(d[x].begin(),d[x].end(),node(0,0,l));
            R=upper_bound(d[x].begin(),d[x].end(),node(0,0,r));
            ans+=dbl::gtDis(x,c)*(R-L)+(L->dis-R->dis);
            if(fa[x]) ans-=dbl::gtDis(fa[x],c)*(R-L)+(L->ldis-R->ldis);
        }
        return ans;
    }
}

int main() {
    scanf("%d%d%d",&n,&Q,&A);
    for(int i=1; i<=n; ++i) scanf("%d",&age[i]);
    for(int x,y,w,i=n; --i; ) {
        scanf("%d%d%d",&x,&y,&w);
        addEdge(x,y,w);
    }
    dbl::prDfs(1,0);
    dpd::build(1,0); 
    LL lans=0;
    for(int u,a,b; Q--; ) {
        scanf("%d%d%d",&u,&a,&b);
        a=(lans+a)%A, b=(lans+b)%A; if(a>b) swap(a,b); 
        printf("%lld\n",lans=dpd::query(u,a,b));
    }
    return 0;
} // 代碼O2需要

好了,滾去看 紫荊花之戀 了


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前提介紹: 本人是一名大三學生,主要使用C++開發,興趣是高性能的伺服器方面。 網路開發離不開網路庫,所以今天開始學一個新的網路庫,陳老師的muduo庫 我參考的書籍就是陳老師自己關於muduo而編著這本《linux多線程伺服器編程》 為什麼選擇muduo網路庫: 我當初選擇muduo網路庫有三個方 ...
  • 簡潔的web框架Bottle 簡介 Bottle是一個非常簡潔,輕量web框架,與django形成鮮明的對比,它只由一個單文件組成,文件總共只有3700多行代碼,依賴只有python標準庫。但是麻雀雖小五臟俱全,基本的功能都有實現,很適合做一些小的web應用 開始使用 首先使用pip install ...
  • 超級開心啊!!!!!!!!!!!!! win10 打開cmd Installing with get-pip.py To install pip, securely download get-pip.py. [1]: curl https://bootstrap.pypa.io/get-pip.py ...
  • 一,File類:文件的創建和刪除 1.File(String pathname):pathname是指路徑名稱。用法 File file = new File("d:/1.txt "); 2.File(String parent, String child):parent是父路徑字元串,child是 ...
  • 許多公司網站被黑被進犯,首要牽扯到的便是網站的開發言語,包含了代碼言語,以及資料庫言語,現在大多數網站都是運用的PHP,JAVA,.net言語開發,資料庫運用的是mysql,oracle等資料庫,那麼網站被進犯了該怎樣辦?運營一個網站,總被進犯是時有發生的,特別一些公司網站,以及個人建站,都是沒有專 ...
  • 新聞 "Amazon.Lambda.RuntimeSupport發佈" "Forge 3.0架構" "Blazor 0.9.0試驗版發佈" "通過微軟游戲棧實現更多應用" "介紹ASP.NET Core中的gRPC" "Mac上的Visual Studio 2019 8.0版本預覽4" "FlexS ...
  • 說明 操作系統:Windows 10 Python 版本:3.7x 虛擬環境管理器:virtualenv 代碼編輯器:VS Code 環境搭建 打開 執行下述操作 Hello World 在 目錄下創建一個 __init__.py ,示例代碼如下所示: 在 目錄下創建一個 manage.py 文件, ...
  • 前言:由於對面向對象思想認識的不夠深刻,所以這一單元的作業寫的是非常不oo的,從代碼結構來看,結構也顯得有些混亂,,沒有一個清晰的設計。 作業分析 第一次作業 反思 1. 輸入 對於三次的作業其實大部分的難點就是在判斷輸入的合法性上,對於第一次作用來說,最初的想法還是用一整個正則表達式來判斷輸入,但 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...