求调 CF D
  • 板块学术版
  • 楼主rainygame
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/6/30 00:36
  • 上次更新2023/11/3 12:06:24
查看原帖
求调 CF D
804607
rainygame楼主2023/6/30 00:36

思路:找一段跌的最厉害的,然后设 kk 为跌之前的值。如果有几段相同,则找跌之前 Rating 最大的来算。

找样例规律找的,没有证明。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define for1(i, s, t) for (int i(s); i<=t; ++i)
#define for2(i, t, s) for (int i(t); i>=s; --i)
#define for3(i, vec) for (auto i: vec)
#define INF 0x3f3f3f3f
#define opb pop_back
#define pb push_back
#define pf push_front
#define opf pop_front
#define fi first
#define se second
#define gc() getchar()
#define pc(x) putchar(x);
#define sp pc(' ');
#define el pc('\n');
#define pr(x) printf(x);
#define Yes pr("YES");
#define No pr("NO");
#define err assert(0);
const int MAXN(3e5+1);
//const ll MOD(1e9+7);

ll re(){
    ll x(0), f(1);
    char ch;
    while ((ch = gc()) < 48) f = ch == '-' ? -1 : 1;
    do{
        x = (x << 1) + (x << 3) + (ch ^ 48);
    }while ((ch = gc()) > 47);
    return x * f;
}

void uwr(ll x){
    ll tmp(x/10);
    if (tmp) uwr(tmp);
    pc(x-(tmp<<1)-(tmp<<3)^48);
}

void wr(ll x){
    if (x < 0){
        pc('-');
        x = -x;
    }
    uwr(x);
}

int n, flag, ind;
deque<pair<ll, int>> dq;
ll sum, minn, ans;
ll a[MAXN];

void solve(){
	n = re();
	dq.clear();
	a[1] = re();
	flag = abs(a[1]) == a[1];
	sum = a[1];
	for1(i, 2, n){
		a[i] = re();
		if ((abs(a[i]) == a[i]) != flag){
			dq.push_back({sum, i-1});
			sum = 0;
			flag = (abs(a[i]) == a[i]);
		}else{
			sum += a[i];
		}
	}
	dq.push_back({sum, n});
	
	sum = minn = ans = ind = 0;
	for1(i, 0, dq.size()-1){
//		cout << sum << ' ';
		if (dq[i].first < minn || (dq[i].first == minn && sum > ans)){
			minn = dq[i].first;
			ans = sum;
			ind = dq[i].second;
		}
		sum += dq[i].first;
	}
	
	cout << ans;
}

int main(){
//  freopen(".in", "r", stdin);
//  freopen(".out", "w", stdout);

    int t(1);
  t = re();
    while (t--){
        solve();
        el
    }

    return 0;
}

2023/6/30 00:36
加载中...