bzoj1146整體二分+樹鏈剖分+樹狀數組

来源:http://www.cnblogs.com/gcyyzf/archive/2016/12/21/6209455.html
-Advertisement-
Play Games

其實也沒啥好說的 用樹狀數組可以O(logn)的查詢 套一層整體二分就可以做到O(nlngn) 最後用樹鏈剖分讓序列上樹 ...


其實也沒啥好說的

用樹狀數組可以O(logn)的查詢

套一層整體二分就可以做到O(nlngn)

最後用樹鏈剖分讓序列上樹

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 using namespace std;
  6 inline int read()
  7 {
  8     int x=0,f=1,ch=getchar();
  9     while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
 10     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 11     return x*f;
 12 }
 13 int n,q;
 14 int data[80005];
 15 inline void add(int x,int i)
 16 {
 17     while(x<=n)
 18     {
 19         data[x]+=i;
 20         x+=x&(-x);
 21     }
 22 }
 23 inline int query(int x)
 24 {
 25     int res=0;
 26     while(x>=1)
 27     {
 28         res+=data[x];
 29         x-=x&(-x);
 30     }
 31     return res;
 32 }
 33 int h[80005],next[160005],to[160005],cnt;
 34 inline void addedge(int x,int y)
 35 {
 36     next[cnt]=h[x];
 37     to[cnt]=y;
 38     h[x]=cnt;
 39     cnt++;
 40 }
 41 int size[80005],hson[80005],dep[80005],f[80005];
 42 inline void bfs(int x,int fa)
 43 {
 44     int i;
 45     size[x]=1;
 46     for(i=h[x];i!=-1;i=next[i])
 47     {
 48         if(to[i]==fa)
 49         {
 50             continue;
 51         }
 52         dep[to[i]]=dep[x]+1;
 53         f[to[i]]=x;
 54         bfs(to[i],x);
 55         size[x]+=size[to[i]];
 56         if(size[to[i]]>size[hson[x]])
 57         {
 58             hson[x]=to[i];
 59         }
 60     }
 61 }
 62 int up[80005],first[80005],tim;
 63 inline void spfa(int x,int tt)
 64 {
 65     tim++;
 66     first[x]=tim;
 67     up[x]=tt;
 68     if(!hson[x])
 69     {
 70         return ;
 71     }
 72     spfa(hson[x],tt);
 73     int i;
 74     for(i=h[x];i!=-1;i=next[i])
 75     {
 76         if(to[i]==f[x]||to[i]==hson[x])
 77         {
 78             continue;
 79         }
 80         spfa(to[i],to[i]);
 81     }
 82 }
 83 inline int lca(int x,int y)
 84 {
 85     int res=0;
 86     while(up[x]!=up[y])
 87     {
 88         if(dep[up[x]]<dep[up[y]])
 89         {
 90             swap(x,y);
 91         }
 92         res+=query(first[x])-query(first[up[x]]-1);
 93         x=f[up[x]];
 94     }
 95     if(dep[x]>dep[y])
 96     {
 97         swap(x,y);
 98     }
 99     res+=query(first[y])-query(first[x]-1);
100     return res;
101 }
102 struct stu
103 {
104     int op,l,r,id,x;
105 };
106 stu a[240005];
107 int ans[80005];
108 int m[240005];
109 stu q1[240005],q2[240005];
110 inline void erfen(int l,int r,int sl,int sr)
111 {
112     if(sl>sr)
113     {
114         return ;
115     }
116     if(l==r)
117     {
118         int i;
119         for(i=sl;i<=sr;i++)
120         {
121             if(a[i].op!=2)
122             {
123                 continue;
124             }
125             ans[a[i].id]=l;
126         }
127         return ;
128     }
129     int i,mid=(l+r)>>1,k,cnt1=0,cnt2=0;
130     for(i=sl;i<=sr;i++)
131     {
132         if(a[i].op==0)
133         {
134             if(a[i].x<=mid)
135             {
136                 add(first[a[i].l],1);
137                 m[i]=0;
138             }
139             else
140             {
141                 m[i]=1;
142             }
143             continue;
144         }
145         if(a[i].op==1)
146         {
147             if(a[i].x<=mid)
148             {
149                 add(first[a[i].l],-1);
150                 m[i]=0;
151             }
152             else
153             {
154                 m[i]=1;
155             }
156             continue;
157         }
158         if(a[i].op==2)
159         {
160             k=lca(a[i].l,a[i].r);
161             if(k<a[i].x)
162             {
163                 a[i].x-=k;
164                 m[i]=1;
165             }
166             else
167             {
168                 m[i]=0;
169             }
170         }
171     }
172     for(i=sl;i<=sr;i++)
173     {
174         if(a[i].op==0)
175         {
176             if(a[i].x<=mid)
177             {
178                 add(first[a[i].l],-1);
179             }
180         }
181         if(a[i].op==1)
182         {
183             if(a[i].x<=mid)
184             {
185                 add(first[a[i].l],1);
186             }
187         }
188         if(m[i]==0)
189         {
190             cnt1++;
191             q1[cnt1]=a[i];
192         }
193         else
194         {
195             cnt2++;
196             q2[cnt2]=a[i];
197         }
198     }
199     for(i=1;i<=cnt1;i++)
200     {
201         a[sl+i-1]=q1[i];
202     }
203     for(i=1;i<=cnt2;i++)
204     {
205         a[sl+cnt1+i-1]=q2[i];
206     }
207     erfen(l,mid,sl,sl+cnt1-1);
208     erfen(mid+1,r,sl+cnt1,sr);
209 }
210 int p[80005];
211 int main()
212 {
213     memset(h,-1,sizeof(h));
214     memset(ans,0x3f,sizeof(ans));
215     n=read(),q=read();
216     int i,x,y,tail=0,k,o;
217     for(i=1;i<=n;i++)
218     {
219         x=read();
220         tail++;
221         a[tail].op=0,a[tail].l=i,a[tail].x=x;
222         p[i]=x;
223     }
224     for(i=1;i<n;i++)
225     {
226         x=read(),y=read();
227         addedge(x,y);
228         addedge(y,x);
229     }
230     dep[1]=1;
231     bfs(1,-1);
232     spfa(1,1);
233     for(i=1;i<=n;i++)
234     {
235         add(first[i],1);
236     }
237     for(i=1;i<=q;i++)
238     {
239         k=read(),x=read(),y=read();
240         if(k==0)
241         {
242             tail++;
243             a[tail].op=1;a[tail].l=x,a[tail].x=p[x];
244             tail++;
245             a[tail].op=0;a[tail].l=x;a[tail].x=y;
246             p[x]=y;
247         }
248         else
249         {
250             o=lca(x,y);
251             if(o<k)
252             {
253                 ans[i]=-1;
254                 continue;
255             }
256             k=o-k+1;
257             tail++;
258             a[tail].op=2,a[tail].l=x,a[tail].r=y,a[tail].x=k;
259             a[tail].id=i;
260         }
261     }
262     memset(data,0,sizeof(data));
263     erfen(0,100000000,1,tail);
264     for(i=1;i<=q;i++)
265     {
266         if(ans[i]==0x3f3f3f3f)
267         {
268             continue;
269         }
270         if(ans[i]==-1)
271         {
272             puts("invalid request!");
273         }
274         else
275         {
276             printf("%d\n",ans[i]);
277         }
278     }
279     return 0;
280 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 目錄 前言 OAuth2.0簡介 授權模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模擬OpenID認證 通過authorization code授權模式申請令牌 通過implicit授權模式申請令牌 通過password模式申請令牌 通過c ...
  • 你真的懂異常(Exception)嗎? 目錄 異常介紹 異常的特點 怎樣使用異常 處理異常的 try-catch-finally 捕獲異常的 Catch 塊 釋放資源的 Finally 塊 捕獲異常的 Catch 塊 釋放資源的 Finally 塊 一、異常介紹 我們平時在寫程式時,無意中(或技術不 ...
  • 隨著公司業務的發展,網站的日活數也逐漸增多,以前只需要考慮將所需要的功能實現就行了,當日活越來越大的時候,就需要考慮對伺服器的資源使用消耗情況有一個清楚的認知。 最近老是發現資料庫的連接數如果幾天不重啟伺服器,就經常會發現有很多sleep很久的資料庫連接,對資料庫伺服器的性能有較大的影響。所以需要知 ...
  • 一.簡介 在網頁應用中,你經常需要在處理完表單或其它類型的用戶輸入後,顯示一個通知消息(也叫做“flash message”)給用戶 對於這個功能,Django 提供基於Cookie 和會話的消息,無論是匿名用戶還是認證的用戶。 其消息框架允許你臨時將消息存儲在請求中,併在接下來的請求(通常就是下一 ...
  • 線程可以理解為下載的通道,一個線程就是一個文件的下載通道,多線程也就是同時開啟好幾個下載通道。當伺服器提供下載服務時,使用下載者是共用帶寬的,在優先順序相同的情況下,總伺服器會對總下載線程進行平均分配。不難理解,如果你線程多的話,那下載的越快。 現流行的下載軟體都支持多線程,且支持中途暫停下載,再次開 ...
  • 如果運行後如圖的錯,需要進行如下操作來解決: a:打開cmd,輸入netstat -ano 找到本地地址為8080的最後一項的數字,這個數字就是埠號。 b:再輸入taskkill /t /pid 埠號數字 /f 來關閉此進程。 c:註意每個命令後面不要加 ; 結尾,運行以上命令再重新運行工程即可 ...
  • 本文地址 可以拜讀: 從零開始學 Java 分享提綱: 1.java數據結構 1. java數據結構 1)【概述】 Java工具包提供了強大的數據結構。在Java中的數據結構主要包括以下幾種介面和類: 枚舉(Enumeration) 位集合(BitSet) 向量(Vector) 棧(Stack) 字 ...
  • 1、sdk返回值不是int型 1.1 登錄函數調用 def login(ip, port, username, password, device_info, error_code):"""LLONG CLIENT_Login(char *pchDVRIP, WORD wDVRPort,char *p... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...