제출 #942080

#제출 시각아이디문제언어결과실행 시간메모리
942080dsyzSnowball (JOI21_ho_t2)C++17
33 / 100
2574 ms4024 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define MAXN (1000005)
int main() {
	ios_base::sync_with_stdio(false);cin.tie(0);
	ll N,Q;
	cin>>N>>Q;
	set<pair<ll,ll> > s; //stores ranges of 1s
	s.insert({-1e18,1e18});
	ll X[N];
	for(ll i = 0;i < N;i++){
		cin>>X[i];
	}
	ll ans[N];
	memset(ans,0,sizeof(ans));
	ll wind[Q];
	for(ll q = 0;q < Q;q++){
		cin>>wind[q];
		if(wind[q] > 0){ //blow right
			for(ll i = N - 1;i >= 0;i--){
				ll Lb = X[i], Rb = X[i] + wind[q] - 1;
				auto it = s.lower_bound({Lb,Rb});
				if(it != s.begin()){
					auto it2 = it;
					it2--;
					if(it2->second >= Rb){
						pair<ll,ll> tmp = *it2;
						s.erase(it2);
						if(tmp.first < Lb) s.insert({tmp.first,Lb - 1});
						if(Rb < tmp.second) s.insert({Rb + 1,tmp.second});
						ans[i] += (Rb - Lb + 1);
					}else if(it2->second >= Lb){
						pair<ll,ll> tmp = *it2;
						s.erase(it2);
						s.insert({tmp.first,Lb - 1});
						ans[i] += (tmp.second - Lb + 1);
					}
				}
				while(it != s.end() && it->first <= Rb){
					pair<ll,ll> tmp = *it;
					ans[i] += (min(Rb,it->second) - max(Lb,it->first) + 1);
					auto it2 = it;
					it++;
					s.erase(it2);
					if(tmp.first < Lb) s.insert({tmp.first,Lb - 1});
					if(tmp.second > Rb) s.insert({Rb + 1,tmp.second});
				}
				X[i] += wind[q];
			}
		}else if(wind[q] < 0){ //blow left
			wind[q] *= -1;
			for(ll i = 0;i < N;i++){
				ll Lb = X[i] - wind[q], Rb = X[i] - 1;
				auto it = s.lower_bound({Lb,Rb});
				if(it != s.begin()){
					auto it2 = it;
					it2--;
					if(it2->second >= Rb){
						pair<ll,ll> tmp = *it2;
						s.erase(it2);
						if(tmp.first < Lb) s.insert({tmp.first,Lb - 1});
						if(Rb < tmp.second) s.insert({Rb + 1,tmp.second});
						ans[i] += (Rb - Lb + 1);
					}else if(it2->second >= Lb){
						pair<ll,ll> tmp = *it2;
						s.erase(it2);
						s.insert({tmp.first,Lb - 1});
						ans[i] += (tmp.second - Lb + 1);
					}
				}
				while(it != s.end() && it->first <= Rb){
					pair<ll,ll> tmp = *it;
					ans[i] += (min(Rb,it->second) - max(Lb,it->first) + 1);
					auto it2 = it;
					it++;
					s.erase(it2);
					if(tmp.first < Lb) s.insert({tmp.first,Lb - 1});
					if(tmp.second > Rb) s.insert({Rb + 1,tmp.second});
				}
				X[i] -= wind[q];
			}
		}
	}
	for(ll i = 0;i < N;i++){
		cout<<ans[i]<<'\n';
	}
	cout<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...