2019.9.9模拟赛 T1队长快跑

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/C20180602_csq/article/details/100677976

极其心酸的一道题。。

考场上脑残了。。。

想到了一个奇怪的单调队列+主席树的做法,然后还现推了2h的主席树,然后就爆炸了。。。

思路就是倒着做,用单调队列找每一个点第一个a小于它的点,然后用主席树把这段区间中的b<a的数的个数统计出来

加到答案里面

看起来很对

但是出现了一个致命错误:每个数对应的第一个最小值点不一定要被选中

于是就WAAAAAAAAAAAAAAAAAAA了

QwQ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

而且还有两个点RE,说明主席树也有问题

心都凉了。。。。。。。。

其实RE是因为后面在写代码的时候不小心把主席树的struct删掉了,重新打的时候就忘记乘19了

彻底凉了。。。。。。。

凉凉代码:QwQ

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gi()
{
	char c;int num=0,flg=1;
	while((c=getchar())<'0'||c>'9')if(c=='-')flg=-1;
	while(c>='0'&&c<='9'){num=num*10+c-48;c=getchar();}
	return num*flg;
}
#define N 100005
int stk[N],top;
struct tnode{
	int a,b,f,i;
}t[N];
struct node{
	int l,r,cnt;
}a[N*19];
int cnt,T[N];
int insert(int rt,int l,int r,int x)
{
	int nrt=(++cnt);
	a[nrt].l=a[rt].l;a[nrt].r=a[rt].r;
	a[nrt].cnt=a[rt].cnt+1;
	if(l==r) return nrt;
	int mid=(l+r)>>1;
	if(x<=mid) a[nrt].l=insert(a[rt].l,l,mid,x);
	else a[nrt].r=insert(a[rt].r,mid+1,r,x);
	return nrt;
}
int query(int lrt,int rrt,int l,int r,int ql,int qr)
{
	if(l>qr||r<ql) return 0;
	if(ql<=l&&r<=qr)
		return a[rrt].cnt-a[lrt].cnt;
	int mid=(l+r)>>1;
	return query(a[lrt].l,a[rrt].l,l,mid,ql,qr)
		  +query(a[lrt].r,a[rrt].r,mid+1,r,ql,qr);
}
int hh[2*N],ct;
int main()
{
	freopen("leader.in","r",stdin);
	freopen("leader.out","w",stdout);
	int n,i,nf,ans=0,MX;
	n=gi();
	for(i=1;i<=n;i++){
		t[i].a=gi();hh[++ct]=t[i].a;
		t[i].b=gi();hh[++ct]=t[i].b;
		t[i].i=i;
	}
	sort(hh+1,hh+ct+1);
	int len=unique(hh+1,hh+ct+1)-hh-1;
	for(i=1;i<=n;i++){
		t[i].a=lower_bound(hh+1,hh+len+1,t[i].a)-hh;
		t[i].b=lower_bound(hh+1,hh+len+1,t[i].b)-hh;
	}
	
	for(i=1;i<=n;i++){
		printf("%d %d\n",t[i].a,t[i].b);
	}
	
	top=0;stk[++top]=n+1;t[n+1].f=0;
	MX=t[n+1].b=len+1;
	T[1]=insert(T[0],1,MX,t[n+1].b);
	for(i=n;i>=1;i--){
		while(top>0&&t[stk[top]].a>=t[i].a)
			top--;
		//nf=count(b[i+1~stk[top].i]<a[i]);
		nf=query(T[n-stk[top]+1],T[n-i+1],1,MX,1,t[i].a);
		t[i].f=nf+t[stk[top]].f;
		ans=max(ans,t[i].f);
		stk[++top]=i;
		T[n-i+2]=insert(T[n-i+1],1,MX,t[i].b);
	}
	printf("%d",ans+1);
}

想错了才是最惨的。。。。。。。。。。2个小时就没了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

(正解占坑代填)

猜你喜欢

转载自blog.csdn.net/C20180602_csq/article/details/100677976