Social Net ZOJ - 3649

来源:http://www.cnblogs.com/hehe54321/archive/2017/10/30/zoj-3649.html
-Advertisement-
Play Games

Social Net ZOJ - 3649 題意: 反正原題題意我是看不懂... 參考:http://www.cnblogs.com/names-yc/p/4922867.html 給出一幅圖,求最大生成樹,輸出邊權之和,併在這棵樹上進行查詢操作:給出兩個結點編號x和y,求從x到y的路徑上,由每個結 ...


Social Net ZOJ - 3649

題意:

反正原題題意我是看不懂...

參考:http://www.cnblogs.com/names-yc/p/4922867.html

給出一幅圖,求最大生成樹,輸出邊權之和,併在這棵樹上進行查詢操作:給出兩個結點編號x和y,求從x到y的路徑上,由每個結點的權值構成的序列中的極差大小——要求,被減數要在減數的後面,即形成序列{a1,a2…aj …ak…an},求ak-aj (k>=j)的最大值。

做法:

首先kruskal求一下最大生成樹。然後做倍增dp。

p[i]表示i號節點的權值

anc[i][j]表示i號節點的第2^j級祖先

根據倍增的基本思想,有:

maxn[i][j]表示從i號節點出發向上走,共走過2^j個節點(包含i號節點),這些節點中點權的最大值

$maxn[i][0]=p[i]$

$maxn[i][j]=max(maxn[i][j-1],maxn[anc[i][j-1]][j-1])$

minn[i][j]表示從i號節點出發向上走,共走過2^j個節點(包含i號節點),這些節點中點權的最小值

$minn[i][0]=p[i]$

$minn[i][j]=min(minn[i][j-1],minn[anc[i][j-1]][j-1])$

maxans[i][j]表示從i號節點出發向上走,共走過2^j個節點(包含i號節點),這些節點的權值按經過順序構成的序列{a1,a2…aj …ak…an}中,求ak-aj(k>=j)的最大值。

$maxans[i][0]=0$

$maxans[i][j]=max(maxans[i][j-1],maxans[anc[i][j-1]][j-1],maxn[anc[i][j-1]][j-1]-minn[i][j-1])$

其含義為:最大差值要麼是在前一半產生,要麼在後一半產生,要麼就是後一半的最大值減去前一半的最小值。

minans[i][j]表示從i號節點出發向上走,共走過2^j個節點(包含i號節點),這些節點的權值按經過順序的構成的序列{a1,a2…aj …ak…an}中,求ak-aj(k<=j)的最大值。(這個數組的名字其實不太對...不要管它)

$minans[i][0]=0$

$minans[i][j]=max(minans[i][j-1],minans[anc[i][j-1]][j-1],maxn[i][j-1]-minn[anc[i][j-1]][j-1])$

其含義為:最大差值要麼是在前一半產生,要麼在後一半產生,要麼就是前一半的最大值減去後一半的最小值。

以上都可以在dfs過程中完成。

求結果的過程,也可以視為倍增lca,但是在點“上移”的過程中,要求把移過的部分的答案更新到當前答案上。

設lca(x,y)=z。從x到y的路徑,可以視為x到z,z再到y。那麼,答案就是max(x到z路徑中最大答案,z到y路徑中最大答案,z權值-x到z路徑中最小值,z到y路徑中最大值-z權值,z到y路徑中最大答案-x到z路徑中最大答案)。

在x上移時,上移之後的最大答案就是max(x已經過部分產生的最大答案,將要上移部分的最大值-x已經過部分的最小值,將要上移部分的最大答案(在maxans中取))。

在y上移時,上移之後的最大答案就是max(y已經過部分產生的最大答案,y已經過部分的最大值-將要上移部分的最小值,將要上移部分的最大答案(在minans中取))。

錯誤記錄(本地):

1.由於x和y有順序,不能寫成形如47行

2.缺少63,64行

3.缺少75-78行,由於按這個方法寫,上移過程中,當前點不會被更新進已有答案

http://www.xuebuyuan.com/1162519.html
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<algorithm>
  5 using namespace std;
  6 struct E1
  7 {
  8     int a,b,w;
  9     friend bool operator<(const E1& a,const E1& b)
 10     {
 11         return a.w>b.w;
 12     }
 13 }e1[50100];
 14 struct Edge
 15 {
 16     int to,d,nxt;
 17 }e[100100];
 18 int fa[50100],p[50100],n,m,ne,f1[50100],log2n,deep[50100],q,ans1;
 19 int minn[50100][17],maxn[50100][17],minans[50100][17],maxans[50100][17],anc[50100][17];
 20 int find(int x)
 21 {
 22     return fa[x]==x?x:fa[x]=find(fa[x]);
 23 }
 24 void dfs(int x,int fa)
 25 {
 26     int i,k;
 27     minn[x][0]=maxn[x][0]=p[x];
 28     //minans[x][0]=maxans[x][0]=0;
 29     for(i=1;i<=log2n;i++)
 30     {
 31         anc[x][i]=anc[anc[x][i-1]][i-1];
 32         minn[x][i]=min(minn[x][i-1],minn[anc[x][i-1]][i-1]);
 33         maxn[x][i]=max(maxn[x][i-1],maxn[anc[x][i-1]][i-1]);
 34         minans[x][i]=max(max(minans[anc[x][i-1]][i-1],minans[x][i-1]),maxn[x][i-1]-minn[anc[x][i-1]][i-1]);
 35         maxans[x][i]=max(max(maxans[anc[x][i-1]][i-1],maxans[x][i-1]),maxn[anc[x][i-1]][i-1]-minn[x][i-1]);
 36     }
 37     for(k=f1[x];k!=0;k=e[k].nxt)
 38         if(e[k].to!=fa)
 39         {
 40             deep[e[k].to]=deep[x]+1;
 41             anc[e[k].to][0]=x;
 42             dfs(e[k].to,x);
 43         }
 44 }
 45 int get(int x,int y)
 46 {
 47     //if(deep[x]<deep[y])    swap(x,y);
 48     int t,i,ansx=0,ansy=0,minx=p[x],maxy=p[y];
 49     for(t=deep[x]-deep[y],i=0;t>0;t>>=1,i++)
 50         if(t&1)
 51         {
 52             ansx=max(ansx,max(maxans[x][i],maxn[x][i]-minx));
 53             minx=min(minx,minn[x][i]);
 54             x=anc[x][i];
 55         }
 56     for(t=deep[y]-deep[x],i=0;t>0;t>>=1,i++)
 57         if(t&1)
 58         {
 59             ansy=max(ansy,max(minans[y][i],maxy-minn[y][i]));
 60             maxy=max(maxy,maxn[y][i]);
 61             y=anc[y][i];
 62         }
 63     if(x==y)
 64         return max(max(ansx,ansy),maxy-minx);
 65     for(i=log2n;i>=0;i--)
 66         if(anc[x][i]!=anc[y][i])
 67         {
 68             ansx=max(ansx,max(maxans[x][i],maxn[x][i]-minx));
 69             minx=min(minx,minn[x][i]);
 70             ansy=max(ansy,max(minans[y][i],maxy-minn[y][i]));
 71             maxy=max(maxy,maxn[y][i]);
 72             x=anc[x][i];
 73             y=anc[y][i];
 74         }
 75     ansx=max(ansx,max(maxans[x][0],maxn[x][0]-minx));
 76     minx=min(minx,minn[x][0]);
 77     ansy=max(ansy,max(minans[y][0],maxy-minn[y][0]));
 78     maxy=max(maxy,maxn[y][0]);
 79     return max(max(max(ansx,ansy),maxy-minx),max(p[anc[x][0]]-minx,maxy-p[anc[y][0]]));
 80 }
 81 int main()
 82 {
 83     int i,t1,t2,a,b;
 84     while(scanf("%d",&n)==1)
 85     {
 86         log2n=log2(n);
 87         ne=0;ans1=0;
 88         memset(f1,0,sizeof(f1));
 89         memset(minn,0x3f,sizeof(minn));
 90         memset(maxn,0,sizeof(maxn));
 91         memset(minans,0,sizeof(minans));
 92         memset(maxans,0,sizeof(maxans));
 93         for(i=1;i<=n;i++)
 94             scanf("%d",&p[i]);
 95         scanf("%d",&m);
 96         for(i=1;i<=m;i++)
 97             scanf("%d%d%d",&e1[i].a,&e1[i].b,&e1[i].w);
 98         sort(e1+1,e1+m+1);
 99         for(i=1;i<=n;i++)
100             fa[i]=i;
101         for(i=1;i<=m;i++)
102         {
103             t1=find(e1[i].a);
104             t2=find(e1[i].b);
105             if(t1==t2)    continue;
106             e[++ne].to=e1[i].b;
107             e[ne].nxt=f1[e1[i].a];
108             e[ne].d=e1[i].w;
109             f1[e1[i].a]=ne;
110             e[++ne].to=e1[i].a;
111             e[ne].nxt=f1[e1[i].b];
112             e[ne].d=e1[i].w;
113             f1[e1[i].b]=ne;
114             fa[t1]=t2;
115             ans1+=e1[i].w;
116         }
117         printf("%d\n",ans1);
118         dfs(1,0);
119         scanf("%d",&q);
120         while(q--)
121         {
122             scanf("%d%d",&a,&b);
123             printf("%d\n",get(a,b));
124         }
125     }
126     return 0;
127 }

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

-Advertisement-
Play Games
更多相關文章
  • 業務背景 在稍微複雜點業務系統中,不可避免會碰到做定時任務的需求,比如淘寶的交易超時自動關閉訂單、超時自動確認收貨等等。對於一些定時作業比較多的系統,通常都會搭建專門的調度平臺來管理,通過創建定時器來周期性執行任務。如剛纔所說的場景,我們可以給訂單創建一個專門的任務來處理交易狀態,每秒輪詢一次訂單表 ...
  • 有了SpringMVC和Mabatis的整合後,一個初步WEB框架就形成了,但是完整的SSM框架還需要Spring的支持! 目前為止,我們所添加的配置文件有核心配置文件web.xml,springmvc的配置文件spring-servlet.xml以及Mabatis的配置文件mybatis-conf ...
  • 前言 今天在掘金看到一篇關於講解的Spring框架的文章,文章提到了牛客網的面試題。於是乎我就下載了牛客網app,發現面試題目很豐富。我就挑了java方面的面試題做了一下。10個題目為一組面試題,做完後,我發現了自己錯了好多,大多數都是基礎題。俗話說:基礎的深度決定未來的高度。我感覺自己必須要做一個 ...
  • 公司自己塔建的半自動化代碼生成項目 用法: 把csv文件放到src/resources/csv下,運行GenMain.java,生成的代碼在target/output下。 對GenMain.java進行適當的修改,可以控制生成的代碼有哪些,Pojo,Dao,Srv,ISrv,Action,PageJ ...
  • yii2在使用的時候,訪問控制器的時候,如果控制器的名稱是駝峰命名法,那訪問的url中要改成橫線的形式。例如: 最近在做某渠道的直連的時候,他們提供的文檔上明確指出介面的形式: 剛開始以為YII2中肯定有這樣的設置,然後就去google了下,發現都說不行,自己去看了下,果然,框架裡面直接是寫死的:( ...
  • 主頁面代碼 處理頁面代碼 ...
  • 1、實現介面的抽象類——適配器 即用了介面,又用了抽象類,關鍵是Window win=new MyWindow(); MyWindow子類並沒有直接實現Window介面,而是通過中間的抽象類建立了橋梁 2、代理公司的方法——功能更強大的包裝類 自己要錢的能力太弱小,通過強大的代理來完成要錢,包裝類 ...
  • 本節內容 - C參數複製,返回值 - Go參數複製,返回值 - 優化模式對參數傳遞的影響 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...