关于P6007
  • 板块学术版
  • 楼主lxzy_
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/4/8 00:07
  • 上次更新2023/11/5 00:53:37
查看原帖
关于P6007
67493
lxzy_楼主2021/4/8 00:07

这道题目我的做法如下:

  1. (x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)放在一个数组内记录原下标,然后进行离散化

  2. 进行DP

我的代码:(只过了样例)

#include<cstdio>
#include<iomanip>
#include<algorithm>
#define lowbit(i) i&(-i)
#define p1 (p<<1)
using namespace std;
const int N=2e5+50;
struct point{
	int x,y,px,py,idx;
}a[N];
int f[N],c[N],pos[N];//pos[i]表示离散化后i号节点所对应的原下标 
int n,p;
inline int Max(int a,int b){return a>b?a:b;}
bool cmp1(point p,point q){return p.x<q.x;}
bool cmp2(point p,point q){return p.y<q.y;}

inline void Insert(int x,int y){for(;x<=n;x+=lowbit(x)) c[x]=Max(c[x],y);}
inline int Query(int x)
{
	int ans=0;
	for(;x>0;x-=lowbit(x)) ans=Max(ans,c[x]);
	return ans;
}

void Work()//离散化,将y和x分开 
{
	sort(a+1,a+1+p1,cmp2);
	a[0].py=1;
	for(int i=1;i<=p1;i++){
		if(a[i].y==a[i-1].y) a[i].py=a[i-1].py;
		else a[i].py=a[i-1].py+1;
	}
	sort(a+1,a+1+p1,cmp1);
	a[0].px=1;
	for(int i=1;i<=p1;i++){
		if(a[i].x==a[i-1].x) a[i].px=a[i-1].px;
		else a[i].px=a[i-1].px+1;
		pos[a[i].idx]=i;
	}	
}
int main()
{
	scanf("%d%d",&n,&p);
	for(int i=1;i<=p;i++){
		scanf("%d%d",&a[i].x,&a[i].y);
		scanf("%d%d",&a[i+p].x,&a[i+p].y);
		a[i].idx=i,a[i+p].idx=i+p;//将i号跳板的终点存在i+p处 
	}
	Work();

	for(int i=1;i<=p1;i++){
		if(a[i].idx>p) continue;
		f[i]=Query(a[i].py)-a[i].px-a[i].py+a[pos[a[i].idx+p]].px+a[pos[a[i].idx+p]].py;
		Insert(a[i].py,f[i]);
	}
	int maxn=0;
	for(int i=1;i<=p1;i++) maxn=Max(maxn,f[i]);
	printf("%d\n",(n<<1)-maxn);
	return 0;
}

求助各位大佬

2021/4/8 00:07
加载中...