답안 #251073

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
251073 2020-07-20T05:46:32 Z kshitij_sodani Bubble Sort 2 (JOI18_bubblesort2) C++14
38 / 100
4019 ms 406628 KB
#include <bits/stdc++.h>
using namespace std;
typedef int64_t llo;
#define mp make_pair
#define pb push_back
#define a first 
#define b second
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace __gnu_pbds;
#define ord tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update>

//#include "bubblesort2.h"
const int ss=500001;
int ind2[500001];//current index of element i
vector<pair<int,int>> tt[500001/ss+1];
int ind[1000001];//index of each n+q-1 in seg tree
int lazy[4000001];
int tree4[4000001];
ord tree2[4000001];
int ac[500001];

void build(int no,int l,int r){
	if(l==r){
		tree2[no].insert({ac[l],ind[l]});
	}
	else{
		int mid=(l+r)/2;
		build(no*2+1,l,mid);
		build(no*2+2,mid+1,r);
		tree2[no]=tree2[no*2+1];
		for(auto j:tree2[no*2+2]){
			tree2[no].insert(j);
		}
	}
}

int query(int no,int l,int r,int aa,int bb,int val){
	if(r<aa or l>bb){
		return 0;
	}
	if(aa<=l and r<=bb){
		return tree2[no].size()-tree2[no].order_of_key({val+1,0});
	}
	else{
		int mid=(l+r)/2;
		return query(no*2+1,l,mid,aa,bb,val)+query(no*2+2,mid+1,r,aa,bb,val);
	}
}
void update3(int no,int l,int r,int ind5,pair<int,int> old,pair<int,int> nn){
	if(r<ind5 or l>ind5){
		return;
	}
	tree2[no].erase(old);
	tree2[no].insert(nn);
	if(l<r){
		int mid=(l+r)/2;
		update3(no*2+1,l,mid,ind5,old,nn);
		update3(no*2+2,mid+1,r,ind5,old,nn);
	}
}
void update(int no,int l,int r,int aa,int bb,int val){
	tree4[no]+=lazy[no];
	if(l<r){
		lazy[no*2+1]+=lazy[no];
		lazy[no*2+2]+=lazy[no];
	}
	lazy[no]=0;
	if(r<aa or l>bb){
		return;
	}
	if(aa<=l and r<=bb){
		tree4[no]+=val;
		if(l<r){
			lazy[no*2+1]+=val;
			lazy[no*2+2]+=val;
		}
	}
	else{
		int mid=(l+r)/2;
		update(no*2+1,l,mid,aa,bb,val);
		update(no*2+2,mid+1,r,aa,bb,val);
		tree4[no]=max(tree4[no*2+1],tree4[no*2+2]);
	}
}
void update2(int no,int l,int r,int aa,int val){
	tree4[no]+=lazy[no];
	if(l<r){
		lazy[no*2+1]+=lazy[no];
		lazy[no*2+2]+=lazy[no];
	}
	lazy[no]=0;
	if(r<aa or l>aa){
		return;
	}
	if(l==r){
		tree4[no]=val;
	}
	else{
		int mid=(l+r)/2;
		update2(no*2+1,l,mid,aa,val);
		update2(no*2+2,mid+1,r,aa,val);
		tree4[no]=max(tree4[no*2+1],tree4[no*2+2]);
	}
}
std::vector<int> countScans(std::vector<int> it,std::vector<int> X,std::vector<int> V){
	int q=X.size();
	int n=it.size();


	for(int i=0;i<n;i++){
		ac[i]=it[i];
	}
	//sqrt blocks process
	for(int i=0;i<n;i++){
		tt[i/ss].pb({it[i],i});
	}
	for(int i=0;i<q;i++){
		tt[X[i]/ss].pb({V[i],i+n});
	}
	for(int i=0;i<=(n-1)/ss;i++){
		sort(tt[i].begin(),tt[i].end());
	}
	//end

	//process index
	int co=-1;
	for(int i=0;i<=(n-1)/ss;i++){
		for(auto j:tt[i]){
			co+=1;
			ind[j.b]=co;
			if(j.b<n){
				ind2[j.b]=co;
			}
		}
	}
	build(0,0,n-1);
	//end
	for(int i=0;i<4*(n+q);i++){
		tree4[i]=-1e9;
	}
//	memset(tree4,-1e9,sizeof(tree4));


	//initial tree
	ord kk;
	for(int i=0;i<n;i++){
		int cur=kk.size()-kk.order_of_key({it[i]+1,0});
		update2(0,0,n+q-1,ind[i],cur);
		kk.insert({it[i],i});

		//cout<<i<<","<<cur<<endl;
	}
	//end


	vector<int> ans;
/*	for(int i=0;i<n+q;i++){
		cout<<ind[i]<<":";
	}
	cout<<endl;*/
	//pre-process with pbds
	for(int ii=0;ii<q;ii++){
		int ind3=X[ii];
		int val=V[ii];
		int l,r,cc;

		update2(0,0,n+q-1,ind2[ind3],-1e9);
		//remove pairs from mst
		pair<int,int> old={it[ind3],ind2[ind3]};
		pair<int,int> nn={val,ind[ii+n]};
		update3(0,0,n-1,ind3,old,nn);
		// update answer of current index
		int x=0;
		if(ind3>0){
			/*for(int i=0;i<ind3;i++){
				if(it[i]>val){
					x+=1;
				}
			}*/
			x=query(0,0,n-1,0,ind3-1,val);
		}
	//	cout<<x<<endl;
		update2(0,0,n+q-1,ind[ii+n],x);
		//end


		ind2[ind3]=ind[ii+n];

		int kk=0;
		if(val<it[ind3]){
			l=val;
			r=it[ind3]-1;
			cc=-1;
		}
		else if(val>it[ind3]){
			l=it[ind3];
			r=val-1;
			cc=1;
		}
		else{
			continue;
		}
	//	cout<<l<<","<<r<<","<<cc<<endl;


		it[ind3]=val;

		for(int i=ind3/ss;i<=(n-1)/ss;i++){
			if(i==ind3/ss){
				for(int j=ind3+1;j<n;j++){
					if(j/ss>i){
						break;
					}
					if(it[j]>=l and it[j]<=r){

						update(0,0,n+q-1,ind2[j],ind2[j],cc);
					}
				}
				//for each index check individually and update
			}
			else{
				pair<int,int> kc={l,0};
				int low=lower_bound(tt[i].begin(),tt[i].end(),kc)-tt[i].begin();
				if(low==tt[i].size()){
					continue;
				}
				kc.a=r+1;
				int rr=lower_bound(tt[i].begin(),tt[i].end(),kc)-tt[i].begin();
				if(rr==low){
					continue;
				}
				update(0,0,n+q-1,ind[tt[i][low].b],ind[tt[i][low].b]+rr-low-1,cc);
				//binary search to find index in each block and update in seg tree
			}
		}
		ans.pb(tree4[0]);
	}
/*	for(auto j:ans){
		cout<<j<<",";
	}
	cout<<endl;*/
	return ans;
}

//#define endl '\n'

/*int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int nn,qq;
	cin>>nn>>qq;
	int pp;
	vector<int> ac;
	vector<int> bc;
	vector<int> dc;

	for(int i=0;i<nn;i++){
		cin>>pp;
		ac.pb(pp);
	}
	for(int i=0;i<qq;i++){
		cin>>pp;
		bc.pb(pp);
		cin>>pp;
		dc.pb(pp);
	}
	countScans(ac,bc,dc);
 
	return 0;
}*/

Compilation message

bubblesort2.cpp: In function 'std::vector<int> countScans(std::vector<int>, std::vector<int>, std::vector<int>)':
bubblesort2.cpp:226:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(low==tt[i].size()){
        ~~~^~~~~~~~~~~~~~
bubblesort2.cpp:191:7: warning: unused variable 'kk' [-Wunused-variable]
   int kk=0;
       ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 328 ms 376440 KB Output is correct
2 Correct 342 ms 376696 KB Output is correct
3 Correct 470 ms 377976 KB Output is correct
4 Correct 461 ms 378020 KB Output is correct
5 Correct 454 ms 377852 KB Output is correct
6 Correct 442 ms 377976 KB Output is correct
7 Correct 463 ms 377964 KB Output is correct
8 Correct 451 ms 377976 KB Output is correct
9 Correct 457 ms 377976 KB Output is correct
10 Correct 460 ms 377976 KB Output is correct
11 Correct 459 ms 378092 KB Output is correct
12 Correct 450 ms 377976 KB Output is correct
13 Correct 484 ms 377976 KB Output is correct
14 Correct 485 ms 377988 KB Output is correct
15 Correct 475 ms 377976 KB Output is correct
16 Correct 508 ms 377976 KB Output is correct
17 Correct 516 ms 377976 KB Output is correct
18 Correct 517 ms 378080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 328 ms 376440 KB Output is correct
2 Correct 342 ms 376696 KB Output is correct
3 Correct 470 ms 377976 KB Output is correct
4 Correct 461 ms 378020 KB Output is correct
5 Correct 454 ms 377852 KB Output is correct
6 Correct 442 ms 377976 KB Output is correct
7 Correct 463 ms 377964 KB Output is correct
8 Correct 451 ms 377976 KB Output is correct
9 Correct 457 ms 377976 KB Output is correct
10 Correct 460 ms 377976 KB Output is correct
11 Correct 459 ms 378092 KB Output is correct
12 Correct 450 ms 377976 KB Output is correct
13 Correct 484 ms 377976 KB Output is correct
14 Correct 485 ms 377988 KB Output is correct
15 Correct 475 ms 377976 KB Output is correct
16 Correct 508 ms 377976 KB Output is correct
17 Correct 516 ms 377976 KB Output is correct
18 Correct 517 ms 378080 KB Output is correct
19 Correct 2516 ms 383480 KB Output is correct
20 Correct 3224 ms 384632 KB Output is correct
21 Correct 2884 ms 384712 KB Output is correct
22 Correct 2856 ms 384636 KB Output is correct
23 Correct 3131 ms 384636 KB Output is correct
24 Correct 3171 ms 384504 KB Output is correct
25 Correct 3641 ms 384628 KB Output is correct
26 Correct 3503 ms 384536 KB Output is correct
27 Correct 3924 ms 384612 KB Output is correct
28 Correct 4019 ms 384668 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3197 ms 406628 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 328 ms 376440 KB Output is correct
2 Correct 342 ms 376696 KB Output is correct
3 Correct 470 ms 377976 KB Output is correct
4 Correct 461 ms 378020 KB Output is correct
5 Correct 454 ms 377852 KB Output is correct
6 Correct 442 ms 377976 KB Output is correct
7 Correct 463 ms 377964 KB Output is correct
8 Correct 451 ms 377976 KB Output is correct
9 Correct 457 ms 377976 KB Output is correct
10 Correct 460 ms 377976 KB Output is correct
11 Correct 459 ms 378092 KB Output is correct
12 Correct 450 ms 377976 KB Output is correct
13 Correct 484 ms 377976 KB Output is correct
14 Correct 485 ms 377988 KB Output is correct
15 Correct 475 ms 377976 KB Output is correct
16 Correct 508 ms 377976 KB Output is correct
17 Correct 516 ms 377976 KB Output is correct
18 Correct 517 ms 378080 KB Output is correct
19 Correct 2516 ms 383480 KB Output is correct
20 Correct 3224 ms 384632 KB Output is correct
21 Correct 2884 ms 384712 KB Output is correct
22 Correct 2856 ms 384636 KB Output is correct
23 Correct 3131 ms 384636 KB Output is correct
24 Correct 3171 ms 384504 KB Output is correct
25 Correct 3641 ms 384628 KB Output is correct
26 Correct 3503 ms 384536 KB Output is correct
27 Correct 3924 ms 384612 KB Output is correct
28 Correct 4019 ms 384668 KB Output is correct
29 Incorrect 3197 ms 406628 KB Output isn't correct
30 Halted 0 ms 0 KB -