답안 #251067

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
251067 2020-07-20T05:30:53 Z kshitij_sodani Bubble Sort 2 (JOI18_bubblesort2) C++14
38 / 100
2246 ms 422008 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=3200;
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
	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){
			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:220:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(low==tt[i].size()){
        ~~~^~~~~~~~~~~~~~
bubblesort2.cpp:186:7: warning: unused variable 'kk' [-Wunused-variable]
   int kk=0;
       ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 344 ms 392316 KB Output is correct
2 Correct 351 ms 392440 KB Output is correct
3 Correct 491 ms 393720 KB Output is correct
4 Correct 480 ms 393592 KB Output is correct
5 Correct 464 ms 393592 KB Output is correct
6 Correct 454 ms 393852 KB Output is correct
7 Correct 454 ms 393464 KB Output is correct
8 Correct 552 ms 393528 KB Output is correct
9 Correct 447 ms 393592 KB Output is correct
10 Correct 482 ms 393592 KB Output is correct
11 Correct 460 ms 393592 KB Output is correct
12 Correct 461 ms 393592 KB Output is correct
13 Correct 483 ms 393632 KB Output is correct
14 Correct 514 ms 393720 KB Output is correct
15 Correct 501 ms 393592 KB Output is correct
16 Correct 524 ms 393720 KB Output is correct
17 Correct 545 ms 393768 KB Output is correct
18 Correct 526 ms 393592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 344 ms 392316 KB Output is correct
2 Correct 351 ms 392440 KB Output is correct
3 Correct 491 ms 393720 KB Output is correct
4 Correct 480 ms 393592 KB Output is correct
5 Correct 464 ms 393592 KB Output is correct
6 Correct 454 ms 393852 KB Output is correct
7 Correct 454 ms 393464 KB Output is correct
8 Correct 552 ms 393528 KB Output is correct
9 Correct 447 ms 393592 KB Output is correct
10 Correct 482 ms 393592 KB Output is correct
11 Correct 460 ms 393592 KB Output is correct
12 Correct 461 ms 393592 KB Output is correct
13 Correct 483 ms 393632 KB Output is correct
14 Correct 514 ms 393720 KB Output is correct
15 Correct 501 ms 393592 KB Output is correct
16 Correct 524 ms 393720 KB Output is correct
17 Correct 545 ms 393768 KB Output is correct
18 Correct 526 ms 393592 KB Output is correct
19 Correct 1354 ms 399384 KB Output is correct
20 Correct 1482 ms 400120 KB Output is correct
21 Correct 1322 ms 400120 KB Output is correct
22 Correct 1460 ms 400400 KB Output is correct
23 Correct 1863 ms 400248 KB Output is correct
24 Correct 1881 ms 400092 KB Output is correct
25 Correct 2055 ms 400080 KB Output is correct
26 Correct 2082 ms 400280 KB Output is correct
27 Correct 2246 ms 400268 KB Output is correct
28 Correct 2246 ms 400152 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 858 ms 422008 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 344 ms 392316 KB Output is correct
2 Correct 351 ms 392440 KB Output is correct
3 Correct 491 ms 393720 KB Output is correct
4 Correct 480 ms 393592 KB Output is correct
5 Correct 464 ms 393592 KB Output is correct
6 Correct 454 ms 393852 KB Output is correct
7 Correct 454 ms 393464 KB Output is correct
8 Correct 552 ms 393528 KB Output is correct
9 Correct 447 ms 393592 KB Output is correct
10 Correct 482 ms 393592 KB Output is correct
11 Correct 460 ms 393592 KB Output is correct
12 Correct 461 ms 393592 KB Output is correct
13 Correct 483 ms 393632 KB Output is correct
14 Correct 514 ms 393720 KB Output is correct
15 Correct 501 ms 393592 KB Output is correct
16 Correct 524 ms 393720 KB Output is correct
17 Correct 545 ms 393768 KB Output is correct
18 Correct 526 ms 393592 KB Output is correct
19 Correct 1354 ms 399384 KB Output is correct
20 Correct 1482 ms 400120 KB Output is correct
21 Correct 1322 ms 400120 KB Output is correct
22 Correct 1460 ms 400400 KB Output is correct
23 Correct 1863 ms 400248 KB Output is correct
24 Correct 1881 ms 400092 KB Output is correct
25 Correct 2055 ms 400080 KB Output is correct
26 Correct 2082 ms 400280 KB Output is correct
27 Correct 2246 ms 400268 KB Output is correct
28 Correct 2246 ms 400152 KB Output is correct
29 Incorrect 858 ms 422008 KB Output isn't correct
30 Halted 0 ms 0 KB -