1. 程式人生 > >Sky of war's Blog

Sky of war's Blog

普通互動題

UR #10 世界線

  • 有一個長度為n的排列A,而你需要求出它
  • 你可以進行兩輪實驗,每輪開始有一個2n個點的圖,且有邊(i, A_i+n),每輪實現分為兩個部分,第一個部分你可以在[1,n]的定點間連一些邊,,第二個部分你可以詢問[n+1,2n]的頂點間的聯通關係。
  • 加邊和詢問的數目都不得超過2\cdot 10^6
  • n \le 10^4

每個聯通塊內的點都是不可區分的

試著採用連通塊大小傳遞一些資訊

如果在兩輪種都給每一個i分配不同的大小,就可以區分開來

第一次連所有橫邊,知道了縱座標大小

第二次連所有豎邊,知道了橫座標

如何把圖分為若干個聯通塊?

聯通塊數目只有2\cdot \sqrt{n}級別,暴力即可

對於每個聯通塊詢問一次即可

加邊是O(n)

IOI2014 Game

  • Bob有一個圖,Alice想向Bob詢問這個圖是否完全連通,但Alice每次只能詢問一條邊是否存在,Bob想最大化Alice的詢問數,簡單來說,Bob需要讓Alice至少問n \cdot \dfrac{n-1}{2}
    次,且在這之前Alice都無法確定圖是否完全連通,為此Bob甚至可以在Alice詢問之前更改圖,但不能違背之前的回答
  • 你需要按Bob來回答互動庫Alice的詢問
  • n \le 1500

程式碼很好寫

#include "game.h"
int c[1600];
void initialize(int n){}
int hasEdge(int u,int v){if(u<v)u=v;return ++c[u]==u;}

Secret

  • 互動庫給出一個加法運算(滿足結合律但不一定滿足交換律),給出一個序列A,每次詢問一個區間求區間和(使用互動庫中的加法運算)
  • 要求一次詢問只能呼叫一次加法運算,且初始化過程中呼叫加法運算的次數不超過8000.
  • N \le 1000, M \le 10^4

首先此題不能用樹狀陣列,只能用線段樹(沒有減法運算)

建立一個線段樹,不維護區間和,對於每個區間節點維護中點向前的字首和與向後的字尾和

Oath

  • 給一個運算,有結合率,有一個序列剛開始為空,有三個操作:
  1. 在某個版本的序列末尾新增一個元素得到新版本
  2. 在某個版本的序列末尾刪除一個元素得到新版本
  3. 詢問某個版本的序列區間做運算的結果
  • 每個詢問只允許呼叫一次運算
  • 互動庫會根據呼叫運算的次數生成資料(比如互動庫檢測到你刪除所用的操作較多,就會生成一坨刪除操作來把你卡掉)
  • m \le 3\times 10^5

據lzz所說他寫了19K的互動庫就為了卡掉各種時間複雜度不是期望的演算法(

很顯然這是一道強制線上的題目,所以....

一個顯然的想法就是建線段樹(很容易炸)

如果只有插入,沒有刪除的時候這個複雜度是對的

但是有了刪除之後複雜度就變成均攤的了,就可以卡掉,使得變成非均攤

可以把2號操作變成查詢歷史版本

可以把3號操作變成詢問某個版本的字尾和

用Treap維護

每個節點維護向左的字尾和與右子樹和

加節點為O(1)

Treap有旋轉,旋轉的時候直接把子樹暴力重構一下,子樹期望大小是log n

Treap是重量平衡的

插入節點的時候直接把右子樹加上這個節點就可以了

Treap是個期望資料結構,所以不會被卡,重構的概率非常低

通訊題

定義:有兩個程式,第一個程式獲得一些輸入,處理出一些格式的資訊給第二個程式,第二個程式獲取這些資訊和一些輸入,輸出詢問所求的答案

有損資訊壓縮

  • 對長度為10000的英文文章進行壓縮再解壓,加密前和加密後的字元都是小寫字母和" ",",","."。傳輸過程中每一個字元有\dfrac{1}{10}的概率損壞

做法比較詭異(lzz說的)

字符集為29,看成0~28

每18位一組,傳29位過去

接收方只要在29位中保留了18位就能還原

把18位看成一個17次多項式,28位就相當於點值

只要知道18個點值就可以插值插回這個多項式

正確率?

考慮單個損壞超過9位的概率,總正確率是99.44\%

US Camp 16

  • N張卡片傳輸資訊,每張卡片可能朝上或者朝下,傳輸過程中可能整體顛倒,求傳輸資訊量和構造方案
  • N \le 60

US Camp 17

  • N張卡片傳輸資訊,每張卡片可能朝上或者朝下,傳輸過程中可能把最下面一張放到上面(只放一次),最大化傳遞資訊數目
  • N \le 22

對於每個串考慮迴圈節

如果迴圈節是奇數

把這個串右移2位,4位,6位,以此類推

最小表示法的思想

Coins

  • 給一個8 \times 8的棋盤,編號從063,每個格子上有一個硬幣,你可以翻轉至多1枚硬幣,傳輸一個063之間的整數

Amusement Park

  • Alice和Bob會獲得同一張無向圖(點和邊的編號都相同),此外Alice還會獲得一個[0,2^{60})的整數X,Bob獲得他現在的位置P
  • 現在Alice必須在一個點上放一個Bit,而Bob可以移動不超過120次並獲得經過的所有點上Alice放的Bit.
  • Alice需要把X傳送給Bob。
  • 60 \le N \le 10000; M \le 20000

先求最小生成樹

從根開始隨便找一個大小為60的聯通塊,DFS

Goodbye Yiwei E新年的賀電(UOJ178)

  • 傳輸一個大小為2^{10}2^{32}\rightarrow 2^{10}的map

一個顯然的做法就是取一個比較大的模數,大概在10^6

把map看成多項式

插值插回去即可

大概能獲得40~50分