牛客多校第3場 J 思維 樹狀陣列 二分

2022-05-21 02:11:13 字數 2330 閱讀 8003

傳送門:

給你q個詢問,和乙個佇列容量f

詢問有兩種操作:

0.訪問操作,如果詢問的name在佇列中存在的話,那麼就輸出佇列中name對應的val值,然後將佇列中name對應的元素扔到佇列的尾部去,否則就直接將該元素插入到佇列的尾部去

1.插入操作,得到佇列中對應的name元素的v值為k,查詢第k+v個元素的v值是多少

已知,對於插入操作,我們需要很快的查詢對應的name值的val

所以我們考慮map對映,為了解決string過慢的問題,我們將stringhash成乙個unsigned long long的值

我們記錄有多少個數被插入了,還有每個點的絕對座標,如果在0操作中 點x被丟棄了,那麼我們就對x位置打上標記1,這樣,在我們查詢第y個操作時,實際上,這個y操作對於的位置就是 查詢這個y對應的pos位減去當前位置之前被刪掉的數的和加上 v值

我們用tot統計被插入數的數量,因為一開始就是空串,所以tot實際上就代表佇列中有多少個數,如果tot>m,我們就丟棄隊頭的元素

對於每次查詢,我們是找當前位置向左的位置,因為我們刪除的數實際上只是給打上了乙個+1的標記,所以我們需要找到左邊真正存在的那個數,這個右端點不太好找,所以我們考慮二分,二分當前位置是否是第r個點

check就直接用二分出來的mid減去mid之前的丟棄的個數,如果這個個數》當前個數,那麼就改變二分的上界r,否則改變二分的下界l

然後就可以得到滿足真正的pos+1的位置的值的數了

emmm複雜度應該是兩個log 被卡map的操作然後有迭代器 實現mp的操作,這樣卡過去了 600+ms 海星吧

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

typedef unsigned long long ull;

#define ls rt<<1

#define rs rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define bug printf("*********\n")

#define fin freopen("input.txt","r",stdin);

#define fon freopen("output.txt","w+",stdout);

#define io ios::sync_with_stdio(false),cin.tie(0)

#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"

#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"

#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<>= 1;

} return ans;

}int lowbit(int x)

int bit[maxn];

void add(int pos, int val)

}int query(int pos)

return res;

}void clear(int pos, int mm)

}ull hash(char *x)

return h;

}int op;

int v;

int val[maxn];

ull hname[maxn];

char name[20];

mapmp;

int get_pos(int p, int tot) else

}assert(pos != -1);

return pos;

}map:: iterator iter;

int main() else

index++;

mp[h] = index;

hname[index] = h;

val[index] = v;

}} else

int vv = iter->second;

int pos = vv - query(vv - 1);

pos += v;

if(pos > tot || pos < 1) else }}

}return 0;

}

牛客多校第3場 C Shuffle Cards

之所以補這題,是因為第一次使用rope,這是乙個可持久化平衡樹。不過本題沒有用到可持久化就是了,平衡樹的split和merge。include using namespace gnu cxx 下標從0開始,不可以cin,可以cout 由於rope的底層實現,insert,erase,get都是log...

牛客多校第5場D Drop Voicing

有乙個1 n的排列,有以下兩種操作 drop 2 將倒數第二個數放到開頭,前面的數向後平移 invert 將倒數第二個數放到開頭,前面的數向後平移 若干連續的drop 2稱為multi drop。計算要使該排列排成1 n所需的最少的multi drop的數量。首先invert可以無條件使用,那麼就可...

牛客多校第二場 J farm

輸入描述 the first line of input contains 3 integers n,m,t n m 1000000,t 1000000 for the next n lines,each line contains m integers in range 1,n m denotin...