Sky of war's Blog
普通互動題
UR #10 世界線
- 有一個長度為n的排列A,而你需要求出它
- 你可以進行兩輪實驗,每輪開始有一個2n個點的圖,且有邊,每輪實現分為兩個部分,第一個部分你可以在的定點間連一些邊,,第二個部分你可以詢問的頂點間的聯通關係。
- 加邊和詢問的數目都不得超過
每個聯通塊內的點都是不可區分的
試著採用連通塊大小傳遞一些資訊
如果在兩輪種都給每一個分配不同的大小,就可以區分開來
第一次連所有橫邊,知道了縱座標大小
第二次連所有豎邊,知道了橫座標
如何把圖分為若干個聯通塊?
聯通塊數目只有級別,暴力即可
對於每個聯通塊詢問一次即可
加邊是
IOI2014 Game
- Bob有一個圖,Alice想向Bob詢問這個圖是否完全連通,但Alice每次只能詢問一條邊是否存在,Bob想最大化Alice的詢問數,簡單來說,Bob需要讓Alice至少問
- 你需要按Bob來回答互動庫Alice的詢問
程式碼很好寫
#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.
首先此題不能用樹狀陣列,只能用線段樹(沒有減法運算)
建立一個線段樹,不維護區間和,對於每個區間節點維護中點向前的字首和與向後的字尾和
Oath
- 給一個運算,有結合率,有一個序列剛開始為空,有三個操作:
- 在某個版本的序列末尾新增一個元素得到新版本
- 在某個版本的序列末尾刪除一個元素得到新版本
- 詢問某個版本的序列區間做運算的結果
- 每個詢問只允許呼叫一次運算
- 互動庫會根據呼叫運算的次數生成資料(比如互動庫檢測到你刪除所用的操作較多,就會生成一坨刪除操作來把你卡掉)
據lzz所說他寫了19K的互動庫就為了卡掉各種時間複雜度不是期望的演算法(
很顯然這是一道強制線上的題目,所以....
一個顯然的想法就是建線段樹(很容易炸)
如果只有插入,沒有刪除的時候這個複雜度是對的
但是有了刪除之後複雜度就變成均攤的了,就可以卡掉,使得變成非均攤
可以把2號操作變成查詢歷史版本
可以把3號操作變成詢問某個版本的字尾和
用Treap維護
每個節點維護向左的字尾和與右子樹和
加節點為
Treap有旋轉,旋轉的時候直接把子樹暴力重構一下,子樹期望大小是log n
Treap是重量平衡的
插入節點的時候直接把右子樹加上這個節點就可以了
Treap是個期望資料結構,所以不會被卡,重構的概率非常低
通訊題
定義:有兩個程式,第一個程式獲得一些輸入,處理出一些格式的資訊給第二個程式,第二個程式獲取這些資訊和一些輸入,輸出詢問所求的答案
有損資訊壓縮
- 對長度為的英文文章進行壓縮再解壓,加密前和加密後的字元都是小寫字母和" ",",","."。傳輸過程中每一個字元有的概率損壞
做法比較詭異(lzz說的)
字符集為29,看成0~28
每18位一組,傳29位過去
接收方只要在29位中保留了18位就能還原
把18位看成一個17次多項式,28位就相當於點值
只要知道18個點值就可以插值插回這個多項式
正確率?
考慮單個損壞超過9位的概率,總正確率是
US Camp 16
- 用張卡片傳輸資訊,每張卡片可能朝上或者朝下,傳輸過程中可能整體顛倒,求傳輸資訊量和構造方案
US Camp 17
- 用張卡片傳輸資訊,每張卡片可能朝上或者朝下,傳輸過程中可能把最下面一張放到上面(只放一次),最大化傳遞資訊數目
對於每個串考慮迴圈節
如果迴圈節是奇數
把這個串右移2位,4位,6位,以此類推
最小表示法的思想
Coins
- 給一個的棋盤,編號從到,每個格子上有一個硬幣,你可以翻轉至多枚硬幣,傳輸一個到之間的整數
Amusement Park
- Alice和Bob會獲得同一張無向圖(點和邊的編號都相同),此外Alice還會獲得一個的整數,Bob獲得他現在的位置。
- 現在Alice必須在一個點上放一個Bit,而Bob可以移動不超過次並獲得經過的所有點上Alice放的Bit.
- Alice需要把傳送給Bob。
先求最小生成樹
從根開始隨便找一個大小為60的聯通塊,DFS
Goodbye Yiwei E新年的賀電(UOJ178)
- 傳輸一個大小為的的map
一個顯然的做法就是取一個比較大的模數,大概在
把map看成多項式
插值插回去即可
大概能獲得40~50分