洛谷P2205 [USACO13JAN]Painting the Fence S

题目

https://www.luogu.com.cn/problem/P2205

思路

刷水题真解压

差分就完事了

值得注意的一些东西:像这种和数轴或者坐标相关的题,还有扫描线题,一定要注意区间的开闭!!!

我个人的习惯是把坐标为\(x\)的点当成\([x,x+1)\)这段小区间来做,对于本题,因为求的是栅栏,用区间处理会更方便。

代码

点击查看代码
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define maxn 200010
using namespace std;
int a[maxn],b[maxn],cnt=0,idx=0;
struct add{
	int pos,val;
	add(){}
	add(int x,int y){pos=x,val=y;}
	bool operator <(add t){
		return pos<t.pos;
	}
} delta[maxn];
int main(){
	int i,j,n,m,k,x,p=0,ans=0;
	char dir[3];
	scanf("%d%d",&n,&k);
	for(i=1;i<=n;++i){
		scanf("%d%s",&x,dir);
		if(dir[0]=='L'){
			delta[++cnt]=add(p,-1);
			p-=x;
			delta[++cnt]=add(p,1);
		}
		else{
			delta[++cnt]=add(p,1);
			p+=x;
			delta[++cnt]=add(p,-1);
		}
	}
	sort(delta+1,delta+cnt+1);
	for(i=1;i<=cnt;++i){
		if(i==1||delta[i].pos>delta[i-1].pos) b[++idx]=delta[i].pos;
		a[idx]+=delta[i].val;
	}
	for(i=1;i<=idx;++i){
		a[i]+=a[i-1];
		if(a[i]>=k) ans+=b[i+1]-b[i];
	}
	printf("%d\n",ans);
	// system("pause");
	return 0;
}
posted @ 2022-05-25 14:29  文艺平衡树  阅读(21)  评论(0编辑  收藏  举报