洛谷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;
}
标签:int,Painting,pos,add,P2205,delta,maxn,include,USACO13JAN 来源: https://www.cnblogs.com/landmine-sweeper/p/16309190.html