結果

問題 No.924 紲星
ユーザー noshi91noshi91
提出日時 2019-11-09 00:17:56
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 2,856 ms / 4,000 ms
コード長 2,920 bytes
コンパイル時間 782 ms
コンパイル使用メモリ 71,480 KB
実行使用メモリ 19,812 KB
最終ジャッジ日時 2023-10-13 05:53:15
合計ジャッジ時間 24,729 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
7,144 KB
testcase_01 AC 2 ms
7,048 KB
testcase_02 AC 2 ms
7,028 KB
testcase_03 AC 7 ms
7,100 KB
testcase_04 AC 3 ms
7,144 KB
testcase_05 AC 7 ms
7,188 KB
testcase_06 AC 7 ms
7,116 KB
testcase_07 AC 3 ms
7,112 KB
testcase_08 AC 2,819 ms
19,796 KB
testcase_09 AC 2,806 ms
19,812 KB
testcase_10 AC 2,755 ms
19,796 KB
testcase_11 AC 2,856 ms
19,792 KB
testcase_12 AC 2,850 ms
19,796 KB
testcase_13 AC 1,481 ms
13,104 KB
testcase_14 AC 1,522 ms
11,256 KB
testcase_15 AC 1,365 ms
11,240 KB
testcase_16 AC 970 ms
17,324 KB
testcase_17 AC 2,311 ms
14,132 KB
testcase_18 AC 3 ms
7,088 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:57:1: 警告: ISO C++ では型の無い ‘main’ の宣言を禁止しています [-Wreturn-type]
   57 | main()
      | ^~~~

ソースコード

diff #

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#include<vector>
#include<functional>
#include<limits>
template<typename T,typename F, typename G>
struct segtree{
	F calcfn;
	G updatefn;
	int n;
	T defvalue;
	vector<T>dat;
	segtree(int n_=0,T defvalue_=numeric_limits<T>::max(),
		F calcfn_=[](T a,T b){return a<b?a:b;},
		G updatefn_=[](T a,T b){return b;}
	):defvalue(defvalue_),calcfn(calcfn_),updatefn(updatefn_)
	{
		n=1;
		while(n<n_)n<<=1;
		dat.assign(2*n-1,defvalue);
	}
	void copy(const vector<T>&v)
	{
		for(int i=0;i<v.size();i++)dat[i+n-1]=v[i];
		for(int i=n-2;i>=0;i--)dat[i]=calcfn(dat[i*2+1],dat[i*2+2]);
	}
	void update(int i,T a)
	{
		i+=n-1;
		dat[i]=updatefn(dat[i],a);
		while(i>0)
		{
			i=(i-1)/2;
			dat[i]=calcfn(dat[2*i+1],dat[2*i+2]);
		}
	}
	T query(int a,int b)//[a,b)
	{
		int L=(a<0?0:a>n?n:a)+n-1;
		int R=(b<0?0:b>n?n:b)+n-1;
		T lret=defvalue,rret=defvalue;
		for(;L<R;L>>=1,R>>=1)
		{
			if(!(L&1))lret=calcfn(lret,dat[L]);
			if(!(R&1))rret=calcfn(dat[--R],rret);
		}
		return calcfn(lret,rret);
	}
};
int N,Q;
int A[2<<17];
int L[2<<17],R[2<<17];
int l[2<<17],r[2<<17];
long ans[2<<17];
main()
{
	scanf("%d%d",&N,&Q);
	for(int i=0;i<N;i++)scanf("%d",A+i);
	vector<pair<int,int> >Ai(N);
	for(int i=0;i<N;i++)Ai[i]=make_pair(A[i],~i);
	vector<pair<int,int> >Qi(Ai.begin(),Ai.end());
	sort(Ai.begin(),Ai.end());
	for(int i=0;i<Q;i++)
	{
		scanf("%d%d",L+i,R+i);
		L[i]--;
		l[i]=-1e9-1;
		r[i]=1e9+1;
	}
	auto sumlong=[](long a,long b){return a+b;};
	auto sumint=[](int a,int b){return a+b;};
	auto updlong=[](long a, long b){return b;};
	auto updint=[](int a,int b){return b;};
	for(int _=0;_<40;_++)
	{
		vector<pair<int,int> >T(Q);
		for(int i=0;i<Q;i++)
		{
			int mid=(l[i]+r[i])/2;
			T[i]=make_pair(mid,i);
		}
		sort(T.begin(),T.end());
		segtree<int,decltype(sumint), decltype(updint)>cnt(N,0,sumint,updint);
		int id=0;
		for(int i=0;i<N;i++)
		{
			while(id<Q&&Ai[i].first>T[id].first)
			{
				int idd=T[id].second;
				if(cnt.query(L[idd],R[idd])>=(R[idd]-L[idd]+1)/2)r[idd]=T[id].first;
				else l[idd]=T[id].first;
				id++;
			}
			cnt.update(~Ai[i].second,1);
		}
		while(id<Q)
		{
			int idd=T[id].second;
			if(cnt.query(L[idd],R[idd])>=(R[idd]-L[idd])/2)r[idd]=T[id].first;
			else l[idd]=T[id].first;
			id++;
		}
	}
	for(int i=0;i<Q;i++)
	{
		Qi.push_back(make_pair(r[i],i));
	}
	sort(Qi.begin(),Qi.end());
	segtree<long,decltype(sumlong), decltype(updlong)>SUM(N,0,sumlong,updlong);
	SUM.copy(vector<long>(A,A+N));
	segtree<int,decltype(sumint), decltype(updint)>neg(N,0,sumint,updint);
	for(pair<int,int>p:Qi)
	{
		int id=p.second;
		int X=p.first;
		if(id<0)
		{
			id=~id;
			SUM.update(id,-X);
			neg.update(id,1);
		}
		else
		{
			int w=R[id]-L[id];
			long now=SUM.query(L[id],R[id]);
			int cnt=neg.query(L[id],R[id]);
			now+=(long)X*cnt-(long)X*(w-cnt);
			ans[id]=now;
		}
	}
	for(int i=0;i<Q;i++)printf("%ld\n",ans[i]);
}

0