Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define nl "\n"
- void files(){
- ios_base::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
- #endif
- }
- void solve(){
- ll n,m; cin>>n>>m;
- vector<ll> v(n+1);
- vector<ll> pre(n+2), suf(n+2);
- for(ll i=1; i<=n; i++) cin>>v[i];
- vector<pair<int,int>> intervals;
- for(int i=1; i<=n; i++) pre[i] = pre[i-1] + v[i];
- for(int i=n; i>=1; i--) suf[i] = suf[i+1] + v[i];
- unordered_map<ll,int>mp;
- auto add = [&](int i){
- if(mp[v[i]] == 0) m--;
- mp[v[i]]++;
- };
- auto remove = [&](int i){
- mp[v[i]]--;
- if(mp[v[i]] == 0) m++;
- };
- int l=1,r=1;
- while(r<=n){
- add(r);
- while(m <= 0){
- if(m == 0) intervals.push_back({l,r});
- remove(l);
- l++;
- }
- r++;
- }
- set<int> pos;
- if(v[1]>0) pos.insert(1);
- if(v[n]>0) pos.insert(n);
- for(int i=1;i<=n;i++){
- if(v[i]<0){
- if(i>1 and v[i-1]>0) pos.insert(i-1);
- if(i<n and v[i+1]>0) pos.insert(i+1);
- }
- }
- vector<ll> inc(pos.begin(),pos.end());
- ll ans = LONG_LONG_MIN;
- for(auto&[f,s]:intervals){
- ll sum = pre[s]-pre[f-1];
- ll tmp1 = sum;
- int idx1 = upper_bound(inc.begin(),inc.end(),s)-inc.begin();
- for(int i=0;i<(int)inc.size();i++){
- if(inc[i]>=f) break;
- for(int j=idx1;j<(int)inc.size();j++){
- ll left = pre[f-1] - pre[inc[i]-1];
- ll right = pre[inc[j]] - pre[s];
- tmp1 = max(tmp1,sum+left+right);
- }
- }
- for(int i=0;i<(int)inc.size();i++){
- if(inc[i]>= f and inc[i]<=s) continue;
- if(inc[i]<f){
- ll left = pre[f-1] - pre[inc[i]-1];
- tmp1 = max(tmp1,sum+left);
- }else{
- ll right = pre[inc[i]] - pre[s];
- tmp1 = max(tmp1,sum+right);
- }
- }
- ans = max(ans,tmp1);
- }
- cout<<ans<<nl;
- }
- int main(){
- files();
- int t = 1;
- cin>>t;
- while(t--) solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement