线段树优化dp 36pts 求调
查看原帖
线段树优化dp 36pts 求调
917372
hanxinyao楼主2025/2/8 16:25
#include <bits/stdc++.h>

using namespace std;

int n,t;
struct cow
{
	int s,e;
	friend bool operator<(cow a,cow b)
	{
		return a.e < b.e;
	}
}a[25010];
int tree[4000010];

void pushup(int u)
{
	tree[u] = min(tree[u * 2],tree[u * 2 + 1]);
}
void build(int u,int l,int r)
{
	if (l == r)
	{
		tree[u] = 0x3f3f3f3f;
		return;
	}
	int mid = (l + r) / 2;
	build(u * 2,l,mid);
	build(u * 2 + 1,mid + 1,r);
	pushup(u);
}
bool InRange(int L,int R,int l,int r)
{
	return (L >= l) && (R <= r);
}
bool OutOfRange(int L,int R,int l,int r)
{
	return (L > r) || (R < l);
}
int query(int u,int nl,int nr,int l,int r)
{
	if (InRange(nl,nr,l,r))
	{
		return tree[u];
	}
	else if (!OutOfRange(nl,nr,l,r))
	{
		int nmid = (nl + nr) / 2;
		return min(query(u * 2,nl,nmid,l,r),query(u * 2 +1,nmid + 1,nr,l,r));
	}
	else return 0x3f3f3f3f;
}
void update(int u,int nl,int nr,int p,int x)
{
	if (nl == nr)
	{
		tree[u] = x;
		return;
	}	
	else
	{
		int nmid = (nl + nr) / 2;
		if (nmid >= p)
		{
			update(u * 2,nl,nmid,p,x);
		}
		else
		{
			update(u * 2 + 1,nmid + 1,nr,p,x);
		}
		pushup(u);	
	}
	
}	

signed main()
{
	
		
cin >> n >> t;
	for (int i = 1;i <= n;i++)
	{
		cin >> a[i].s >> a[i].e;
		if (a[i].s == 1) update(1,1,t,a[i].e,1);
	}
	
	sort(a + 1,a + n + 1);
	build(1,1,t);
//	for (int i = 1;i <= 10;i++)
//	{
//		int tmp;
//		cin >> tmp;
//		//printf("in %d\n",tmp);
//		update(1,1,t,i,tmp);
//	}
//	for (int i = 1;i <= 20;i++)
//	{
//		int op,a1,a2;
//		cin >> op >> a1 >> a2;
//		if (op == 1)
//		{
//			update(1,1,t,a1,a2);
//		}
//		else
//		{
//			cout <<	query(1,1,t,a1,a2) << endl;
//		}
//	}
	for (int i = 1;i <= n;i++)
	{
		int s = a[i].s,e = a[i].e,num = min(query(1,1,t,e,e),query(1,1,t,s -1,e - 1) + 1);
		update(1,1,t,e,num);
	}
	if (query(1,1,t,t,t) == 0x3f3f3f3f) cout << -1;
	else cout << query(1,1,t,t,t);

	return 0;
 } 
2025/2/8 16:25
加载中...