QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#113284#6626. Real Mountainstricyzhkx0 2ms40196kbC++142.1kb2023-06-16 21:17:202023-06-16 21:17:21

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-16 21:17:21]
  • Judged
  • Verdict: 0
  • Time: 2ms
  • Memory: 40196kb
  • [2023-06-16 21:17:20]
  • Submitted

answer

# include <bits/stdc++.h>
using namespace std;
const int mod=1e6+3;
typedef long long ll;
int n,len,a[1000010],b[1000010],L[1000010],R[1000010],stk[1000010],pre[1000010][20],suf[1000010][20],lim[1000010];
vector<int> pos[1000010];
set<int> st;
int S(int l,int r){return (ll)(l+r)*(r-l+1)/2%mod;}
int queryl(int p,int x) // min { i : i >= x , L[i] <= p }
{
	if(L[x]<=p) return x;
	for(int i=19;i>=0;i--)
		if(pre[x][i]>=1 && L[pre[x][i]]>p) x=pre[x][i];
	return pre[x][0];
}
int queryr(int p,int x) // min { i : i >= x , R[i] >= p }
{
	if(R[x]>=p) return x;
	for(int i=19;i>=0;i--)
		if(suf[x][i]<=len && R[suf[x][i]]<p) x=suf[x][i];
	return suf[x][0];
}
int main()
{
	int tp=0,ans=0;
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[++len]=a[i];
	sort(b+1,b+len+1);
	len=unique(b+1,b+len+1)-b-1;
	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+len+1,a[i])-b,pos[a[i]].push_back(i);
	for(int i=1;i<=len;i++) L[i]=pos[i].front(),R[i]=pos[i].back();
	for(int i=1;i<=len;i++)
	{
		while(tp && L[stk[tp]]>=L[i]) tp--;
		pre[i][0]=stk[tp];stk[++tp]=i;
	}
	tp=0;stk[0]=len+1;suf[len+1][0]=len+1;
	for(int i=len;i>=1;i--)
	{
		while(tp && R[stk[tp]]<=R[i]) tp--;
		suf[i][0]=stk[tp];stk[++tp]=i;
	}
	for(int i=0;i<=len;i++)
		for(int j=1;j<=19;j++)
			pre[i][j]=pre[pre[i][j-1]][j-1];
	for(int i=len+1;i>=1;i--)
		for(int j=1;j<=19;j++)
			suf[i][j]=suf[suf[i][j-1]][j-1];
	fill(lim+1,lim+n+1,len);
	for(int i=1,mx=0;i<=n;i++) lim[i]=min(lim[i],mx),mx=max(mx,a[i]);
	for(int i=n,mx=0;i>=1;i--) lim[i]=min(lim[i],mx),mx=max(mx,a[i]);
	for(int i=1;i<len;i++)
	{
		for(int j:pos[i]) st.insert(j);
		auto chk=[&](int p){return lim[p]<=i;};
		while(!st.empty() && chk(*st.begin())) st.erase(st.begin());
		while(!st.empty() && chk(*--st.end())) st.erase(--st.end());
		if(st.empty()) continue;
		int l=*st.begin(),r=*--st.end(),cnt=st.size();
		ans=(ans+(ll)cnt*S(b[i],b[i+1]-1))%mod;
		ans=(ans+(ll)(b[queryl(l-1,i+1)]+b[queryr(r+1,i+1)])*(b[i+1]-b[i]))%mod;
		if(cnt>1)
		{
			ans=(ans+(2ll*cnt-3)*S(b[i]+1,b[i+1]))%mod;
			ans=(ans+(ll)b[min(queryr(l+1,i+1),queryl(r-1,i+1))]*(b[i+1]-b[i]))%mod;
		}
	}
	cout<<ans<<endl;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 3
Accepted
time: 2ms
memory: 39360kb

input:

3
29 9 9

output:

0

result:

ok 1 number(s): "0"

Test #2:

score: 0
Accepted
time: 1ms
memory: 39640kb

input:

3
62 20 71

output:

7287

result:

ok 1 number(s): "7287"

Test #3:

score: -3
Wrong Answer
time: 0ms
memory: 40196kb

input:

10
72 33 22 22 13 49 53 57 72 85

output:

38307

result:

wrong answer 1st numbers differ - expected: '40403', found: '38307'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Skipped

Dependency #3:

0%

Subtask #5:

score: 0
Skipped

Dependency #2:

0%

Subtask #6:

score: 0
Skipped

Dependency #3:

0%

Subtask #7:

score: 0
Skipped

Dependency #1:

0%