uoj#388. 【UNR #3】配對樹(線段樹合并)

傳送門

先考慮一個貪心,對于一條邊來說,如果當前這個序列中在它的子樹中的元素個數為奇數個,那么這條邊就會被一組匹配經過,否則就不會

考慮反證法,如果在這條邊兩邊的元素個數都是偶數,那么至少有兩組匹配經過它,那么把這兩條路徑都刪去這條邊可以更優。如果兩邊是奇數,一定至少有一條路徑經過它,去掉這組匹配之后就變成了偶數的情況。證畢

然后是一個神仙的轉化,我們對于一顆子樹中的元素,在序列里標記為\(1\),否則為\(0\),那么這條邊出現次數就是序列中長度為偶數且區間和為奇數的區間個數

考慮用線段樹合并優化,對于每個節點,記\(t[p][0/1][0/1]\)表示節點\(p\)代表的區間中前綴和為偶數\(/\)奇數,下標為偶數\(/\)奇數的下標個數,然后線段樹合并就行了

然而咱還是搞不明白為啥線段樹上的區間要設為\([1,m+1]\)……有哪位知道為什么的請告訴咱一聲……

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
const int N=1e5+5,M=N<<5,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
struct eg{int v,nx,w;}e[N<<1];int head[N],tot;
inline void add_edge(R int u,R int v,R int w){e[++tot]={v,head[u],w},head[u]=tot;}
int sum[M],ls[M],rs[M],t[M][2][2],rt[N];
int n,m,ans,cnt,u,v,w;
void upd(int p,int l,int r){sum[p]=0;if(ls[p])sum[p]+=sum[ls[p]];if(rs[p])sum[p]+=sum[rs[p]];int x=ls[p]?sum[ls[p]]&1:0;fp(i,0,1)fp(j,0,1){t[p][i][j]=0;if(ls[p])t[p][i][j]+=t[ls[p]][i][j];if(rs[p])t[p][i][j]+=t[rs[p]][i^x][j];}int mid=(l+r)>>1;if(!ls[p])t[p][0][0]+=(mid>>1)-((l-1)>>1),t[p][0][1]+=((mid+1)>>1)-(l>>1);if(!rs[p])t[p][x][0]+=(r>>1)-(mid>>1),t[p][x][1]+=((r+1)>>1)-((mid+1)>>1);
}
void ins(int &p,int l,int r,int x){if(!p){p=++cnt;t[p][0][0]=(r>>1)-((l-1)>>1);t[p][0][1]=((r+1)>>1)-(l>>1);}if(l==r)return ++sum[p],void();int mid=(l+r)>>1;x<=mid?ins(ls[p],l,mid,x):ins(rs[p],mid+1,r,x);upd(p,l,r);
}
int merge(int x,int y,int l,int r){if(!x||!y)return x|y;int mid=(l+r)>>1;ls[x]=merge(ls[x],ls[y],l,mid);rs[x]=merge(rs[x],rs[y],mid+1,r);upd(x,l,r);return x;
}
void dfs(int u,int fa){go(u)if(v!=fa){dfs(v,u);ans=add(ans,mul(e[i].w,1ll*t[rt[v]][0][0]*t[rt[v]][1][0]%P+1ll*t[rt[v]][0][1]*t[rt[v]][1][1]%P));rt[u]=merge(rt[u],rt[v],1,m+1);}
}
int main(){
//  freopen("testdata.in","r",stdin);n=read(),m=read();fp(i,1,n-1)u=read(),v=read(),w=read(),add_edge(u,v,w),add_edge(v,u,w);fp(i,1,m)u=read(),ins(rt[u],1,m+1,i);dfs(1,0);printf("%d\n",ans);return 0;
}

轉載于:https://www.cnblogs.com/bztMinamoto/p/10286479.html

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

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

相關文章

一道Js判斷對象是否相等面試題引發的故事

話說&#xff0c;說什么呢&#xff0c;先看下題吧還是、 function checkName(data) { if (data { name: LIMING }) { console.log("one"); 復制代碼 } else if (data { name: LIMING }) { console.log(two"); 復制代碼 } else { console.log("three&quo…

序列化

什么是序列化&#xff1f;為什么要實現序列化&#xff1f;有什么作用&#xff1f; 序列化就是把具體的對象轉化成二進制的字節碼文件進行存儲或網絡傳輸。反過來就是反序列化。 將要存儲或網絡傳輸的對象必須實現序列化才可以。 如果一個類已經實現了序列…

搭建Hive平臺

http://www.cnblogs.com/gpcuster/archive/2010/02/24/1672635.html Hive是一個基于Hadoop的數據倉庫平臺。通過hive&#xff0c;我們可以方便地進行ETL的工作。hive定義了一個類似于SQL的查詢語言&#xff1a;HQL&#xff0c;能夠將用戶編寫的QL轉化為相應的Mapreduce程序基于…

Java語言與sikuli配合

很早之前寫過一篇介紹sikuli的文章。本文簡單介紹如何在java中使用sikuli進自動化測試。 圖形腳本語言sikuli sikuli IDE可以完成常見的單擊、右擊、移動到、拖動等鼠標操作&#xff0c;java引用sikuli-script.jar同樣可以執行這些常見的鼠標操作&#xff0c;因此即可方便的編寫…

列表生成式,生成器表達式,模塊的使用

三元表達式 無論條件成立與否都要返回一個值, 用于簡化僅有一個判斷的函數(或代碼塊)遞歸 遞歸有循環調用的次數限制,調用函數時,函數相關數據要入棧,而棧區是有限的 二分查找法匿名函數 僅能在定義時使用一次,定義完了就沒了 參數沒有括號,不能有return,會自…

C#怎么用代碼模擬手機去訪問手機網站抓取數據

WebClient client new WebClient ();client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");更改user-agent為手機瀏覽器的。模擬谷歌Android&#xff1a;user-agent"Mozilla/5.0 (Linux; …

angular6 iframe應用

問題一、 iframe如何自適應屏幕高度 解決思路&#xff1a;通過設置iframe外層父元素高度等于window高度&#xff0c;再相對于父元素定位iframe元素&#xff1b;案例如下&#xff1a; 第一步: 模板文件中使用iframe // demo.component.html <div style"position: relati…

jquery下載地址:https://code.jquery.com/jquery/ 影響范圍: 版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷,可能導致LOCA

jquery下載地址&#xff1a;https://code.jquery.com/jquery/ 影響范圍&#xff1a; 版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷&#xff0c;可能導致LOCATION.HASH跨站漏洞 已測試成功版本&#xff1a; jquery-1.6.min.js&#xff0c;jquery-1.6.1.min…

Myeclipse常用快捷鍵

2019獨角獸企業重金招聘Python工程師標準>>> Ctrl1 快速修復 CtrlD: 刪除當前行 CtrlQ 定位到最后編輯的地方 CtrlL 定位在某行 CtrlO 快速顯示 OutLine CtrlT 快速顯示當前類的繼承結構 CtrlW 關閉當前Editer CtrlK 快速定位到下一個 CtrlE 快速顯示當前Edi…

數字三角形

問題描述 &#xff08;圖&#xff13;.&#xff11;&#xff0d;&#xff11;&#xff09;示出了一個數字三角形。 請編一個程序計算從頂至底的某處的一條路徑&#xff0c;使該路徑所經過的數字的總和最大。●每一步可沿左斜線向下或右斜線向下走&#xff1b;●1&#xff1c;三…

版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷

jquery下載地址&#xff1a;https://code.jquery.com/jquery/ 影響范圍&#xff1a; 版本低于1.7的jQuery過濾用戶輸入數據所使用的正則表達式存在缺陷&#xff0c;可能導致LOCATION.HASH跨站漏洞 已測試成功版本&#xff1a; jquery-1.6.min.js&#xff0c;jquery-1.6.1.min.…

RabbitMQ學習總結(6)——消息的路由分發機制詳解

2019獨角獸企業重金招聘Python工程師標準>>> 一、Routing(路由) (using the Java client)在前面的學習中&#xff0c;構建了一個簡單的日志記錄系統&#xff0c;能夠廣播所有的日志給多個接收者&#xff0c;在該部分學習中&#xff0c;將添加一個新的特點&#xff0…

Kaggle爆文:一個框架解決幾乎所有機器學習問題

上周一個叫 Abhishek Thakur 的數據科學家&#xff0c;在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem&#xff0c;介紹他建立的一個自動的機器學習框架&#xff0c;幾乎可以解決任何機器學習問題&#xff0c;項目很快也會發布出來。 這篇…

C# HttpWebRequest GET HTTP HTTPS 請求

這個需求來自于我最近練手的一個項目&#xff0c;在項目中我需要將一些自己發表的和收藏整理的網文集中到一個地方存放&#xff0c;如果全部采用手工操作工作量大而且繁瑣&#xff0c;因此周公決定利用C#來實現。在很多地方都需要驗證用戶身份才可以進行下一步操作&#xff0c;…

HttpStatusCode

https://docs.microsoft.com/en-us/dotnet/api/system.net.httpstatuscode?viewnetframework-4.7.2 422 UnprocessableEntity What HTTP status response code should I use if the request is missing a required parameter? Status 422 seems most appropiate based on the…

numpy 和tensorflow 中的乘法

矩陣乘法&#xff1a;tf.matmul() np.dot() &#xff0c; 逐元素乘法&#xff1a;tf.multiply() np.multiply()轉載于:https://www.cnblogs.com/lizhiqing/p/10307760.html

啟用了不安全的HTTP方法

安全風險&#xff1a;可能會在Web 服務器上上載、修改或刪除Web 頁面、腳本和文件。可能原因&#xff1a;Web 服務器或應用程序服務器是以不安全的方式配置的。修訂建議&#xff1a;如果服務器不需要支持WebDAV&#xff0c;請務必禁用它&#xff0c;或禁止不必要的HTTP 方法。方…

Mysql學習總結(4)——MySql基礎知識、存儲引擎與常用數據類型

2019獨角獸企業重金招聘Python工程師標準>>> 1、基礎知識 1.1、數據庫概述 簡單地說&#xff1a;數據庫&#xff08;Database或DB&#xff09;是存儲、管理數據的容器&#xff1b;嚴格地說&#xff1a;數據庫是“按照某種數據結構對數據進行組織、存儲和管理的容器”…

django權限二(多級菜單的設計以及展示)

多級權限菜單設計級標題欄 我們現在只有數據展示,要進入其他url還需要手動的輸入路徑,非常的麻煩,所以我們要設計 一個導航欄以及側邊多級菜單欄,這個展示是通過stark組件的設計的增刪改查頁面,而 每一個 頁面我們都需要有導航欄和側邊的權限菜單欄,所以把這個公共的部分提起到…

6.17 dokcer(一)Compose 簡介

Compose 簡介 Compose 項目是 Docker 官方的開源項目&#xff0c;負責實現對 Docker 容器集群的快速編排。從功能上看&#xff0c;跟 OpenStack 中的 Heat 十分類似。 其代碼目前在 https://github.com/docker/compose 上開源。 Compose 定位是 「定義和運行多個 Docker 容器的…