제출 #381185

#제출 시각아이디문제언어결과실행 시간메모리
381185peijarElection (BOI18_election)C++17
100 / 100
940 ms36348 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e6;

struct Noeud
{
	int iDeb, iFin;
	int maxPref, maxSuff, totDelta, sol;
};

Noeud fusion(Noeud lhs, Noeud rhs)
{
	Noeud ret;
	ret.iDeb = lhs.iDeb;
	ret.iFin = rhs.iFin;
	ret.maxPref = max(lhs.maxPref, lhs.totDelta + rhs.maxPref);
	ret.maxSuff = max(rhs.maxSuff, rhs.totDelta + lhs.maxSuff);
	ret.sol = max({lhs.totDelta + rhs.sol, lhs.sol + rhs.totDelta, lhs.maxPref + rhs.maxSuff});
	ret.totDelta = lhs.totDelta + rhs.totDelta;
	return ret;
}

Noeud seg[MAXN];

string votes;

void construitArbre(int iNoeud, int iDeb, int iFin)
{
	if (iDeb == iFin)
	{
		seg[iNoeud].iDeb = iDeb;
		seg[iNoeud].iFin = iFin;
		int val = votes[iDeb] == 'T' ? 1 : 0;
		seg[iNoeud].maxPref = seg[iNoeud].maxSuff = seg[iNoeud].sol = seg[iNoeud].totDelta = val;
		if (votes[iDeb] == 'C')
			seg[iNoeud].totDelta = -1;
		return;
	}
	construitArbre(2*iNoeud, iDeb, (iDeb+iFin)/2);
	construitArbre(2*iNoeud+1, (iDeb+iFin)/2+1, iFin);
	seg[iNoeud] = fusion(seg[2*iNoeud], seg[2*iNoeud+1]);
}

Noeud requete(int iNoeud, int iDeb, int iFin)
{
	if (iDeb <= seg[iNoeud].iDeb and seg[iNoeud].iFin <= iFin)
		return seg[iNoeud];
	if (iDeb > seg[iNoeud].iFin or iFin < seg[iNoeud].iDeb)
		return {0, 0, 0, 0, 0, 0};
	return fusion(requete(2*iNoeud, iDeb, iFin), requete(2*iNoeud+1, iDeb, iFin));
}

signed main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	int nbFans;
	cin >> nbFans >> votes;
	construitArbre(1, 0, nbFans-1);

	int nbRequetes;
	cin >> nbRequetes;
	for (int iRequete = 0; iRequete < nbRequetes; ++iRequete) 
	{
		int L, R;
		cin >> L >> R;
		cout << requete(1, L-1, R-1).sol << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...