QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#563088#6656. 先人类的人类选别ElegiaAC ✓732ms34636kbC++236.8kb2024-09-14 02:30:302024-09-14 02:30:30

Judging History

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

  • [2024-09-14 02:30:30]
  • 评测
  • 测评结果:AC
  • 用时:732ms
  • 内存:34636kb
  • [2024-09-14 02:30:30]
  • 提交

answer

// std: nzhtl1477
#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l;i<r;++i)
#define Fe(i,l,r) for(int i=l;i<=r;++i)
#define Fer(i,l,r) for(int i=l;i>=r;--i)
#if 0
#define pr(...) fprintf(stderr,__VA_ARGS__)
#else
#define pr(...) void(0)
#endif

typedef long long i64;
const int maxn=1e6,maxm=1e6,maxv=1e3,N=maxn+10,M=maxm+10;
template<class T>
void alloc(T *&p,int sz){
	p=new T[sz]();
}

struct Void{
	char _[0];
	template<class T>
	friend void operator*=(T &,Void){}
	friend Void operator+(Void,Void){return Void();}
};

template<class D=Void,class M=Void>
struct MSegTree{
	struct Node{
		D d;
		M m;
		void app(const M &t){
			d*=t;
			m*=t;
		}
		void up(const Node &a,const Node &b){
			d=a.d+b.d;
			d*=m;
		}
	}*tr;
	int mx;
	int n;
	void in(int x){}
	void in(int l,int r){}
	void alloc(int n){
		for(mx=1;mx<n+2;mx<<=1);
		::alloc(tr,mx+n+3);
		this->n=n;
	}
	template<class T>
	void init(int n,T *d0){
		alloc(n);
		Fe(i,1,n)tr[mx+i].d=d0[i];
		range_update(1,n);
	}
	D &operator[](int x){
		in(x);
		return tr[mx+x].d;
	}
	void range_update(int l,int r){
		in(l),in(r);
		l+=mx,r+=mx;
		for(l>>=1,r>>=1;l<r;l>>=1,r>>=1){
			Fe(x,l,r)up(x);
		}
		for(;l;l>>=1)up(l);
	}
	void up(int x){
		tr[x].up(tr[x*2],tr[x*2+1]);
	}
	void add(int x,const D &y){//M=Void
		in(x);
		for(x+=mx;x;x>>=1)tr[x].d=tr[x].d+y;;
	}
	void update(const M &t){
		tr[1].app(t);
	}
	template<class T>
	void update(int x,T y){
		in(x);
		for(tr[x+=mx].d=y;x>1;up(x>>=1));
	}
	void update(int l,int r,const M &t){
		in(l),in(r);
		for(l+=mx-1,r+=mx+1;l^r^1;up(l>>=1),up(r>>=1)){
			if(~l&1)tr[l+1].app(t);
			if(r&1)tr[r-1].app(t);
		}
		for(;l>1;up(l>>=1));
	}
	void update_suffix(int x,const M &t){
		in(x);
		for(x+=mx-1;x>1;up(x>>=1)){
			if(~x&1)tr[x+1].app(t);
		}
	}
	D query(){
		return tr[1].d;
	}
	D query(int l,int r){
		in(l),in(r);
		D a1,a2;
		for(l+=mx-1,r+=mx+1;l^r^1;a1*=tr[l>>=1].m,a2*=tr[r>>=1].m){
			if(~l&1)a1=a1+tr[l+1].d;
			if(r&1)a2=tr[r-1].d+a2;
		}
		a1=a1+a2;
		for(;l>1;a1*=tr[l>>=1].m);
		return a1;
	}
	D query_prefix(int r){
		in(r);
		D a1;
		for(r+=mx+1;r>1;r>>=1,a1*=tr[r].m){
			if(r&1)a1=tr[r-1].d+a1;
		}
		return a1;
	}
	D query_suffix(int l){
		in(l);
		D a1;
		for(l+=mx-1;l>1;l>>=1,a1*=tr[l].m){
			if(~l&1)a1=a1+tr[l+1].d;
		}
		return a1;
	}
	void dn(int x){
		tr[x*2].app(tr[x].m);
		tr[x*2+1].app(tr[x].m);
		tr[x].m=M();
	}
	void dna(int x){
		in(x);
		x+=mx;
		for(int c=__builtin_ctz(mx);c>0;--c)dn(x>>c);
	}
	template<class T>
	int bsearch_r(int x,T f){//M=Void
		in(x);
		for(x+=mx-1;;x>>=1){
			if(~x&1){
				if(f(tr[x+1].d))break;
			}
		}
		for(++x;x<mx;){
			x<<=1;
			if(!f(tr[x].d))++x;
		}
		x-=mx;
		return x-1;
	}
	template<class T>
	int find_lm(T f){
		int x=1;
		while(x<mx){
			dn(x);
			x<<=1;
			if(!f(tr[x].d))++x;
		}
		x-=mx;
		return x;
	}
};
template<class T>
struct BIT{
	T *a;
	int n;
	void alloc(int n0){
		n=n0;
		::alloc(a,n+1);
	}
	void add(int x,T y){
		assert(1<=x&&x<=n);
		int _n=n;
		for(;x<=_n;x+=x&-x)a[x]+=y;
	}
	T sum(int x){
		assert(0<=x&&x<=n);
		T s=0;
		for(;x;x-=x&-x)s+=a[x];
		return s;
	}
	void build(){
		Fe(i,1,n){
			int j=i+(i&-i);
			if(j<=n)a[j]+=a[i];
		}
	}
};
namespace IO{
const int BUF_SZ=1<<16;
char ib[BUF_SZ+1],*ip=ib+BUF_SZ;
void ipre(int n){
	int c=ib+BUF_SZ-ip;
	if(c<n){
		memcpy(ib,ip,c);
		ip=ib;
		fread(ib+c,1,BUF_SZ-c,stdin)[ib+c]=0;
	}
}
template<class T>
T read(T L,T R){
	ipre(100);
	T x=0,f=1;
	while(*ip<'0'||*ip>'9')if(*ip++=='-')f=-f;
	while(*ip>='0'&&*ip<='9')x=x*10+*ip++-'0';
	x*=f;
	if(!(L<=x&&x<=R)){
		std::cerr<<x<<" not in ["<<L<<","<<R<<"]\n";
		exit(1);
	}
	return x;
}
char ob[BUF_SZ+1],*op=ob;
void opre(int n){
	int c=ob+BUF_SZ-op;
	if(c<n){
		fwrite(ob,1,BUF_SZ-c,stdout);
		op=ob;
	}
}
template<class T>
void write(T x){
	opre(100);
	char ss[100],*sp=ss;
	if(x<T(0))x=-x,*op++='-';
	do *sp++=x%10+'0';while(x/=10);
	while(sp!=ss)*op++=*--sp;
}
template<class T>
void write(T x,char c){
	write(x);
	*op++=c;
}
struct __{
	__(){}
	~__(){
		fwrite(ob,1,op-ob,stdout);
	}
}_;
};
using IO::read;
using IO::write;
int a[N];
const int inf=1e9;
bool is1[N],is2[N];
using std::min;
using std::max;
int n,m;
struct D1{
	int x;
	D1(int x0=inf):x(x0){}
};
struct M1{
	int x;
	M1(int x0=0):x(x0){}
};
D1 operator+(D1 a,D1 b){return D1(min(a.x,b.x));}
void operator*=(D1 &a,M1 b){a.x+=b.x;}
void operator*=(M1 &a,M1 b){a.x+=b.x;}
MSegTree<D1,M1> amnt;
MSegTree<D1> qmnt;



template<class T>
struct Sum{
	T x;
	Sum(T x0=0):x(x0){}
	operator T(){return x;}
	friend Sum operator+(Sum a,Sum b){return Sum(a.x+b.x);}
};
BIT<i64> qst,q1st;
BIT<int> q1xct;
MSegTree<Sum<int>> q1yct;
int qt(int i){
	return q1xct.sum(i)-q1yct.query_suffix(a[i]).x;
}
i64 q1s(int i){
	if(i>n)return 0;
	int n1=q1yct.query().x-q1xct.sum(i-1);
	if(!n1)return 0;
	int y=q1yct.find_lm([&n1](Sum<int> d){
		if(n1>d.x)return n1-=d.x,0;
		return 1;
	});
	i64 s=0;
	assert(q1yct[y]>=n1);
	s+=i64(n1)*y;
	if(y>1)s+=q1st.sum(y-1);
	return s;
}

int main(){
	n=read(1,maxn);
	m=read(1,maxm);
	Fe(i,1,n)a[i]=read(1,n);
	
	int mx=inf;
	Fe(i,1,n){
		if(a[i]<=mx){
			mx=a[i];
			is1[i]=1;
		}
	}
	mx=inf;
	Fe(i,1,n){
		if(a[i]<=mx&&!is1[i]){
			mx=a[i];
			is2[i]=1;
		}
	}
	
	qst.alloc(n);
	q1st.alloc(n);
	qmnt.alloc(n+1);
	q1xct.alloc(n);
	q1yct.alloc(n);
	Fe(i,1,n)if(!is1[i]){
		qst.a[i]=a[i];
		qmnt[i]=a[i];
	}else{
		q1st.a[a[i]]+=a[i];
		q1xct.a[i]+=1;
		q1yct[a[i]].x+=1;
	}
	qmnt[n+1]=0;
	qst.build();
	q1st.build();
	qmnt.range_update(1,n+1);
	q1xct.build();
	q1yct.range_update(1,n);
	
	amnt.alloc(n);
	Fe(i,1,n)if(is2[i]){
		amnt[i]=qt(i);
	}
	amnt.range_update(1,n);
	
	Fe(_,1,m){
		int y=read(1,n);
		int l=read(1,n),r=read(l,n);
		int y1=1e9;
		pr("\ny=%d\n",y);
		int y0=q1yct.find_lm([](Sum<int> d){return d.x;});
		if(y>=y0){
			q1yct.add(y,1);
			q1st.add(y,y);
			q1yct.add(y0,-1);
			q1st.add(y0,-y0);
			
			if(y>=qmnt.query().x){
				int i0=qmnt.find_lm([y](D1 d){return y>=d.x;});
				if(i0<=n)amnt.update_suffix(i0,-1);
			}
			
			mx=inf-1;
			for(;amnt.query().x==0;){
				int i=amnt.find_lm([](D1 d){return !d.x;});
				if(i>n)break;
				if(i>1)mx=min(mx,qmnt.query_prefix(i-1).x);
				
				is2[i]=0;
				is1[i]=1;
				qst.add(i,-a[i]);
				qmnt.update(i,inf);
				amnt.dna(i);
				amnt.update(i,inf);
				q1xct.add(i,1);
				q1yct.add(a[i],1);
				q1st.add(a[i],a[i]);
				for(;;){
					i=qmnt.bsearch_r(i+1,[mx](D1 d){return mx>=d.x;})+1;
					if(i>n||is2[i])break;
					mx=a[i];
					is2[i]=1;
					
					amnt.dna(i);
					amnt.update(i,qt(i));
				}
			}
		}
		i64 s=0;
		s+=q1s(l)-q1s(r+1);
		s+=qst.sum(r)-qst.sum(l-1);
		write(s,'\n');
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 732ms
memory: 34160kb

input:

499998 499999
225823 463012 151183 217174 254116 87516 430524 123887 1361 369166 194997 386501 152639 163995 82309 151761 31404 226965 394185 101304 79621 99315 150936 156155 31208 399526 358496 220267 192773 347327 92807 441843 423834 173327 131913 369822 399380 107225 354942 357415 472293 22050 24...

output:

30690660976
47414891120
105487455953
22358372158
20975402746
6257771014
31201467488
115331181834
9124930293
7824102632
2146273518
51745314301
53146730142
23687230091
120607771274
1050423809
72818807434
38847698680
5378878564
27350934969
7121225405
11453494649
23342470451
58986381247
8361770541
35351...

result:

ok 499999 numbers

Test #2:

score: 0
Accepted
time: 700ms
memory: 32616kb

input:

499997 499998
337227 261334 260186 478031 461552 139402 19112 72167 275683 30137 218339 14400 89776 85755 56769 254059 264675 353757 498697 206831 204792 429587 477795 330852 438570 62026 275861 312245 75760 4469 384374 444618 285169 113560 147752 82400 402556 194854 104857 495285 29165 227680 45661...

output:

55556178075
38928407081
78923486861
43283234518
25650712801
28229461681
65900240569
47967520848
90661784500
27613845938
40947764302
24031914863
62841665071
25540879622
9362272779
46554873243
55143194477
72516594710
4246406354
86010703796
27623396436
17971314716
4854137293
29667895428
25929438490
301...

result:

ok 499998 numbers

Test #3:

score: 0
Accepted
time: 550ms
memory: 34236kb

input:

499995 499997
426379 492343 483649 372035 428954 412141 424967 380182 470956 376535 323087 294730 403943 379100 380403 497804 486163 416217 454988 464790 466867 468193 477096 407118 405359 389749 370075 365394 356611 348919 348179 346322 340696 339303 306353 240677 230311 246053 260237 269345 281365...

output:

89831822565
32628604147
74121602184
25858292656
75020010261
79400611926
75639582722
89497653965
50241170690
47190073210
42913203509
12355358812
64364472102
5975699508
108470104597
103203459693
51848061043
19096394194
96893341304
19840215385
8665210084
37203382396
6420315861
70111173030
36036761518
1...

result:

ok 499997 numbers

Test #4:

score: 0
Accepted
time: 712ms
memory: 34144kb

input:

499995 499998
230168 144287 135928 442292 115298 274981 358816 497837 229294 418871 230840 359684 38491 2821 107643 40450 116262 884 169843 138575 277079 47199 322130 155842 440870 324936 378663 22041 429519 492575 179245 398989 62461 198704 289661 268038 75515 277751 67466 250061 192279 18679 16945...

output:

1676100260
11017308813
55395161227
33366611930
3951170105
59638413211
43605562345
36307776847
2489640079
13086121735
68100790213
15042784689
34503617043
59101323614
48083445072
71045135082
4572014907
41340487716
21575574013
46913358164
45708934502
1832759940
79125125615
11744755718
22886837635
58825...

result:

ok 499998 numbers

Test #5:

score: 0
Accepted
time: 573ms
memory: 32572kb

input:

499997 499997
451514 461035 458613 463988 460861 433362 476709 463574 493325 477560 436650 443783 451190 463436 481201 497059 469533 489821 438385 466956 434118 498307 472916 436417 460465 450951 437769 453650 441906 461378 490127 482127 459470 491368 442858 437521 482014 453804 428804 456428 487866...

output:

3603345119
113633307760
69719101269
63006953312
73915451033
53957868961
10263214676
39641623036
13659390583
37286757989
10928979032
22068301955
8070089978
44015760996
23261012971
3013175998
104257438210
76024525215
7710456019
7878251127
90348498837
9056810667
21321801822
59058435765
51807399709
5753...

result:

ok 499997 numbers

Test #6:

score: 0
Accepted
time: 600ms
memory: 34172kb

input:

499996 499996
492262 488431 489063 495414 490758 492568 488514 490197 496394 494920 490413 493865 498909 495886 497082 499896 497203 499817 499213 499601 499337 498365 495206 498513 497967 498803 499141 499031 495315 496031 496216 496440 496758 496898 497544 496872 494390 494236 497098 495035 494944...

output:

64923464842
51130126738
21854391061
66492604697
42861331976
41570316917
19593239410
23101057691
25024304575
12826937160
10921447663
101992588330
4604263767
19698555961
55540629436
76091375457
5830416514
45924963375
73318081240
71524149868
31202589470
52931661620
39282581086
22718997443
8895053269
61...

result:

ok 499996 numbers

Test #7:

score: 0
Accepted
time: 725ms
memory: 33980kb

input:

500000 500000
429754 241122 314721 350175 339659 91918 114877 307995 5838 231452 66230 54216 282348 15952 382572 358090 230070 377281 449827 229736 242530 478691 109112 240504 451991 495791 491662 7227 71909 365677 373901 373689 116695 12746 445690 334973 287903 217207 369103 404205 81044 219159 206...

output:

74468424390
47040099816
62278640593
24520755972
28307616569
55359799091
15656897735
12613204673
31034684007
6700964616
72174598825
77191699501
13617247025
74732853276
42848671806
11757583519
45681051985
42848413120
19850027960
2855881228
23049698172
28109205087
19610054475
5688194237
84326270110
145...

result:

ok 500000 numbers

Test #8:

score: 0
Accepted
time: 591ms
memory: 34100kb

input:

499997 499998
289663 479972 115609 235418 288393 114511 132219 166334 495596 497992 241370 144603 451935 80385 266225 472924 371933 321023 386212 55025 52056 419962 262916 474414 483139 456671 441858 352672 213786 188087 166643 163960 154742 122272 131930 107074 99943 97905 97295 90632 88001 87231 7...

output:

25842792682
48343298968
2775216930
93768748384
106320970536
17002621243
56677826591
75903474014
101944882163
21577430923
96139502787
64287166274
18130209883
18209152547
29175554025
17951054034
107615110527
13020739847
7680583583
46595337455
44449033548
114403950654
85318161500
7707754413
18073231093...

result:

ok 499998 numbers

Test #9:

score: 0
Accepted
time: 701ms
memory: 32664kb

input:

500000 500000
157502 281872 283979 154676 494126 328596 280595 65697 10152 225826 72004 112347 228505 198019 113263 28880 255561 228576 475159 197811 433416 71323 401033 348178 398001 492341 108831 466656 352558 470840 396064 124727 113235 350442 369795 386855 341678 404810 110241 16016 287764 34117...

output:

24626152869
16317848582
70230820137
57803844441
57530964961
1929096148
78468977361
23711603702
63784314661
68162339902
58150721060
14155526920
56591666058
45326163508
89620995545
18041771225
13468663054
11448194787
60178542187
40931914125
52614524316
43662968016
71302776674
27007030807
1424466093
17...

result:

ok 500000 numbers

Test #10:

score: 0
Accepted
time: 705ms
memory: 34636kb

input:

500000 500000
143419 323799 428309 422447 423854 374092 363195 162878 393467 436394 329156 300140 87307 294986 26167 380746 477136 435298 218167 235480 105449 311707 153838 295504 66905 356073 278656 111609 33232 304961 326156 1011 43229 418812 290004 489304 100087 182436 306930 360163 415114 227937...

output:

103760081123
25649291469
61388478740
7844097196
71605235751
23125659921
36954659358
28360848589
32944910737
65855716379
5632231614
3946844555
38405635591
23992972302
3020074293
103109996300
11428702194
97059974969
21758323711
31261944207
15518599077
1934201271
9189614680
800907083
53178530186
637756...

result:

ok 500000 numbers