2017 ICPC網路賽(西安)--- Xor

来源:https://www.cnblogs.com/chen9510/archive/2019/05/01/10800247.html
-Advertisement-
Play Games

題目連接 Problem There is a tree with n nodes. For each node, there is an integer value ai, (1≤ai​≤1,000,000,000 for 1≤i≤n). There is q queries which are ...


題目連接

 

Problem

There is a tree with n nodes. For each node, there is an integer value ai, (1ai1,000,000,000 for 1in). There is q queries which are described as follow:

Assume the value on the path from node a to node b is t0,t1,tm. You are supposed to calculate t0 xor tk xor t2k xor ... xor tpk (pkm).

Input Format

There are multi datasets. (n50,000,q500,000).

For each dataset: In the first n1 lines, there are two integers u,v, indicates there is an edge connect node uand node v.

In the next nn lines, There is an integer ai (1ai1,000,000,000).

In the next q lines, There is three integers a,b and k. (1a,b,kn).

Output Format

For each query, output an integer in one line, without any additional space.

樣例輸入

5 6
1 5 4 1 2 1 3 2 19 26 0 8 17 5 5 1 1 3 2 3 2 1 5 4 2 3 4 4 1 4 5

樣例輸出

17
19 26 25 0 19

題意: 有一棵n個節點的樹,每個節點上有個權值vi,現在q次詢問:節點a到節點b的路徑上,從a開始每k個節點跳一次所經過的所有節點的異或值為(a0,ak,a2k,a3k...)?

思路: 建樹,倍增演算法記錄每個節點的深度和2^i的祖先,處理並記錄每個節點i到根節點間隔為k(1,2,3……100)的異或值dp[i][k]。當k<=100時,使用記錄的異或值dp計算a到b間隔為k的異或值;當k>100時,直接從a走到b,每次跳動使用倍增的信息(快速跳動)。

註:這道題是2017年打西安網路賽時沒過的題,當時其實代碼寫的很接近了,測數據都沒問題,一直檢查不出來,我也一直惦記著這道題。本科畢業後讀研,又看過一次還是沒找出原因,今天五一放假,沒啥事兒,我又看了一遍當時寫的代碼,突然發現沒初始化fa數組,心想難道是計蒜客網站編譯器不是預設未初始化的值為0?加上fa的初始化後提交了一把,過了!!!
My God! 心心念念的這道題竟然是這個原因沒過,氣呀。不過,今天總算是找到原因了,哈哈~ 又一次想起來西安正式賽的時候,一道銅牌題沒過“LOL BP”導致沒拿到銀牌,可惜的是當時的銀牌題都過了,唉~ 與銀失之交臂。現在是研究生了,很少刷題了,以後要少看劇,多看看相關的圖形學的專業書,充實自己,找個好工作。

代碼如下:
  1 //https://nanti.jisuanke.com/t/A1273 《Xor》
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <cstdio>
  5 #include <cstring>
  6 using namespace std;
  7 const int N = 5e4 + 5;
  8 int fa[N][20], deep[N], head[N];
  9 int v[N], cnt;
 10 bool vis[N];
 11 int dp[N][105];
 12 struct data
 13 {
 14     int to, next;
 15 }e[2 * N];
 16 
 17 void insert(int u, int v)
 18 {
 19     e[++cnt].to = v;
 20     e[cnt].next = head[u];
 21     head[u] = cnt;
 22     e[++cnt].to = u;
 23     e[cnt].next = head[v];
 24     head[v] = cnt;
 25 }
 26 int cal(int x, int t)
 27 {
 28     for (int i = 0; i <= 19; i++)
 29         if (t&(1 << i)) x = fa[x][i];
 30     return x;
 31 }
 32 void dfs(int x)
 33 {
 34     vis[x] = 1;
 35     for (int i = 1; i <= 19; i++)
 36     {
 37         if (deep[x]<(1 << i))break;
 38         fa[x][i] = fa[fa[x][i - 1]][i - 1];///倍增處理祖先信息
 39     }
 40     for (int k = 1; k <= 100; k++)
 41     {
 42         dp[x][k] = v[x];
 43         if (deep[x]<k) continue;
 44         int p = cal(x, k);
 45         dp[x][k] ^= dp[p][k];
 46     }
 47     for (int i = head[x]; i; i = e[i].next)
 48     {
 49         if (vis[e[i].to]) continue;
 50         deep[e[i].to] = deep[x] + 1;
 51         fa[e[i].to][0] = x;
 52         dfs(e[i].to);
 53     }
 54 }
 55 int lca(int x, int y)///求lca
 56 {
 57     if (deep[x]<deep[y]) swap(x, y);
 58     x = cal(x, deep[x] - deep[y]);
 59     for (int i = 19; i >= 0; i--)
 60         if (fa[x][i] != fa[y][i])
 61         {
 62             x = fa[x][i];
 63             y = fa[y][i];
 64         }
 65     if (x == y)return x;
 66     else return fa[x][0];
 67 }
 68 
 69 void init()
 70 {
 71     cnt = 0;
 72     memset(head, 0, sizeof(head));
 73     memset(vis, 0, sizeof(vis));
 74     memset(dp, 0, sizeof(dp));
 75     memset(deep, 0, sizeof(deep));
 76     memset(fa,0,sizeof(fa));
 77 }
 78 
 79 int main()
 80 {
 81     int n, q;
 82     while (scanf("%d%d", &n, &q) != EOF)
 83     {
 84         init();
 85         for (int i = 1; i<n; i++)
 86         {
 87             int x, y; scanf("%d%d", &x, &y);
 88             insert(x, y);
 89         }
 90         for (int i = 1; i <= n; i++) scanf("%d", &v[i]);
 91         dfs(1);
 92         while (q--)
 93         {
 94             int x, y, k; scanf("%d%d%d", &x, &y, &k);
 95             int pa = lca(x, y);
 96             if (k <= 100)
 97             {
 98                 int ans = dp[x][k];
 99                 int h = (deep[x] - deep[pa]) % k;
100                 int t = k - h;
101                 if (deep[pa] >= t)
102                 {
103                     int l = cal(pa, t);
104                     ans ^= dp[l][k];
105                 }
106                 int r = k - h;
107                 t = deep[y] - deep[pa] - r;
108                 if (t<0) goto endw2;
109                 t %= k;
110                 y = cal(y, t);///
111                 ans ^= dp[y][k];
112                 t = k - r;
113                 if (deep[pa] >= t)
114                 {
115                     int l = cal(pa, t);
116                     ans ^= dp[l][k];
117                 }
118             endw2:;
119                 printf("%d\n", ans);
120             }
121             else
122             {
123                 int ans = 0;
124                 while (1)
125                 {
126                     ans ^= v[x];
127                     if (deep[x] - k<deep[pa]) break;
128                     x = cal(x, k);
129                 }
130                 int l = k - (deep[x] - deep[pa]);
131                 int t = deep[y] - deep[pa] - l;
132                 if (t<0) goto endw;
133                 t %= k;
134                 y = cal(y, t);
135                 while (1)
136                 {
137                     ans ^= v[y];
138                     if (deep[y] - k <= deep[pa]) break;
139                     y = cal(y, k);
140                 }
141             endw:;
142                 printf("%d\n", ans);
143             }
144         }
145     }
146     return 0;
147 }
148 /**
149 8 11
150 1 2
151 2 3
152 2 4
153 1 5
154 5 6
155 5 7
156 4 8
157 3 5 6 2 7 0 1 10
158 1 8 1
159 answer=14
160 */

 




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

-Advertisement-
Play Games
更多相關文章
  • 工作一年,維護工程項目的同時一直寫CURD,最近學習DDD,結合之前自己寫的開源項目,深思我們這種CURD的編程方式的弊端,和朋友討論後,發現我們從來沒有面向對象開發,所以寫這篇文章,希望更多人去思考面向對象,不只是停留在背書上 下麵以開發一個常規的登錄模塊為例,模擬實現一個登錄功能,一步步地去說明 ...
  • 5.1自學自我總結 1.關於數據類型補充 在整列中除了int數據類型,還要long數據數據類型 ling為長數字 另外還有一種未被提到的數據類型為虛數complex在python中虛數為5j來表示 個個數字函數的也可以相互裝換 如下 2.關於字元串 字元串取值 3.不同類型變數拼接新增方法 五一快樂 ...
  • 關於Java 鎖的知識整理與回顧(個人筆記): 鎖有哪些,分別用來幹嘛? Java實現鎖有兩種方式,synchronized關鍵字和Lock (1)Lock(可判斷鎖狀態) Lock是基於JDK層面實現。Lock的實現主要有ReentrantLock、ReadLock和WriteLock(引出鎖分類 ...
  • 利用map和reduce編寫一個str2float函數,把字元串'123.456'轉換成浮點數123.456。 思路:計算小數位數 >將字元串中的小數點去掉 >字元串轉換為整數 >整數轉換為浮點數 知識點: 1、將字元串中的小數點去掉可以用切片的方法。 2、reduce把一個函數作用在一個序列[x1 ...
  • 最近在web項目中,客戶端註冊時需要通過郵箱驗證,伺服器就需要向客戶端發送郵件,我把發送郵件的細節進行了簡易的封裝: 最近在web項目中,客戶端註冊時需要通過郵箱驗證,伺服器就需要向客戶端發送郵件,我把發送郵件的細節進行了簡易的封裝: 在maven中需要導入: 1 <!--Email--> 2 <d ...
  • 7.1 包 7.1.1 看一個應用場景 現在有兩個程式員共同開發一個項目,程式員xiaoming希望定義一個類取名Dog,程式員xiaohong也想定一個類也叫Dog,兩個程式員還為此吵了起來,該怎麼辦? >使用包即可解決這個問題 7.1.2 回顧-Java包的三大作用 1) 區分相同名字的類 2) ...
  • 本篇文章有如下方面: ① equals()與‘==’的區別; ② equals()方法的重寫規則(5條); ③ 為什麼重寫equals()的同時還需要重寫hashCode(); ④ JDK 7中對hashCode()方法的改進; ⑤ Java API文檔中關於hashCode()方法的規定; ⑥ 重... ...
  • 在上一章中,我們創建了一個工作隊列,工作隊列模式的設想是每一條消息只會被轉發給一個消費者。本章將會講解完全不一樣的場景: 我們會把一個消息轉發給多個消費者,這種模式稱之為發佈-訂閱模式。 為了闡述這個模式,我們將會搭建一個簡單的日誌系統,它包含兩種程式:一種發送日誌消息,另一種接收並列印日誌消息。在 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...