2026/2/24 19:31:24
网站建设
项目流程
怎样制作网站,wix怎么做网站,邢台做移动网站报价,最专业的网站建设团队P2070 [USACO13JAN] 刷墙 Painting the Fence B
题目描述
Farmer John 已经设计了一种方法来装饰谷仓旁边的长栅栏#xff08;把栅栏认为是一根一维的线#xff09;。他把一只画刷绑在他最喜爱的奶牛 Bessie 身上#xff0c;之后就去喝一杯冰水#xff0c;而 Bessie 隔着栅…P2070 [USACO13JAN] 刷墙 Painting the Fence B题目描述Farmer John 已经设计了一种方法来装饰谷仓旁边的长栅栏把栅栏认为是一根一维的线。他把一只画刷绑在他最喜爱的奶牛 Bessie 身上之后就去喝一杯冰水而 Bessie 隔着栅栏来回走当她走过某个地方这里的一段栅栏就被刷上了涂料。Bessie 从栅栏上的位置000开始并且遵循着一个NNN次移动的次序1≤N≤1051\le N\le10^51≤N≤105。例如10 L表示 Bessie 向左移动了101010个单位长度15 R表示 Bessie 向右移动了151515个单位长度。现给出 Bessie 所有移动的列表Farmer John 想要知道哪些区域的栅栏至少涂了两层涂料只涂一层涂料的区域可能在大雨中被洗掉。Bessie 在她的行走中最远到达距起始点10910^9109个单位长度。输入格式第111行一个整型数NNN。第2∼N12 \sim N12∼N1行每行描述了 Bessie 的NNN次移动中的一次例如15 L。输出格式111行被至少涂了两层涂料的区域总数。输入输出样例 #1输入 #16 2 R 6 L 1 R 8 L 1 R 2 R输出 #16说明/提示【样例解释】Bessie 从位置000开始向右移动222个单位长度向左移动666个单位长度向右移动111个单位长度向左移动888个单位长度最后向右移动333个单位长度。666个单位区域至少被涂了两层涂料是[−11,−8],[−4,−3],[0,2][-11,-8],[-4,-3],[0,2][−11,−8],[−4,−3],[0,2]这些区域。C实现#includebits/stdc.husingnamespacestd;templatetypenameTinlinevoidread(TFF){T RR1;FF0;charCHgetchar();for(;!isdigit(CH);CHgetchar())if(CH-)RR-1;for(;isdigit(CH);CHgetchar())FF(FF1)(FF3)(CH^48);FF*RR;}//快读templatetypenameTvoidwrite(T x){if(x0)putchar(-),x*-1;if(x9)write(x/10);putchar(x%1048);}//快写constintMAXN1e510;structnode{intl,r;//每次染色的左端点和右端点booloperator(constnodeb)const{returnlb.l;//按左端点从小到大排序}}a[MAXN];intposition,ans,lft,rgt,n;intmain(){read(n);for(inti1;in;i){intx;chary;read(x);ciny;a[i].lposition;if(yL)position-x;//Bessie往左走elsepositionx;//Bessie往右走a[i].rposition;if(a[i].la[i].r)swap(a[i].l,a[i].r);}sort(a1,an1);//排序lfta[1].l;rgta[1].r;//给lft和rgt赋上初值for(inti2;in;i)if(a[i].rlft){//如果跟可能被覆盖到的区间有交a[i].lmax(a[i].l,lft);//这里是使得之后的代码可以少写一点因为显然a[i].llfta[i].l~lft这1段也没有用了if(a[i].rrgt){//比之前的右端点大ansrgt-a[i].l;//从rgt到a[i].llftrgt;//之前的右端点显然就是左端点显然新的可能被覆盖到的区间就是之前的rgt~a[i].rrgta[i].r;//更新右端点}else{//比之前的右端点小ansa[i].r-a[i].l;//从a[i].r到a[i].llfta[i].r;//更新左端点}}write(ans);//输出return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容