我第二题竟然打了线段树上二分......

刚开始因为懒还打了两个log的...
然后还被卡了...
改成一个log的还改错了...
我真傻...真的...我说B题怎么会这么恶心...
自闭了...
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0,f=1;char chr=getchar();
	while(!isdigit(chr)){if(chr=='-')f=-1;chr=getchar();}
	while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
	return ans*f;
}const int M = 1e6+5;
int s[M<<2],n,a[M],t[M<<2],ans[M];
#define ls (i<<1)
#define rs (i<<1|1)
#define mid (l+r>>1)
inline void Push_Up(int i){s[i]=s[ls]+s[rs];}
void Update(int i,int l,int r,int x,int sum){
	if(l==r){++s[i],t[i]=sum;return;}
	if(x<=mid) Update(ls,l,mid,x,sum);
	else Update(rs,mid+1,r,x,sum);
	Push_Up(i);
}
int query(int i,int l,int r,int x){
	if(l==r) return t[i];
	Push_Up(i);
	if(x<=mid) return query(ls,l,mid,x);
	return query(rs,mid+1,r,x);
}
int Query_Try(int i,int l,int r,int ql,int qr){
	if(l==r){if(!s[i]) return l;return n+1;}
	if(ql<=l&&r<=qr){
		if((mid-l+1)-s[ls]!=0)return Query_Try(ls,l,mid,ql,qr);
		return Query_Try(rs,mid+1,r,ql,qr);
	}int ans=0;
	if(ql<=mid&&mid-l+1-s[ls]!=0)ans=Query_Try(ls,l,mid,ql,qr);
	if(ans<ql||ans>qr)return Query_Try(rs,mid+1,r,ql,qr);
	return ans;
}
int main(){
	n=read();
	for(register int i=1;i<=n;++i){
		int x=read();
		register int l=x%n+1,r=n,pos=n+1;
		pos=Query_Try(1,1,n,l,r);
		if(pos==n+1)pos=Query_Try(1,1,n,1,l-1);
		Update(1,1,n,pos,x);
	}for(int i=1;i<=n;i++)printf("%d ",query(1,1,n,i));
	return 0;
}



全部评论
我打了树状数组上二分
点赞 回复 分享
发布于 2019-08-23 22:11
我刚开始也是线段树二分🙁
点赞 回复 分享
发布于 2019-08-24 13:00
相同经历.jpg wa了之后还改了发树状数组。。。
点赞 回复 分享
发布于 2019-08-24 14:48
我都不知道线段树是啥,不过第二题用并查集过了😀😀要不然我就只过A题了,感觉算法方面的知识还是不够。。
点赞 回复 分享
发布于 2019-08-25 14:12

相关推荐

01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务