Submission #887198

#TimeUsernameProblemLanguageResultExecution timeMemory
887198MinbaevStone Arranging 2 (JOI23_ho_t1)C++17
25 / 100
87 ms32728 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast,unroll-loops")
#define pii pair<int,int>
using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define int long long
#define f first
#define s second
#define pii pair<int,int>
template<class T>bool umax(T &a,T b){if(a<b){a=b;return true;}return false;}
template<class T>bool umin(T &a,T b){if(b<a){a=b;return true;}return false;}
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
	tree_order_statistics_node_update> ordered_set;
const int mod= 1e9 +7;
const int N=1e5*4;

int binpow (int a, int n) {
	if (n == 0)
		return 1;
	if (n % 2 == 1)
		return binpow (a, n-1) * a;
	else {
		int b = binpow (a, n/2);
		return b * b;
	}
}
int t[N*4],bn[N*4];
vector<int>v(N);	

void push(int tl,int tr,int v){
	
	if(bn[v]==-1){
		return;
	}
	t[v]=(tr-tl+1)*bn[v];
	if(tl!=tr){
	bn[v*2]=bn[v];
	bn[v*2+1]=bn[v];		
	}
	bn[v]=-1;
	
}

void build(int tl,int tr,int vs){
	if(tl==tr){
		t[vs] = v[tl];
		return;
	}
	int tm = (tl+tr)/2;
	build(tl,tm,vs*2);
	build(tm+1,tr,vs*2+1);
	t[vs] = t[vs*2] + t[vs*2+1];
	
	
}

void update( int v,int l,int r,int x,int tl,int tr){
	 
	push(tl,tr,v);
	if(l>tr||r<tl||tr<tl)return;
	if(l<=tl&&tr<=r){
		bn[v]=x;
		push(tl,tr,v);
		return;
	}
	 int tm=(tl+tr)/2;
	 update(v*2,l,r,x,tl,tm);
	 update(v*2+1,l,r,x,tm+1,tr);
	 t[v]=t[v*2]+t[v*2+1];
}

int getsum(int l,int r,int v,int tl,int tr){
	push(tl,tr,v);
	if(l>tr||r<tl||tr<tl)return 0;
	if(l<=tl&&tr<=r){
		return t[v];
	}
	int tm=(tl+tr)/2;
	return getsum(l,r,v*2,tl,tm)+getsum(l,r,v*2+1,tm+1,tr);
}


void solve(){
	for(int i = 1;i<N*4;i++){
		bn[i] = -1;
	}
	
	int n,m,k;
	
	cin>>n;
	
	for(int i = 0;i<n;i++)cin>>v[i];
	
	build(0,n-1,1);
	
	vector<int>ans(n);
	
	if(n<=2000){
		for(int i = 0;i<n;i++){
			ans[i] = v[i];
			for(int j = i - 1;j>=0;j--){
				if(ans[j]==v[i]){
					for(int k = j;k<i;k++){
						ans[k] = v[i];
					}
					break;
				}
			}
		}
		for(auto to:ans)cout<<to<<"\n";
		return;
	}
	
	deque<int>q1,q2;
//	int ind1 = -1,ind2 = -1;
	vector<pair<int,pii>>vs;
	for(int i = 0;i<n;i++){
		if(v[i]==1){
			if(q1.empty()){
				q1.pb(i);
				continue;
			}
			int u = q1.back();
			while(!q2.empty()&&q2.back()>u)q2.pop_back();
			q1.pb(i);
			vs.pb({1,{u,i}});
//			cout<<u<<" "<<i<<endl;
		}
		else{
			if(q2.empty()){
				q2.pb(i);
				continue;
			}
			int u = q2.back();
			while(!q1.empty()&&q1.back()>u)q1.pop_back();
			q2.pb(i);
			vs.pb({2,{u,i}});	
		}
	}
	
	for(auto [val,to] : vs){
		update(1,to.f,to.s,val,1,n);
	}
	
	for(int i = 0;i<n;i++){
		ans[i] = getsum(i,i,1,0,n-1);
	}
	
	for(auto to:ans)	
		cout<<to<<"\n";
	
	








}

 signed main()
{
//	freopen("seq.in", "r", stdin);
//  freopen("seq.out", "w", stdout);
	ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL);
	int cnt=0;
	int tt=1;//cin>>tt;
	while(tt--)solve();

}


Compilation message (stderr)

Main.cpp: In function 'void solve()':
Main.cpp:94:8: warning: unused variable 'm' [-Wunused-variable]
   94 |  int n,m,k;
      |        ^
Main.cpp:94:10: warning: unused variable 'k' [-Wunused-variable]
   94 |  int n,m,k;
      |          ^
Main.cpp: In function 'int main()':
Main.cpp:174:6: warning: unused variable 'cnt' [-Wunused-variable]
  174 |  int cnt=0;
      |      ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...