萌新 T了三个点
查看原帖
萌新 T了三个点
141335
qwq2519楼主2020/9/16 21:20
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
#define drp(i,j,k) for(register int i(j);i!=(k-1);--i)
using namespace std;
const int N=2e5+7;
struct inter {
	int l,r,op;
	inline bool operator < (const inter &x)const {
		return l<x.l;
	}
} t[N*2];

inline void read(int &x) {
	x=0;
	register char ch=getchar();
	int w=0;
	while(ch>'9'||ch<'0') {
		w|=ch=='-';
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<1)+(x<<3)+(ch&15);
		ch=getchar();
	}
	w?x=~(x-1):x;
}

int n,m;
int to[N*2][25],ans[N];

inline void init()
{
	int next;
	rep(i,1,2*n)
	{
		next=i;
		while(next<=2*n&&t[next].l<=t[i].r) next++;
		to[i][0]=next-1;
	}
	rep(i,1,20)
	 rep(j,1,2*n)
	 {
	 	to[j][i]=to[to[j][i-1]][i-1];
	 }
}

inline void dfs(int num)
{
	int tot=1,last=num;
	drp(i,19,0)
	{
		if(to[last][i]!=0&&t[to[last][i]].r<t[num].l+m){
			tot+=(1<<i);
			last=to[last][i];
		}
	}
	ans[t[num].op]=tot+1;
}
void search(int k)
{
	int tot = 1, p = k;
	for(int i = 19; i >= 0; i--) {
		if(to[k][i] != 0 && t[to[k][i]].r < t[k].l + m) {
			tot += (1 << i);
			k = to[k][i];
		}
	}
	ans[t[p].op] = tot+ 1;
}

int main() {
	//freopen("e.in","r",stdin);
	//freopen("e.out","w",stdout);
	read(n);
	read(m);
	rep(i,1,n) {
     read(t[i].l);read(t[i].r);
     if(t[i].l>t[i].r) t[i].r+=m;
     t[i].op=i;
	}
   rep(i,1,n)
   {
    t[i+n].op=t[i].op;
    t[i+n].l=t[i].l+m;
    t[i+n].r=t[i].r+m;
	} 
   sort(t+1,t+2*n+1);
   init();
   rep(i,1,n) dfs(i);
   rep(i,1,n-1)
   printf("%d ",ans[i]);
   cout<<ans[n];
	return 0;
}

why 超时三组 七十分

2020/9/16 21:20
加载中...