题意

CF611F New Year and Cleaning

想法

这个题是\(NOIP2020\)的弱化版。。

我们把所有在二维上的点都一起考虑,那么所有点对于一个步骤的移动是相当于这些所有点所组成的矩形在移动。

黑色的是我们的规定区域,蓝色的是我们所有二维的点的矩阵,可以看出对于每一步所出界的贡献我们是可以用这个超出的矩形面积来算的。

我们在移的过程中,维护现在这个矩形的左上和右下的端点就可以解决,超界就拉回来。

但是我们发现有些点是会走很多很多很多轮的,复杂度代价太高。

这里建议读者手玩几组样例,我们会发现,除了第一次的计算外,第二第三轮,在每一步所出界的边是一样的。

所以我们单独处理第一轮,第二轮,记录第二轮出界的边以及在第几轮出界,然后在第\((n > 2)\)轮我们要维护的就是这个矩形的长宽了。

可能代码会更加清晰一些。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long ll n,h,w;
ll x1,x2,y1,y2;
ll mod = 1e9 + 7;
char s[1000005]; void get(ll &x,ll &y,int k){
if(s[k] == 'U')y -- ;
if(s[k] == 'R')x ++ ;
if(s[k] == 'D')y ++ ;
if(s[k] == 'L')x -- ;
} ll ans = 0; ll c[1000005],e[1000005]; int main(){
scanf("%lld%lld%lld",&n,&h,&w);
scanf("%s",s + 1);
ll k = strlen(s + 1);
x1 = 1,x2 = w,y1 = 1,y2 = h;
for(int i = 1;i <= k;++i){
get(x1,y1,i);
get(x2,y2,i);
if(x1 == 0&&x1 <= x2&&y1 <= y2)x1 = 1,ans = (ans + i * (y2 - y1 + 1) % mod) % mod;
if(x2 == w + 1&&x1 <= x2&&y1 <= y2)x2 = w,ans = (ans + i * (y2 - y1 + 1) % mod) % mod;
if(y1 == 0&&x1 <= x2&&y1 <= y2)y1 = 1,ans = (ans + i * (x2 - x1 + 1) % mod) % mod;
if(y2 == h + 1&&x1 <= x2&&y1 <= y2)y2 = h,ans = (ans + i * (x2 - x1 + 1) % mod) % mod;
}
ll num = 0;
for(int i = 1;i <= k;++i){
get(x1,y1,i);
get(x2,y2,i);
if(x1 == 0&&x1 <= x2&&y1 <= y2)x1 = 1,ans = (ans + (i + n) * (y2 - y1 + 1) % mod) % mod,c[++num] = i,e[num] = 0;
if(x2 == w + 1&&x1 <= x2&&y1 <= y2)x2 = w,ans = (ans + (i + n) * (y2 - y1 + 1) % mod) % mod,c[++num] = i,e[num] = 0;
if(y1 == 0&&x1 <= x2&&y1 <= y2)y1 = 1,ans = (ans + (i + n) * (x2 - x1 + 1) % mod) % mod,c[++num] = i,e[num] = 1;
if(y2 == h + 1&&x1 <= x2&&y1 <= y2)y2 = h,ans = (ans + (i + n) * (x2 - x1 + 1) % mod) % mod,c[++num] = i,e[num] = 1;
}
if(!num && x1 <= x2 && y1 <= y2){puts("-1");return 0;}
for (ll nw=2,x=x2-x1+1,y=y2-y1+1;x>0&&y>0;nw++)
for (int i=1;i<=num;i++)
{
if (e[i] == 1&&x>0&&y>0) ans = (ans + std::max(x,0ll)*(nw * n % mod + c[i]) % mod) % mod,y--;
if (e[i] == 0&&x>0&&y>0) ans = (ans + std::max(y,0ll)*(nw * n % mod + c[i]) % mod) % mod,x--;
}
std::cout<<ans % mod;
}

CF611F New Year and Cleaning的更多相关文章

  1. 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚

    题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...

  2. Coursera-Getting and Cleaning Data-week1-课程笔记

    博客总目录,记录学习R与数据分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html -- Sunday, January 11, 2015 课程概述 G ...

  3. Coursera-Getting and Cleaning Data-Week2-课程笔记

    Coursera-Getting and Cleaning Data-Week2 Saturday, January 17, 2015 课程概述 week2主要是介绍从各个来源读取数据.包括MySql ...

  4. Coursera-Getting and Cleaning Data-Week3-dplyr+tidyr+lubridate的组合拳

    Coursera-Getting and Cleaning Data-Week3 Wednesday, February 04, 2015 好久不写笔记了,年底略忙.. Getting and Cle ...

  5. Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...

  6. 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划

    [BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...

  7. poj 2376 Cleaning Shifts

    http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. POJ 2376 Cleaning Shifts(轮班打扫)

    POJ 2376 Cleaning Shifts(轮班打扫) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] Farmer ...

  9. POJ 2376 Cleaning Shifts 贪心

    Cleaning Shifts 题目连接: http://poj.org/problem?id=2376 Description Farmer John is assigning some of hi ...

随机推荐

  1. epoll实现快速ping

    概述 在VOIP的运营过程中,最常见的一类问题就是语音质量问题,网络间的丢包.延迟.抖动都会造成语音质量的体验下降. 当现网出现语音质量问题的时候,我们有没有工具能够快速的界定问题的边界,缩小排查的范 ...

  2. NX CAM 区域轮廓铣的切削步长

    从NX3.0到NX9.0,默认都是5%.可是实际计算的精确度是不一样的.到NX8.0上发现计算速度特别慢,后来东找西找,设置这个参数可以解决.PS:请慎用!请后后面的官方解释. 官方的解释是: &qu ...

  3. Scrum Meeting 0509

    零.说明 日期:2021-5-9 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 测试 测试 cyy ...

  4. zuul过滤器filter 的编写

    通过上一节(zuul的各种配置)的学习,我们学会了zuul路由的各种配置,这一节我们来实现一下zuul的过滤器功能.那么为什么需要用到zuul的过滤器呢?我们知道zuul是我们实现外部系统统一访问的入 ...

  5. 在Vue前端项目中,附件展示的自定义组件开发

    在Vue前端界面中,自定义组件很重要,也很方便,我们一般是把一些通用的界面模块进行拆分,创建自己的自定义组件,这样操作可以大大降低页面的代码量,以及提高功能模块的开发效率,本篇随笔继续介绍在Vue&a ...

  6. 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列

    题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...

  7. linux hostid与lmhostid

    https://wangchujiang.com/linux-command/c/hostid.html hostid(host identifier) 显示当前主机的十六进制数字标识. 概要 hos ...

  8. LCA-离线tarjan模板

    /* *算法引入: *树上两点的最近公共祖先; *对于有根树的两个结点u,v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u,v的祖先且x的深度尽可能大; *对于x来说,从u到v的路径一定 ...

  9. linux 内核源代码情景分析——i386 的页式内存管理机制

    可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...

  10. 组件通信之全局事件总线 & 消息订阅发布

    全局事件总线 介绍 一种组件间通信的方式,适用于任意组件间通信. 在使用全局事件总线之前需要一些知识准备 所有组件实例的原型对象的原型对象就是 Vue 的原型对象,即VueComponent.prot ...