bzoj 4009 接水果 整體二分

Description

先給出一些盤子, 用路徑x-y表示, 有權值
再有Q個詢問, 表示水果, 用路徑x-y表示
如果盤子是水果的子路徑, 可以接住
對于每個水果, 輸出可以接住它的盤子的第k小權

Solution

對于x-lca-y的盤子,水果一定一個在x子樹,一個在y子樹
對于x-lca的盤子,水果一定一個在x子樹,一個在lca的非x子樹,即dfn序中的兩段區間
將一對區間(盤子)、一對點(水果)按dfn序順序轉化成一個矩形(盤子)和一個坐標(水果)
很明顯就是整體二分了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int M=40007;
inline int rd(){int x=0;bool f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=0;for(;isdigit(c);c=getchar())x=x*10+c-48;return f?x:-x;
}int n,m,Q;
int g[M];
struct edge{int y,next;}e[M<<1];int top[M],pre[M],dep[M],sz[M],son[M];
int st[M],ed[M],pid[M];struct pp{int d,id;}bb[M];
bool cd(pp x,pp y){return x.d<y.d;}
int val[M],tt;struct plate{int x,y,z;}pan[M];int nd[M],tmp[M],ans[M];struct opr{int x,y,z,kd;opr(int xx=0,int yy=0,int zz=0,int kk=0){x=xx;y=yy;z=zz;kd=kk;}
}q[M*9],q1[M*9],q2[M*9],a[M*9];
int tot,ta;
bool dx(opr x,opr y){if(x.x==y.x&&x.y==y.y) return x.kd<y.kd;if(x.x==y.x) return x.y>y.y;return x.x>y.x;
}int c[M],col[M],T;void addedge(int x,int y){e[++tot].y=y;e[tot].next=g[x];g[x]=tot;
}inline int lb(int x){return x&-x;}
void add(int x,int d){for(;x>0;x-=lb(x)){if(col[x]!=T){col[x]=T;c[x]=0;}c[x]+=d;}
}
int get(int x){int res=0;for(;x<=n;x+=lb(x))if(col[x]==T) res+=c[x];return res;
}void dfs1(int x){sz[x]=1;int p,y;for(p=g[x];p;p=e[p].next)if((y=e[p].y)!=pre[x]){pre[y]=x;dep[y]=dep[x]+1;dfs1(y);sz[x]+=sz[y];if(sz[y]>sz[son[x]]) son[x]=y;}
}void dfs2(int x){int p,y;pid[st[x]=++T]=x;if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(p=g[x];p;p=e[p].next)if((y=e[p].y)!=pre[x]&&y!=son[x]){top[y]=y;dfs2(y);}ed[x]=T;
}int getlca(int x,int y){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);x=pre[top[x]];}if(dep[x]>dep[y]) swap(x,y);return x;
}int jump(int x,int y){while(dep[top[x]]>dep[y]){x=top[x];if(pre[x]==y) return x;x=pre[x];}return pid[st[y]+1];
}void addrectangle(int xx,int yy,int x,int y,int z){q[++tot]=opr(xx-1,yy-1,z,1);q[++tot]=opr(x,y,z,1);q[++tot]=opr(xx-1,y,z,-1);q[++tot]=opr(x,yy-1,z,-1);
}void gao(){int i;sort(a+1,a+ta+1,dx);for(T++,i=1;i<=ta;i++){if(a[i].kd!=2) add(a[i].y,a[i].kd);else tmp[a[i].z]+=get(a[i].y);}
}void solve(int l,int r,int L,int R){if(l>r) return;int i,j,t1=0,t2=0,mid=L+R>>1;if(L==R){for(i=l;i<=r;i++)if(q[i].kd==2) ans[q[i].z]=val[L];return;}ta=0;for(i=l;i<=r;i++){if(q[i].kd==2) a[++ta]=q[i],tmp[q[i].z]=0;else if(q[i].z<=mid) a[++ta]=q[i];}gao();for(i=l;i<=r;i++){if(q[i].kd!=2){if(q[i].z<=mid) q1[++t1]=q[i];else q2[++t2]=q[i];}else{if(nd[q[i].z]<=tmp[q[i].z]) q1[++t1]=q[i];else{nd[q[i].z]-=tmp[q[i].z];tmp[q[i].z]=0;q2[++t2]=q[i];}}}for(i=1;i<=t1;i++) q[l+i-1]=q1[i];for(i=1;i<=t2;i++) q[l+t1+i-1]=q2[i];solve(l,l+t1-1,L,mid);solve(l+t1,r,mid+1,R);
}int main(){int i,x,y,xx,yy,z,lc;n=rd(),m=rd(),Q=rd();for(i=1;i<n;i++){x=rd();y=rd();addedge(x,y);addedge(y,x);}dep[1]=1;dfs1(1);top[1]=1;dfs2(1);for(i=1;i<=m;i++){pan[i].x=rd(),pan[i].y=rd();bb[i].d=rd();bb[i].id=i;}sort(bb+1,bb+m+1,cd);bb[0].d=bb[1].d-1;for(i=1;i<=m;i++){if(bb[i].d!=bb[i-1].d) val[++tt]=bb[i].d;pan[bb[i].id].z=tt;}for(i=1;i<=m;i++){x=pan[i].x;y=pan[i].y;if(st[x]>st[y]) swap(x,y);lc=getlca(x,y);if(lc!=x&&lc!=y){addrectangle(st[x],st[y],ed[x],ed[y],pan[i].z);}else{if(lc!=x) swap(x,y);lc=jump(y,x);if(st[lc]>1) addrectangle(1,st[y],st[lc]-1,ed[y],pan[i].z);if(ed[lc]<n) addrectangle(st[y],ed[lc]+1,ed[y],n,pan[i].z);}}for(i=1;i<=Q;i++){x=st[rd()],y=st[rd()];if(x>y) swap(x,y);nd[i]=rd();q[++tot]=opr(x,y,i,2);}solve(1,tot,1,tt);for(i=1;i<=Q;i++) printf("%d\n",ans[i]);return 0;
}

轉載于:https://www.cnblogs.com/acha/p/6278780.html

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

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

相關文章

離散元 python_剛開始學習離散元軟件Yade,有什么建議?

用Yade-DEM 做過博士期間的部分工作&#xff0c;也是從毫無所知到算是入門&#xff0c;分享一點我的學習過程&#xff0c;為那些剛接觸Yade的同學提供些許參考&#xff0c;希望對大家有幫助。0. Yade 簡介Yade 是一個用于離散元分析的開源平臺&#xff0c;是法國Lab 3SR-Grenob…

leetcode529. 掃雷游戲(dfs)

讓我們一起來玩掃雷游戲&#xff01; 給定一個代表游戲板的二維字符矩陣。 ‘M’ 代表一個未挖出的地雷&#xff0c;‘E’ 代表一個未挖出的空方塊&#xff0c;‘B’ 代表沒有相鄰&#xff08;上&#xff0c;下&#xff0c;左&#xff0c;右&#xff0c;和所有4個對角線&#…

redhat6 刪除mysql_Red Hat enterprise linux 6卸載默認安裝的 mysql

因為Red Hat enterprise linux 6 自帶了一個mysql&#xff0c;所以當你安裝新的mysql時&#xff0c;就會提示錯誤如&#xff1a;error&#xff1a;Failed dependencies&#xff1a;MySQL conflicts with mysql-5.1.47-4.el6.i686rmp -qa mysql 可以看到安裝的mysql于是將自帶的…

swift通知欄推送_如何使用Swift使用推送通知構建食品交付應用

swift通知欄推送by Neo Ighodaro由新Ighodaro 如何使用Swift使用推送通知構建食品交付應用 (How to build a food delivery app with push notifications using Swift) A basic understanding of Swift and Node.js is needed to follow this tutorial.要學習本教程&#xff0…

Jenkins持續集成實踐之java項目自動化部署

關于Linux安裝Jenkins可以參考我的這篇博文Ubuntu16.04環境安裝jenkins 1.安裝部署插件 進入插件管理&#xff0c;并搜索該插件Deploy to container Plugin進行安裝 &#xff0c;下載地址為&#xff1a;https://wiki.jenkins-ci.org/display/JENKINS/DeployPlugin 2.安裝完后&a…

云計算時代企業內部IT人員的新定位

本文講的是云計算時代企業內部IT人員的新定位&#xff0c;【IT168 云計算頻道】漸漸的云計算熱起來&#xff0c;但是怎么去嚴格定義云計算&#xff0c;還是沒有一個統一的說法&#xff0c;最常用的就是舉例子的方式來說什么是云計算&#xff0c;最常用來打比方的是電力&#xf…

Java 多線程 筆記 轉自http://www.cnblogs.com/lwbqqyumidi/p/3804883.html

多線程作為Java中很重要的一個知識點&#xff0c; 一.線程的生命周期及五種基本狀態 關于Java中線程的生命周期&#xff0c;首先看一下下面這張較為經典的圖&#xff1a; 上圖中基本上囊括了Java中多線程各重要知識點。掌握了上圖中的各知識點&#xff0c;Java中的多線程也就基…

leetcode207. 課程表(dfs/bfs)

你這個學期必須選修 numCourse 門課程&#xff0c;記為 0 到 numCourse-1 。 在選修某些課程之前需要一些先修課程。 例如&#xff0c;想要學習課程 0 &#xff0c;你需要先完成課程 1 &#xff0c;我們用一個匹配來表示他們&#xff1a;[0,1] 給定課程總量以及它們的先決條件…

r.java是什么_R.java文件介紹

http://blog.chinaunix.net/uid-21411227-id-4133828.html注意&#xff1a;R.java文件不能手動修改。1. HelloWorld工程中的R.java文件解析package com.android.hellworld;public final class R {public static final class attr {}public static final class drawable {public…

python qt 拖拽組件使用方法_Python QT組件庫qtwidgets的使用

雖然Qt提供了不少現成的組件&#xff0c;但是在Python中使用PyQt5或PySide2進行圖形界面程序開發的過程&#xff0c;還是免不了要根據自己的需求組合一些小部件以形成新的自定義組件。最近州的先生在寫一個桌面圖形界面的登錄密碼框的過程中&#xff0c;發現了這樣一個小巧的自…

get與post區別

兩種 HTTP 請求方法&#xff1a;GET 和 POST 在客戶機和服務器之間進行請求-響應時&#xff0c;兩種最常被用到的方法是&#xff1a;GET 和 POST。 GET - 從指定的資源請求數據。POST - 向指定的資源提交要被處理的數據GET 方法 請注意&#xff0c;查詢字符串&#xff08;名稱/…

java 實現 sql join_Sql 數據庫 join 連接

sql里面有兩個連接一個是union&#xff0c;另一個就是join他們兩個的區別:union 連接的是行 是一行一行的連 而 join 連接的是列(字段) (他們倆的區別暫時就就知道這點)join連接的使用的前提:1.必須要有至少一個表(一個表可以用自連接)2.必須要有相關聯的列(字段)&#xff…

開源與云計算

本文講的是開源與云計算&#xff0c;【IT168 資訊】幾年來我一直擔心開源運動可能會遭受Kim Stanley Robinson在“Green Mars”中精辟論述的問題&#xff1a;“歷史的浪潮比我們做得還要快。”創新者被拋在后面&#xff0c;他們曾經改變的世界拿著他們的主意向著意想不到的方向…

c/c++連接mysql數據庫設置及亂碼問題(vs2013連接mysql數據庫,使用Mysql API操作數據庫)...

我的安裝環境&#xff1a; (1)vs2013(32位版) (vs2013只有32位的 沒有64位的&#xff0c;但是它可以編譯出64位的程序) &#xff1b; (2)mysql-5.7.15(64位) vs2013中的設置&#xff08;按步驟來&#xff0c;順序不要亂&#xff09; (1)首先在vs2013中新建一個控制臺程序 Mysq…

leetcode542. 01 矩陣(bfs/dp)

給定一個由 0 和 1 組成的矩陣&#xff0c;找出每個元素到最近的 0 的距離。 兩個相鄰元素間的距離為 1 。 示例 1: 輸入: 0 0 0 0 1 0 0 0 0 輸出: 0 0 0 0 1 0 0 0 0 bfs代碼 class Solution {int[][] res;public int[][] updateMatrix(int[][] matrix) {int[][] dirnew…

react本地儲存_如何使用React和本地存儲構建freeCodeCamp的配方框

react本地儲存by Edward Njoroge愛德華尼約格(Edward Njoroge) 如何使用React和本地存儲構建freeCodeCamp的配方框 (How to build freeCodeCamp’s recipe box using React and local storage) I completed my first edition of the Free Code Camp recipe box project on May…

調用接口返回500_公交卡余額查詢接口開放使用啦!

API說明本API返回數據僅支持JSON格式且會對中文進 行unicode 編碼&#xff0c;JSON格式返回數據基本格式如下&#xff1a;{"errCode": 0,"errMsg": "OK","data": {}}其中 errCode 表示請求狀態&#xff0c;0表示請求成功&#xff0c; …

stark組件開發之組合搜索基本顯示

數據的獲取&#xff0c;上一篇&#xff0c;已經有了&#xff01;然后就是&#xff0c;如何進行展示的問題。到了展示這里&#xff0c;又有了新的問題&#xff0c; 因為從數據庫&#xff0c;取得的數據。 分為 queryset 和 tuple 兩種數據結構。tuple 中&#xff0c;只是字符串。…

美國安全廠商在云安全上的最新進展

本文講的是美國安全廠商在云安全上的最新進展&#xff0c;【IT168 資訊】優利系統公司日前推出了一系列云產品和服務&#xff0c;并且著重強調企業創建私有云&#xff0c;公有云或混合云工具的安全。  Unisys Secure Cloud是優利系統公司推出的一種管理云服務&#xff0c;承諾…

hessianphp java_hessian 在PHP中的使用

一、hessian是什么&#xff1f;看到這個單詞我還不知道怎么讀&#xff0c;音標是[hes]讀黑森。Hessian是一個輕量級的遠程的數據交換工具&#xff0c;使用簡單的方法提供了RMI(遠程方法調用)的功能. 相比WebService&#xff0c;Hessian更簡單、快捷。采用的是二進制RPC協議&…