QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#233585#3031. Bookstorejerzyk#0 1280ms283032kbC++202.6kb2023-10-31 20:00:252023-10-31 20:00:25

Judging History

你现在查看的是最新测评结果

  • [2023-10-31 20:00:25]
  • 评测
  • 测评结果:0
  • 用时:1280ms
  • 内存:283032kb
  • [2023-10-31 20:00:25]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
struct Zap
{
	int l,p;
};
struct Node
{
	int a,b,dod;
};
int tab[2000009];
long long Tre[4000000];
long long odp[200009];
int base;
void Przedzial(int l, int  p, int dod)
{
	l+=base;
	p+=base;
	while(l<=p)
	{
		if(l%2==1)
		{
			Tre[l]+=dod;
			l++;
		}
		if(p%2==0)
		{
			Tre[p]+=dod;
			p--;
		}
		l>>=1;
		p>>=1;
	}
}
long long Punkt(int v)
{
	v+=base;
	long long wynik=0;
	while(v>0)
	{
		wynik+=Tre[v];
		v>>=1;
	}
	return wynik;
}
int TworzenieDzrewa(int x)
{
	int u=1;
	while(x>0)
	{
		x>>=1;
		u<<=1;
	}
	return u;
}
vector<Node>VV[1000009];
vector<pair<int,int>>V[1000009];
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int N;
cin>>N;
for(int I=1;I<=N;I++)
{
	int n,q;
	cin>>n>>q;
	base=TworzenieDzrewa(1000000);
	for(int i=1;i<=base*2;i++)
	{
		Tre[i]=0;
	}
	for(int i=1;i<=1000000;i++)
	{
		VV[i].clear();
		V[i].clear();
	}
	vector<Zap>Z;
	for(int i=1;i<=n;i++)
	{
		cin>>tab[i];
	}
	for(int i=1;i<=q;i++)
	{
		int a,b;
		cin>>a>>b;
		V[a].push_back({b,i});
	}
	vector<pair<int,int>>maxx,minn;
	maxx.push_back({INT_MAX,0});
	minn.push_back({0,0});
	for(int i=1;i<=n;i++)
	{
		while(maxx.back().first<=tab[i])
		{
			maxx.pop_back();
		}
		while(minn.back().first>=tab[i])
		{
			minn.pop_back();
		}
		maxx.push_back({tab[i],i});
		minn.push_back({tab[i],i});
		vector<pair<int,Zap>>U;
		U.push_back({0,{0,0}});
		int h1=1,h2=1;
		while(true)
		{
			if(h1<maxx.size()&&h2<minn.size())
			{
				if(maxx[h1].second<minn[h2].second)
				{
					U.push_back({maxx[h1].second,{0,0}});
					h1++;
				}
				else
				{
					U.push_back({minn[h2].second,{0,0}});
					h2++;
				}
			}
			else if(h1<maxx.size())
			{
				U.push_back({maxx[h1].second,{0,0}});
				h1++;
			}
			else if(h2<minn.size())
			{
				U.push_back({minn[h2].second,{0,0}});
				h2++;
			}
			else{break;}
			if(U.size()>=2&&U[U.size()-2].first==U[U.size()-1].first){U.pop_back();}
		}
		int l=INT_MAX,p=0;
		for(int j=U.size()-1;j>=1;j--)
		{
			p=max(p,tab[U[j].first]);
			l=min(l,tab[U[j].first]);
			U[j].second={l,p};
		}
		for(int j=1;j<U.size();j++)
		{
			int dl=U[j].first-U[j-1].first;
			VV[1].push_back({U[j].second.p,1000000,dl});
			VV[U[j].second.l+1].push_back({U[j].second.p,1000000,-dl});
		}
	}
	for(int i=1;i<=1000000;i++)
	{
		for(int j=0;j<VV[i].size();j++)
		{
			Przedzial(VV[i][j].a,VV[i][j].b,VV[i][j].dod);
		}
		for(int j=0;j<V[i].size();j++)
		{
			odp[V[i][j].second]=Punkt(V[i][j].first);
		}
	}
	for(int i=1;i<=q;i++)
	{
		cout<<odp[i]<<'\n';
	}
}
	return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 1280ms
memory: 283032kb

input:

5
2000 500000
626903 415241 202099 857946 487865 572859 764498 673207 933859 420733 991793 890244 44852 933797 629331 405167 493228 17610 647473 168478 61243 673730 521362 705926 796963 12614 241539 139293 150860 450674 698932 871015 720740 328617 649135 874733 150512 189014 908021 554061 26292 5628...

output:

175977048
2001000
129438376
139879135426
238724183869
227033241425
2134813269
3879906
3003381
12271410937
18126016690
2001000
2001000
1738986043
3879906
1438820782
41045117
209266453
3003381
283485503
7881906
4068484
7320341
1365788904
11636125356
295725313229
43713694
35603806
3938356640
4730078037...

result:

wrong answer 1st lines differ - expected: '798337', found: '175977048'