考場用的set,代碼複雜度很低,時間複雜度$O(sum log)$,一發過了大樣例,覺得1e6的數據很穩了就沒再管(而後就掛掉了……)ios
考後把set化成unordered_set就A了。其實$sum log$的時間複雜度是沒有什麼問題,只不過有個細節沒有考慮好,考場上覺得set賦值和clear的複雜度是O1的,而後就掛掉了。spa
其實用unordered_set複雜度也不是很對,瓶頸在於賦值和清空。blog
考慮用set s維護,順便用一個變量sum維護set中數據的和。get
對於操做1;考慮B集合中的變量a,在s中find(a),若不存在,插入,sum+=a;string
對於操做2:sum=0。考慮B集合中的變量a,在s中find(a),若存在,在另一個set s1插入a,sum+=a。s=s1,s1.clear()。本人死於此。it
對於操做3,4:對於s中每一個數都進行操做顯然不可行,那麼考慮用一個變量cal維護總體變化值,只須要給操做1,2的a減cal再進行操做便可。io
以後考慮怎麼不用set實現:class
咱們並不要求數據有序,顯然能夠用unordered_set,可是其實能夠用常數更小的Hash_map實現。stream
以後考慮以前的賦值和清空操做:記錄一個時間戳便可。變量
#include<iostream> #include<cstring> #include<cstdio> #include<unordered_set> #define LL long long using namespace std; char xch,xB[1<<15],*xS=xB,*xTT=xB; #define getc() (xS==xTT&&(xTT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xTT)?0:*xS++) int m; LL cal=0,sum; unordered_set<int>s,s1; #define IT set<int>::iterator inline int read(); signed main() { // freopen("ex_jihe4.in","r",stdin); // freopen("11.out","w",stdout); m=read();int opt; for(int i=1;i<=m;i++) { opt=read(); if(opt==1) { int siz=read(),a; for(int j=1;j<=siz;j++) { a=read();a-=cal; if(s.find(a)==s.end())s.insert(a),sum+=a; } } if(opt==2) { int siz=read(),a;sum=0; for(int j=1;j<=siz;j++) { a=read();a-=cal; if(s.find(a)!=s.end())s1.insert(a),sum+=a; } s=s1;s1.clear(); } if(opt==3) { if(!s.empty())cal++; } if(opt==4) { if(!s.empty())cal--; } printf("%lld\n",sum+cal*s.size()); } } inline int read() { int x=0,f=1;char ch=getc(); while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getc();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();} return x*f; }