답안 #53275

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
53275 2018-06-29T06:41:32 Z zetapi 새 집 (APIO18_new_home) C++14
33 / 100
4395 ms 1179648 KB
#include <bits/stdc++.h>
using namespace std;
 
#define pb  push_back
#define mp  make_pair
#define int long long
#define itr ::iterator 
 
typedef pair<int,int>  pii;
 
const int MAX=1e7;
const int INF=1e8;
 
struct data
{
	int val;
	int left;
	int right;
}  	seg[MAX],seg_[MAX];

multiset<int> st[MAX];
multiset<int> itr it,nxt,pre;

vector<int> vec[MAX];

vector<pii> order;

vector< pair<int,pii> > ask;

int N,K,Q,X,Y,n,t,ok,timer,timers,ptr,type[MAX],loc[MAX],res[MAX];
 
int get(int X,int Y)
{
	return Y-X;
}
 
int gets(int X,int Y)
{
	if(!Y)
		return 0;
	return X-Y;
}
 
void UpdateNeg(int low,int high,int node,int qlow,int delta)
{	
	if(low>high or qlow>high)
		return ;
	if(qlow<=low)
	{
		seg[node].val=max(seg[node].val,delta);
		return ;
	}
	if(!seg[node].left)
		seg[node].left=++timer;
	if(!seg[node].right)
		seg[node].right=++timer;
	int mid=(low+high)/2;
	UpdateNeg(low,mid,seg[node].left,qlow,delta);
	UpdateNeg(mid+1,high,seg[node].right,qlow,delta);
	return ;
}
 
void UpdatePos(int low,int high,int node,int qhigh,int delta)
{
	if(low>high or low>qhigh)
		return ;
	if(high<=qhigh)
	{
		if(!seg_[node].val)
			seg_[node].val=delta;
		else
			seg_[node].val=min(seg_[node].val,delta);
		return ;
	}
	if(!seg_[node].left)
		seg_[node].left=++timers;
	if(!seg_[node].right)
		seg_[node].right=++timers;
	int mid=(low+high)/2;
	UpdatePos(low,mid,seg_[node].left,qhigh,delta);
	UpdatePos(mid+1,high,seg_[node].right,qhigh,delta);
	return ;
}
 
int QueryNeg(int low,int high,int node,int idx)
{
	if(!node)
		return 0;
	if(low==high)
		return get(idx,seg[node].val);
	int mid=(low+high)/2;
	if(idx>=low and idx<=mid)
		return max(get(idx,seg[node].val),QueryNeg(low,mid,seg[node].left,idx));
	else
		return max(get(idx,seg[node].val),QueryNeg(mid+1,high,seg[node].right,idx));
}
 
int QueryPos(int low,int high,int node,int idx)
{
	if(!node)
		return 0;
	if(low==high)
		return gets(idx,seg_[node].val);
	int mid=(low+high)/2;
	if(idx>=low and idx<=mid)
		return max(gets(idx,seg_[node].val),QueryPos(low,mid,seg_[node].left,idx));
	else
		return max(gets(idx,seg_[node].val),QueryPos(mid+1,high,seg_[node].right,idx));
}
 
void exclude(int ind)
{
	int CurType=type[ind],CurLoc=loc[ind];
	it=st[CurType].find(CurLoc);
	if(it==st[CurType].begin())
	{
	 	if((++it)==st[CurType].end())
		{
			ok=1;
			st[CurType].erase(--it);
			return ;
		}
		--it;
	}
	if(it==st[CurType].begin())
	{
		nxt=it;
		++nxt;
		UpdateNeg(1,n,1,1,*nxt);
		st[CurType].erase(it);
	}
	else if((++it)==st[CurType].end())
	{
		--it;
		pre=it;
		--pre;
		UpdatePos(1,n,1,n,*pre);
		st[CurType].erase(it);
	}
	else
	{
      	--it;
		pre=it;
		nxt=it;
		--pre;
		++nxt;
		UpdatePos(1,n,1,(*pre+*nxt)/2,*pre);
		UpdateNeg(1,n,1,(*pre+*nxt+1)/2,*nxt);	
		st[CurType].erase(it);
	}
	return ;
}

signed main()
{
	ios_base::sync_with_stdio(false);
 
	n=INF+9;
	timer=1;
	timers=1;
	cin>>N>>K>>Q;
	for(int A=1;A<=N;A++)
	{
		cin>>loc[A]>>type[A]>>X>>X;
		vec[type[A]].pb(loc[A]);
		st[type[A]].insert(loc[A]);
		order.pb(mp(X,A));
	}
	sort(order.begin(),order.end());
	for(int A=1;A<=K;A++)
	{
		if(vec[A].empty())
		{
			while(Q--)
				cout<<-1<<"\n";
			return 0;
		}
		sort(vec[A].begin(),vec[A].end());
		for(int B=1;B<vec[A].size();B++)
			UpdateNeg(1,n,1,(vec[A][B]+vec[A][B-1]+1)/2,vec[A][B]);
		for(int B=0;B<vec[A].size()-1;B++)
			UpdatePos(1,n,1,(vec[A][B]+vec[A][B+1])/2,vec[A][B]);
		UpdateNeg(1,n,1,1,*vec[A].begin());
		UpdatePos(1,n,1,INF,vec[A].back());
	}
	for(int A=1;A<=Q;A++)
	{
		cin>>X>>Y;
		ask.pb(mp(Y,mp(X,A)));
	}
	sort(ask.begin(),ask.end());
	for(auto A:ask)
	{
		while(ptr<order.size() and order[ptr].first<A.first)
		{
			exclude(order[ptr].second);
			++ptr;
		}
		if(ok)
			res[A.second.second]=-1;
		else
			res[A.second.second]=max(QueryPos(1,n,1,A.second.first),QueryNeg(1,n,1,A.second.first));
	}
	for(int A=1;A<=Q;A++)
		cout<<res[A]<<"\n";
	return 0;
}

Compilation message

new_home.cpp: In function 'int main()':
new_home.cpp:179:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int B=1;B<vec[A].size();B++)
               ~^~~~~~~~~~~~~~
new_home.cpp:181:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int B=0;B<vec[A].size()-1;B++)
               ~^~~~~~~~~~~~~~~~
new_home.cpp:194:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(ptr<order.size() and order[ptr].first<A.first)
         ~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 704780 KB Output is correct
2 Correct 575 ms 704872 KB Output is correct
3 Correct 608 ms 704992 KB Output is correct
4 Incorrect 619 ms 705164 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 704780 KB Output is correct
2 Correct 575 ms 704872 KB Output is correct
3 Correct 608 ms 704992 KB Output is correct
4 Incorrect 619 ms 705164 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2592 ms 928596 KB Output is correct
2 Correct 2535 ms 965480 KB Output is correct
3 Correct 1271 ms 965480 KB Output is correct
4 Correct 2525 ms 965480 KB Output is correct
5 Correct 2425 ms 975712 KB Output is correct
6 Correct 2656 ms 975712 KB Output is correct
7 Correct 1040 ms 975712 KB Output is correct
8 Correct 2302 ms 975712 KB Output is correct
9 Correct 2481 ms 975712 KB Output is correct
10 Correct 2622 ms 975712 KB Output is correct
11 Correct 1907 ms 975712 KB Output is correct
12 Correct 2086 ms 975712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4183 ms 1095452 KB Output is correct
2 Correct 1430 ms 1095452 KB Output is correct
3 Correct 4395 ms 1138092 KB Output is correct
4 Correct 1325 ms 1138092 KB Output is correct
5 Correct 2344 ms 1138092 KB Output is correct
6 Correct 2023 ms 1138092 KB Output is correct
7 Correct 4314 ms 1179648 KB Output is correct
8 Correct 4352 ms 1179648 KB Output is correct
9 Correct 1179 ms 1179648 KB Output is correct
10 Correct 2692 ms 1179648 KB Output is correct
11 Correct 3904 ms 1179648 KB Output is correct
12 Correct 4341 ms 1179648 KB Output is correct
13 Correct 2254 ms 1179648 KB Output is correct
14 Correct 2175 ms 1179648 KB Output is correct
15 Correct 2578 ms 1179648 KB Output is correct
16 Correct 2698 ms 1179648 KB Output is correct
17 Correct 2544 ms 1179648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 704780 KB Output is correct
2 Correct 575 ms 704872 KB Output is correct
3 Correct 608 ms 704992 KB Output is correct
4 Incorrect 619 ms 705164 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 704780 KB Output is correct
2 Correct 575 ms 704872 KB Output is correct
3 Correct 608 ms 704992 KB Output is correct
4 Incorrect 619 ms 705164 KB Output isn't correct
5 Halted 0 ms 0 KB -