傳送門:
給你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...