Submission #77712

#TimeUsernameProblemLanguageResultExecution timeMemory
77712nxteruBubble Sort 2 (JOI18_bubblesort2)C++14
100 / 100
6476 ms493756 KiB
#include "bubblesort2.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <string>
#include <math.h>
using namespace std;
typedef long long ll;
typedef double D;
typedef pair<int,int> P;
#define M 1000000007
#define F first
#define S second
#define PB push_back
#define INF 1000000000
int n,q,seg[1<<21],la[1<<21],x[500005],p[500005],v[500005];
priority_queue<int>d[1000005];
set<int>u[1000005];
vector<int>cm;
map<int,int>pr;
void lazy(int l,int r,int k){
	seg[k]+=la[k];
	if(l!=r){
		la[k*2+1]+=la[k];
		la[k*2+2]+=la[k];
	}
	la[k]=0;
}
void add(int a,int b,int l,int r,int k,int x){
	lazy(l,r,k);
	if(r<a||b<l)return;
	if(a<=l&&r<=b){
		la[k]+=x;
		lazy(l,r,k);
		return;
	}
	add(a,b,l,(l+r-1)/2,k*2+1,x);
	add(a,b,(l+r+1)/2,r,k*2+2,x);
	seg[k]=max(seg[k*2+1],seg[k*2+2]);
}
int que(int a,int b,int l,int r,int k){
	lazy(l,r,k);
	if(r<a||b<l)return -INF;
	if(a<=l&&r<=b)return seg[k];
	return max(que(a,b,l,(l+r-1)/2,k*2+1),que(a,b,(l+r+1)/2,r,k*2+2));
}
vector<int> countScans(vector<int> A,vector<int> X,vector<int> V){
	vector<int>ans;
	n=A.size();
	q=X.size();
	for(int i=0;i<n;i++){
		x[i]=A[i];
		cm.PB(x[i]);
	}
	for(int i=0;i<q;i++){
		p[i]=X[i];
		v[i]=V[i];
		cm.PB(v[i]);
	}
	sort(cm.begin(),cm.end());
	cm.erase(unique(cm.begin(),cm.end()),cm.end());
	for(int i=0;i<cm.size();i++)pr[cm[i]]=i;
	for(int i=0;i<n;i++)x[i]=pr[x[i]];
	for(int i=0;i<q;i++)v[i]=pr[v[i]];
	for(int i=0;i<cm.size();i++){
		d[i].push(0);
		u[i].insert(0);
	}
	for(int i=0;i<n;i++){
		add(x[i],cm.size()-1,0,(1<<20)-1,0,-1);
		d[x[i]].push(i+1);
		u[x[i]].insert(i+1);
	}
	for(int i=0;i<cm.size();i++){
		add(i,i,0,(1<<20)-1,0,d[i].top());
	}
	for(int i=0;i<q;i++){
		int a=p[i],b=v[i];
		if(x[a]==b){
			ans.PB(que(0,cm.size(),0,(1<<20)-1,0));
			continue;
		}
		add(x[a],cm.size()-1,0,(1<<20)-1,0,1);
		add(b,cm.size()-1,0,(1<<20)-1,0,-1);
		u[x[a]].erase(a+1);
		if(d[x[a]].top()==a+1){
			while(u[x[a]].find(d[x[a]].top())==u[x[a]].end())d[x[a]].pop();
			add(x[a],x[a],0,(1<<20)-1,0,-(a+1)+d[x[a]].top());
		}
		x[a]=b;
		u[b].insert(a+1);
		if(d[b].top()<a+1){
			add(b,b,0,(1<<20)-1,0,-d[b].top()+a+1);
		}
		d[b].push(a+1);
		ans.PB(que(0,cm.size(),0,(1<<20)-1,0));
	}
	return ans;
}

Compilation message (stderr)

bubblesort2.cpp: In function 'std::vector<int> countScans(std::vector<int>, std::vector<int>, std::vector<int>)':
bubblesort2.cpp:68:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<cm.size();i++)pr[cm[i]]=i;
              ~^~~~~~~~~~
bubblesort2.cpp:71:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<cm.size();i++){
              ~^~~~~~~~~~
bubblesort2.cpp:80:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<cm.size();i++){
              ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...