B蜜汁TLE
用set存,每次删除一个,插入一个,维护两个set即可,复杂度nlogn,怎么TLE了鸭???
#include<bits/stdc++.h>usingnamespacestd;constintmaxn = 1e5+7;constintmaxm = 2e1+7;constintmod = 1e9+7;typedeflonglongll;typedefunsigned longlongull;intn,m,x,y,k;intar[maxn];multiset<int> s1,s2;multiset<int>::iterator it;voidread(int& x){x=0;charc = getchar();while(c<'0'&& c>'9')c = getchar();while(c<='9'&& c>='0'){x = x*10+c-'0';c = getchar();}}intmain(){read(n);read(m);read(k);for(inti=1;i<=n;i++)read(ar[i]);if(k==0){printf("0\n");return0;}ll ans=0,mid=0;for(inti=1;i<=m;i++){s1.insert(ar[i]);}while(s2.size()<k){it = s1.begin();intx = *it;s2.insert(x);mid += x;s1.erase(s1.begin());}ans = mid;for(inti=2;i<=n-m+1;i++){intval = ar[i-1];if(s1.count(val)){s1.erase(s1.find(val));}else{s2.erase(s2.find(val));mid -= val;}val = ar[i+m-1];s1.insert(val);if(s1.size()>0){it = s1.begin();intx = *it;if(s2.size()>0){it = s2.end();it--;if(*it > x){mid -= *it;s1.insert(*it);s2.erase(it);}}}while(s2.size()<k){it = s1.begin();mid += *it;s2.insert(*it);s1.erase(it);}ans += mid;}printf("%lld\n", ans);return0;}