洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence
Posted 小时のblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence相关的知识,希望对你有一定的参考价值。
题目大意:
开始站在原点,给出一系列操作
x L/R,表示向左或向右走几步。
最多会移动到离原点1,000,000,000单位远的地方。
n次操作,n<=100000
问走过k次的地方有几个
题解:离散化+差分
看了官方题解,很明白。
发现n<=100000,看出所到达的不同的点最多只有100001个
这个是可以用数组存的,用到了坐标压缩的思想,很重要。
pos[i]表示第i次走的点的位置。
C[]是差分数组。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define N 100010 using namespace std; int n,k,now,cnt,ans,nw; int pos[N*2]; map<int,int>C; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ int x;char s[2]; scanf("%d%s",&x,s); if(s[0]==‘L‘){ pos[++cnt]=now; pos[++cnt]=now-x; C[now-x]++; C[now]--; now-=x; }else{ pos[++cnt]=now; pos[++cnt]=now+x; C[now]++; C[now+x]--; now+=x; } } sort(pos+1,pos+cnt+1); nw=C[pos[1]]; for(int i=2;i<=cnt;i++){ if(pos[i]!=pos[i-1]){ if(nw>=k)ans+=pos[i]-pos[i-1]; nw+=C[pos[i]]; } } cout<<ans<<endl; return 0; }
以上是关于洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P2205 [USACO13JAN]画栅栏Painting the Fence
[luogu P2205] [USACO13JAN]画栅栏Painting the Fence
洛谷P3070 [USACO13JAN]岛游记Island Travels
洛谷P2202 [USACO13JAN]方块重叠Square Overlap