题目大意:
给你n个操作,操作的类型有 add, del,sum。 add x 就是说,给这个容器中加入一个x,del x 就是说把这个容器中的x删除掉, sum x 就是求所有下标能够%5==3的数字的和。
看了下n的范围,n<1e5,然后果断nlogn卡过去。
解题思路:
这道题的解题思路很容易理解,其实就是把所有新加入的数字扔进vector里面,然后求的时候,只要每次lower_bound(v.begin(),v.end(),tmp)就行了,起初,要定义一个vector<int>::iterator it
的迭代器,每次找到大于等于这个值的位置,然后v.insert(it,tmp)进去,如果是删除操作的话,就直接v.erase(it)就行了。%5==3的数字的可以枚举出来,因为n<=1e5,在3s内是可以接受的。
代码:
# include<cstdio> # include<iostream> # include<string> # include<algorithm> # include<vector> using namespace std; vector<int>v; int main(void) { int n; while ( cin>>n ) { string str; vector<int>::iterator it; while ( n-- ) { int tmp; cin>>str; if ( str[0]=='a' ) { cin>>tmp; it = lower_bound(v.begin(),v.end(),tmp); v.insert(it,tmp); } else if ( str[0]=='d' ) { cin>>tmp; it = lower_bound(v.begin(),v.end(),tmp); v.erase(it); } else { long long ans = 0; for ( int i = 2;i < v.size();i+=5 ) { ans+=v[i]; } cout<<ans<<endl; } } v.clear(); } return 0; }