답안 #84512

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
84512 2018-11-15T19:59:49 Z Pajaraja Election (BOI18_election) C++17
0 / 100
30 ms 27896 KB
#include <bits/stdc++.h>
#define MAXN 500007
using namespace std;
string s;
int val[MAXN],t[2*MAXN],a[MAXN],ans[MAXN],seg[4*MAXN],bag[4*MAXN],n,bit[4*MAXN];
vector<pair<int,int> > u[MAXN];
vector<int> g[MAXN];
void updbit(int x,int val)
{
	while(x<=n)
	{
		bit[x]+=val;
		x+=x&-x;
	}
}
int calc(int x)
{
	int sol=0;
	while(x>0)
	{
		sol+=bit[x];
		x-=x&-x;
	}
	return sol;
}
void relax(int ind)
{
	bag[2*ind]+=bag[ind];
	bag[2*ind+1]+=bag[ind];
	bag[ind]=0;
	seg[ind]=min(seg[2*ind]-bag[2*ind],seg[2*ind+1]-bag[2*ind+1]);
}
int nmin(int l,int r,int lt,int rt,int ind)
{
	if(l>rt || r<lt) return 1000000000;
	if(l>=lt && r<=rt) return seg[ind]-bag[ind];
	int s=(l+r)/2;
	relax(ind);
	return min(nmin(l,s,lt,rt,2*ind),nmin(s+1,r,lt,rt,2*ind+1));
}
void upd(int l,int r,int lt,int rt,int ind,int val)
{
	if(l>rt || r<lt) return;
	if(l>=lt && r<=rt) {bag[ind]+=val; return;}
	int s=(l+r)/2;
	upd(l,s,lt,rt,2*ind,val);
	upd(s+1,r,lt,rt,2*ind+1,val);
	relax(ind);
}
void napravi(int l,int r,int ind)
{
	if(l==r) {seg[ind]=val[l]; return;}
	int s=(l+r)/2;
	napravi(l,s,2*ind);
	napravi(s+1,r,2*ind+1);
	seg[ind]=min(seg[2*ind+1],seg[2*ind+1]);
}
void dfs(int s)
{
	if(s!=1) {upd(1,n+1,1,s-1,1,a[s-1]); updbit(s-1,1);}
	for(int i=0;i<g[s].size();i++) dfs(g[s][i]);
	for(int i=0;i<u[s].size();i++)
	{
		int r=u[s][i].first;
		ans[u[s][i].second]=nmin(1,n+1,r+1,r+1,1)-nmin(1,n+1,s,r,1)+calc(r)-calc(s-1);
	}
	if(s!=1) {upd(1,n+1,1,s-1,1,-a[s-1]); updbit(s-1,-1);}
}
int main()
{
	int q;
	cin>>n>>s>>q;
	for(int i=0;i<q;i++)
	{
		int l,r;
		cin>>l>>r;
		u[l].push_back(make_pair(r,i));
	}
	for(int i=0;i<n;i++) a[i+1]=s[i]=='T'?-1:1;
	int cur=MAXN;
	fill(t,t+2*MAXN,n+2);
	t[MAXN]=n+1;
	val[n+1]=MAXN;
	g[n+2].push_back(n+1);
	for(int i=n;i>0;i--)
	{
		cur+=a[i];
		val[i]=cur;
		g[t[cur+1]].push_back(i);
		t[cur]=i;
	}
	napravi(1,n+1,1);
	dfs(n+2);
	for(int i=0;i<q;i++) printf("%d\n",ans[i]);
}

Compilation message

election.cpp: In function 'void dfs(int)':
election.cpp:61:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<g[s].size();i++) dfs(g[s][i]);
              ~^~~~~~~~~~~~
election.cpp:62:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<u[s].size();i++)
              ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 30 ms 27896 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 30 ms 27896 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 30 ms 27896 KB Output isn't correct
2 Halted 0 ms 0 KB -