Submission #1228255


Source Code Expand

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <functional>
#include <cmath>
#include <string>
#include <cassert>
#define SIZE 200005
#define BT 256*1024*2
#define INF 1000000005

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;

struct segtree2
{
	int seg[BT];
	int mum;
	
	void init(int n)
	{
		mum=1;
		while(mum<n) mum<<=1;
		for(int i=0;i<mum*2;i++) seg[i]=-1;
	}
	void update(int a,int b,int k,int l,int r,int v)
	{
		if(b<=l||r<=a) return;
		if(a<=l&&r<=b) seg[k]=max(seg[k],v);
		else
		{
			update(a,b,k*2+1,l,(l+r)/2,v);
			update(a,b,k*2+2,(l+r)/2,r,v);
		}
	}
	void update(int a,int b,int v)
	{
		update(a,b,0,0,mum,v);
	}
	int get(int k)
	{
		k+=mum-1;
		int ret=seg[k];
		while(k>0)
		{
			k=(k-1)/2;
			ret=max(ret,seg[k]);
		}
		return ret;
	}
};
struct segtree//区間可算+区間min
{
	int seg[BT],add[BT];
	int mum;
	
	void init(int n)
	{
		mum=1;
		while(mum<n) mum<<=1;
		for(int i=0;i<mum*2;i++) seg[i]=add[i]=0;
	}
	void update(int a,int b,int k,int l,int r,int v)
	{
		if(b<=l||r<=a) return;
		if(a<=l&&r<=b)
		{
			seg[k]+=v;
			add[k]+=v;
		}
		else
		{
			update(a,b,k*2+1,l,(l+r)/2,v);
			update(a,b,k*2+2,(l+r)/2,r,v);
			seg[k]=min(seg[k*2+1],seg[k*2+2])+add[k];
		}
	}
	void update(int a,int b,int v)
	{
		update(a,b,0,0,mum,v);
	}
	int get(int a,int b,int k,int l,int r)
	{
		if(b<=l||r<=a) return INF;
		if(a<=l&&r<=b) return seg[k];
		else
		{
			int vl=get(a,b,k*2+1,l,(l+r)/2);
			int vr=get(a,b,k*2+2,(l+r)/2,r);
			return min(vl,vr)+add[k];
		}
	}
	int get(int a,int b)
	{
		return get(a,b,0,0,mum);
	}
};
segtree seg;
segtree2 s2;
int A[SIZE],B[SIZE],C[SIZE];
int M[SIZE];//M[i]=min(A[i],B[i]);
int ans[SIZE],dp[SIZE];
int mx[SIZE];
int nxt[SIZE];
bool ok[SIZE];
vector <int> vx;
int n;

void build()
{
	seg.init(vx.size()+2);
	for(int i=0;i<=n;i++) seg.update(0,C[i]+1,1);
	for(int i=0;i<n;i++) seg.update(0,M[i]+1,-1);
	if(seg.get(0,vx.size()+1)<0)
	{
		for(int i=0;i<vx.size();i++) ans[i]=-1;
		return;
	}
	vector <P> query;
	int cnt=0;
	for(int i=0;i<n;i++)
	{
		if(M[i]<A[i]) query.push_back(P(A[i],M[i]+1));
		else cnt++;
	}
	vector <P> zan;
	sort(query.begin(),query.end());
	s2.init(vx.size()+2);
	for(int i=0;i<query.size();i++)
	{
		P p=query[i];
		if(seg.get(p.second,p.first+1)<=0) zan.push_back(P(p.second,p.first));
		else
		{
			s2.update(p.second,p.first+1,p.first);
			seg.update(p.second,p.first+1,-1);
			cnt++;
		}
	}
	for(int i=0;i<vx.size();i++) mx[i]=s2.get(i);
	nxt[vx.size()]=vx.size();
	for(int i=vx.size()-1;i>=0;i--)
	{
		nxt[i]=nxt[i+1];
		if(seg.get(i,i+1)==0) nxt[i]=i;
	}
	sort(zan.begin(),zan.end());
	int to=((int) zan.size())-1;
	int mn=INF;
	dp[vx.size()]=INF;
	for(int i=vx.size()-1;i>=0;i--)
	{
		//i~dp[i] まで +1 したとき、個数も+1できるかどうかの最小のdp[i]を求めたい
		while(to>=0&&zan[to].first>=i)
		{
			mn=min(mn,zan[to].second);
			to--;
		}
		if(to+1==zan.size())
		{
			dp[i]=INF;
			continue;
		}
		int l=i-1,r=mn;//mnならokは確実
		while(r-l>1)
		{
			int m=(l+r)/2;//m+1<=mn
			if(nxt[m+1]>mn) r=m;
			else
			{
				int t=nxt[m+1];
				if(mx[t]>mn&&dp[mn+1]<=mx[t]) r=m;
				else l=m;
			}
		}
		dp[i]=r;
	}
	//for(int i=0;i<vx.size();i++) printf("%d ",dp[i]);puts("");
	//for(int i=0;i<vx.size();i++) printf("%d ",seg.get(i,i+1));puts("");
	//for(int i=0;i<vx.size();i++) printf("%d ",mx[i]);puts("");
	for(int i=0;i<vx.size();i++)
	{
		if(nxt[i]!=i) ans[i]=cnt;
		else
		{
			int t=mx[i];
			if(t==-1)
			{
				for(int j=i;j<vx.size();j++) ans[j]=-1;
				break;
			}
			for(int j=i;j<=t;j++)
			{
				if(nxt[j]!=j) ans[j]=ans[j-1];
				else
				{
					if(dp[j+1]<=t) ans[j]=cnt;
					else ans[j]=cnt-1;
				}
			}
			cnt--;
			i=t;
		}
	}
	//for(int i=0;i<=n;i++) printf("%d ",ans[i]);puts("");
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&A[i],&B[i]);
		M[i]=min(A[i],B[i]);
	}
	vx.push_back(INF);
	for(int i=0;i<=n;i++)
	{
		scanf("%d",&C[i]);
		vx.push_back(C[i]);
	}
	sort(C,C+n+1);
	sort(vx.begin(),vx.end());
	vx.erase(unique(vx.begin(),vx.end()),vx.end());
	for(int i=0;i<n;i++)
	{
		A[i]=lower_bound(vx.begin(),vx.end(),A[i])-vx.begin();
		M[i]=lower_bound(vx.begin(),vx.end(),M[i])-vx.begin();
	}
	for(int i=0;i<=n;i++) C[i]=lower_bound(vx.begin(),vx.end(),C[i])-vx.begin();
	build();
	int Q;
	scanf("%d",&Q);
	for(int i=0;i<Q;i++)
	{
		int d,e;
		scanf("%d %d",&d,&e);
		int ret=-1;
		//d使う場合
		int pos=lower_bound(vx.begin(),vx.end(),d)-vx.begin();
		int pc=lower_bound(C,C+n+1,pos)-C;
		if(pc<=n&&ans[C[pc]]!=-1) ret=max(ret,ans[C[pc]]+1);
		//e使う場合
		pos=lower_bound(vx.begin(),vx.end(),e)-vx.begin();
		pc=lower_bound(C,C+n+1,pos)-C;
		if(pc<=n&&ans[C[pc]]!=-1) ret=max(ret,ans[C[pc]]);
		printf("%d\n",ret);
	}
	return 0;
}

Submission Info

Submission Time
Task F - Two Faced Cards
User yutaka1999
Language C++14 (GCC 5.4.1)
Score 2000
Code Size 5094 Byte
Status AC
Exec Time 268 ms
Memory 13556 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:215:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
                ^
./Main.cpp:218:29: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&A[i],&B[i]);
                             ^
./Main.cpp:224:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&C[i]);
                    ^
./Main.cpp:238:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&Q);
                ^
./Main.cpp:242:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&d,&e);
                       ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 2000 / 2000
Status
AC × 3
AC × 61
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt, subtask_1_36.txt, subtask_1_37.txt, subtask_1_38.txt, subtask_1_39.txt, subtask_1_40.txt, subtask_1_41.txt, subtask_1_42.txt, subtask_1_43.txt, subtask_1_44.txt, subtask_1_45.txt, subtask_1_46.txt, subtask_1_47.txt, subtask_1_48.txt, subtask_1_49.txt, subtask_1_50.txt, subtask_1_51.txt, subtask_1_52.txt, subtask_1_53.txt, subtask_1_54.txt, subtask_1_55.txt
Case Name Status Exec Time Memory
sample_01.txt AC 3 ms 10496 KB
sample_02.txt AC 3 ms 10496 KB
sample_03.txt AC 3 ms 10496 KB
subtask_1_01.txt AC 111 ms 11772 KB
subtask_1_02.txt AC 119 ms 11896 KB
subtask_1_03.txt AC 58 ms 11264 KB
subtask_1_04.txt AC 115 ms 12148 KB
subtask_1_05.txt AC 74 ms 11224 KB
subtask_1_06.txt AC 173 ms 12276 KB
subtask_1_07.txt AC 123 ms 9080 KB
subtask_1_08.txt AC 181 ms 13556 KB
subtask_1_09.txt AC 179 ms 12276 KB
subtask_1_10.txt AC 101 ms 12024 KB
subtask_1_11.txt AC 64 ms 8828 KB
subtask_1_12.txt AC 90 ms 12024 KB
subtask_1_13.txt AC 129 ms 11664 KB
subtask_1_14.txt AC 74 ms 11640 KB
subtask_1_15.txt AC 82 ms 8824 KB
subtask_1_16.txt AC 51 ms 11132 KB
subtask_1_17.txt AC 258 ms 12788 KB
subtask_1_18.txt AC 62 ms 11512 KB
subtask_1_19.txt AC 129 ms 9084 KB
subtask_1_20.txt AC 189 ms 13428 KB
subtask_1_21.txt AC 247 ms 12656 KB
subtask_1_22.txt AC 237 ms 12788 KB
subtask_1_23.txt AC 248 ms 12656 KB
subtask_1_24.txt AC 237 ms 12788 KB
subtask_1_25.txt AC 268 ms 12788 KB
subtask_1_26.txt AC 241 ms 12916 KB
subtask_1_27.txt AC 179 ms 9208 KB
subtask_1_28.txt AC 244 ms 13556 KB
subtask_1_29.txt AC 268 ms 12788 KB
subtask_1_30.txt AC 240 ms 12916 KB
subtask_1_31.txt AC 179 ms 9208 KB
subtask_1_32.txt AC 243 ms 13556 KB
subtask_1_33.txt AC 268 ms 12788 KB
subtask_1_34.txt AC 240 ms 12916 KB
subtask_1_35.txt AC 178 ms 9208 KB
subtask_1_36.txt AC 244 ms 13556 KB
subtask_1_37.txt AC 268 ms 12788 KB
subtask_1_38.txt AC 240 ms 12916 KB
subtask_1_39.txt AC 178 ms 9208 KB
subtask_1_40.txt AC 252 ms 13556 KB
subtask_1_41.txt AC 184 ms 11760 KB
subtask_1_42.txt AC 148 ms 11768 KB
subtask_1_43.txt AC 199 ms 12020 KB
subtask_1_44.txt AC 155 ms 11572 KB
subtask_1_45.txt AC 141 ms 9208 KB
subtask_1_46.txt AC 146 ms 11632 KB
subtask_1_47.txt AC 121 ms 11640 KB
subtask_1_48.txt AC 150 ms 11764 KB
subtask_1_49.txt AC 125 ms 11768 KB
subtask_1_50.txt AC 119 ms 9208 KB
subtask_1_51.txt AC 3 ms 10496 KB
subtask_1_52.txt AC 3 ms 10496 KB
subtask_1_53.txt AC 5 ms 10496 KB
subtask_1_54.txt AC 3 ms 10496 KB
subtask_1_55.txt AC 3 ms 10496 KB