[luogu7116]微信步数
先判定无解,当且仅当存在一个位置使得移动$n$步后没有结束且仍在原地
暴力枚举移动的步数,记$S_{i}$为移动$i$步(后)未离开范围的点个数,则恰好移动$i$步的人数为$S_{i-1}-S_{i}$(特别的$S_{0}=P$),答案即为$\sum_{i=1}^{D}(S_{i-1}-S_{i})i=\sum_{i=0}^{D-1}S_{i}$(其中$D=\min_{S_{i}=0}i$)
考虑如何求出$S_{i}$,记$len_{j}$为第$j$维的合法范围,由于每一维互不干扰,则有$S_{i}=\prod_{j=1}^{m}len_{j}$
由于每$n$步必然重复向一个方向移动,那么$D\le n\max w_{i}$,总复杂度即$o(nm\max w_{i})$
进一步优化,将$S_{i}$按$i\ mod\ n$的值分组,对于第$i$组($i\in [0,n)$),$i$单独计算,然后求出$i+n$时的$len_{j}$,记$n$步的总位移为$d_{i}$,则第$kn+i(k\ge 1)$步时$len'_{j}=\max(len_{j}-(k-1)|d_{j}|,0)$
写成式子,即$\sum_{k=1}^{D'}\prod_{j=1}^{m}(len_{j}+|d_{j}|-k|d_{j}|)$(其中$D'=\min_{j=1}^{m}\frac{len_{j}}{|d_{j}|}$,因为$\max$取0后一定为0,不需要再计算)
将后式$o(m^{2})$暴力展开,那么就是一个关于$k$的一个$m+1$次多项式,多项式的前缀和也可以$o(m^{2})$计算,总复杂度即为$o(nm^{2})$


- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 #define N 500005
- 4 #define M 20
- 5 #define mod 1000000007
- 6 int n,m,ans,w[M],x[N],y[N],d[M],mx[N<<1][M],mn[N<<1][M],g[M],sum[M][M];
- 7 int ksm(int n,int m){
- 8 if (!m)return 1;
- 9 int s=ksm(n,m>>1);
- 10 s=1LL*s*s%mod;
- 11 if (m&1)s=1LL*s*n%mod;
- 12 return s;
- 13 }
- 14 int mul(int x,int y){
- 15 for(int i=m+1;i;i--)g[i]=(1LL*g[i-1]*x+1LL*g[i]*y)%mod;
- 16 g[0]=1LL*g[0]*y%mod;
- 17 }
- 18 int calc(int k,int x){
- 19 int s=1,ans=0;
- 20 for(int i=0;i<=k+1;i++){
- 21 ans=(ans+1LL*s*sum[k][i])%mod;
- 22 s=1LL*s*x%mod;
- 23 }
- 24 return ans;
- 25 }
- 26 int main(){
- 27 scanf("%d%d",&n,&m);
- 28 sum[0][1]=1;
- 29 for(int i=1;i<=m;i++){//i+1次多项式,
- 30 int y=0;
- 31 for(int x=0;x<=i+1;x++){
- 32 y=(y+ksm(x,i))%mod;
- 33 memset(g,0,sizeof(g));
- 34 g[0]=y;
- 35 for(int j=0;j<=i+1;j++)
- 36 if (j!=x){
- 37 mul(1,mod-j);
- 38 mul(0,ksm((x-j+mod)%mod,mod-2));
- 39 }
- 40 for(int j=0;j<=i+1;j++)sum[i][j]=(sum[i][j]+g[j])%mod;
- 41 }
- 42 }
- 43 for(int i=1;i<=m;i++)scanf("%d",&w[i]);
- 44 for(int i=1;i<=n;i++){
- 45 scanf("%d%d",&x[i],&y[i]);
- 46 d[x[i]]+=y[i];
- 47 for(int j=1;j<=m;j++){
- 48 mx[i][j]=max(mx[i-1][j],d[j]);
- 49 mn[i][j]=min(mn[i-1][j],d[j]);
- 50 }
- 51 }
- 52 for(int i=n+1;i<=2*n;i++){
- 53 d[x[i-n]]+=y[i-n];
- 54 for(int j=1;j<=m;j++){
- 55 mx[i][j]=max(mx[i-1][j],d[j]);
- 56 mn[i][j]=min(mn[i-1][j],d[j]);
- 57 }
- 58 }
- 59 for(int i=1;i<=m;i++)d[i]/=2;
- 60 bool flag1=0,flag2=0;
- 61 for(int i=1;i<=m;i++)
- 62 if (d[i])flag1=1;
- 63 for(int i=1;i<=m;i++)
- 64 if (mx[n][i]-mn[n][i]>w[i])flag2=1;
- 65 //flag1说明离开了原位置,flag2说明一定是一轮
- 66 if ((!flag1)&&(!flag2)){
- 67 printf("-1");
- 68 return 0;
- 69 }
- 70 for(int i=0;i<n;i++){
- 71 int s=1;
- 72 for(int j=1;j<=m;j++)s=1LL*s*max(w[j]-(mx[i][j]-mn[i][j]),0)%mod;
- 73 ans=(ans+s)%mod;
- 74 }
- 75 for(int i=n;i<2*n;i++){
- 76 bool flag=0;
- 77 for(int j=1;j<=m;j++)
- 78 if (w[j]-(mx[i][j]-mn[i][j])<0)flag=1;
- 79 if (flag)break;
- 80 memset(g,0,sizeof(g));
- 81 g[0]=1;
- 82 for(int j=1;j<=m;j++)mul(mod-abs(d[j]),w[j]-(mx[i][j]-mn[i][j])+abs(d[j]));
- 83 int D=0x3f3f3f3f;
- 84 for(int j=1;j<=m;j++)
- 85 if (d[j])D=min(D,(w[j]-(mx[i][j]-mn[i][j]))/abs(d[j])+1);
- 86 for(int j=0;j<=m;j++)ans=(ans+1LL*g[j]*calc(j,D))%mod;
- 87 }
- 88 printf("%d",ans);
- 89 }
[luogu7116]微信步数的更多相关文章
- 【Redis面试题】如何使用Redis实现微信步数排行榜?
1. 前言 之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这5种数据结构各自的使用场景,不过一直也没来得及写. 碰巧,在3月份找工作面试时,有个面试官先问 ...
- 「NOIP 2020」微信步数(计数)
「NOIP 2020」微信步数(Luogu P7116) 题意: 有一个 \(k\) 维场地,第 \(i\) 维宽为 \(w_i\),即第 \(i\) 维的合法坐标为 \(1, 2, \cdots, ...
- [NOIP 2020] 微信步数
一.题目 点此看题 二.题目 首先感谢一下这位大佬的博客,虽然我看不懂您的讲解,但是还是读得懂代码的 思路是 \(\tt jys\) 给我讲明白的,首先我们可以感觉到快速计算它肯定和矩形有关系,也就是 ...
- 洛谷 P7116 - [NOIP2020] 微信步数(拉格朗日插值)
洛谷题面传送门 我竟然独立切掉了这道题!incredible! 纪念我逝去的一上午(NOIP 总时长 4.5h,这题做了我整整 4.5h) 首先讲一下现场我想的 80 分的做法,虽然最后挂成了 65 ...
- pyechart基本使用大全
charts_base 原文链接:https://blog.csdn.net/weixin_43735353/article/details/89328048 图表详细配置请参考 图表配置篇 基本图表 ...
- 小白学Python(17)——pyecharts 日历图 Calendar
Calendar-2017年微信步数情况 import datetime import random from pyecharts import options as opts from pyecha ...
- .Net Core2.*学习手册
1.net core 基础知识解析(创建一个.net core网站)(视频录制) 1.1 Startup解析(没写) 1.2 目录结构分析(没写) 1.3 使用静态文件(没写) 1.4 Control ...
- 最新Pyecharts-基本图表
Pyecharts是由Echarts而来,Echarts是百度开源的数据可视化的库,适合用来做图表设计开发,当使用Python与Echarts结合时就产生了Pyecharts.可使用pip安装,默认是 ...
- 【Python可视化】超详细Pyecharts 1.x教程,让你的图表动起来~
前言 pyecharts 是一个用于生成 Echarts 图表的Python库.Echarts是百度开源的一个数据可视化 JS 库,可以生成一些非常酷炫的图表. Pyecharts在1.x版本之后迎来 ...
随机推荐
- 算法——快速排序迭代式和递归式的Java实现
快速排序迭代式和递归式的Java实现 快速排序基于分治法的思想,在待排序表中任选一值作为中枢值 pivot,一趟快排将所有大于该值的元素置于一边,小于该值的元素置于另一边,这样一个元素在排序中的最终位 ...
- 解决Vite-React项目中js使用jsx语法报错的问题
背景 在做存量项目接入Vite测试时发现,存量(老)项目中很多是直接在js中书写jsx语法,使用Vite启动时就会抛出一堆问题Failed to parse source. 不嫌麻烦可以跑个脚本批量修 ...
- C++核心编程 1 程序的内存模型
1.内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理(写的所有代码都在代码区) 全局区:存放全局变量.静态变量以及常量 栈 区:由编 ...
- 一文学会Java事件机制
本文同时发布于个人网站 https://ifuyao.com/blog/java-event/ 相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控 ...
- Mysql读写分离集群的搭建且与MyCat进行整合
1. 概述 老话说的好:不熟悉的东西不要不懂装懂,做人要坦诚,知道就是知道,不知道就是不知道. 言归正传,今天我们来聊聊 Mysql主从读写分离集群是如何搭建的,并且聊一下如何用 MyCat 去访问这 ...
- js 手动实现 promise.all的功能
在中高级面试中,实现一个promise.all是一个频率较高的面试题 首先分析下 promise.all(),(参考MDN) 接收一个promise的iterable类型(注:Array,Map,Se ...
- 洛谷3320 SDOI2015寻宝游戏(set+dfs序)(反向迭代器的注意事项!)
被\(STL\)坑害了一个晚上,真的菜的没救了啊. 准确的说是一个叫\(reverse\ iterator\)的东西,就是我们经常用的\(rbegin()\) 有一个非常重要的性质 在反向迭代器中,+ ...
- CAD网页Web端显示开发为什么要以WebGIS的思路来开发?
背景 在之前的博文CAD图DWG解析WebGIS可视化技术分析总结中讲解了如何把CAD的DWG格式的图纸Web可视化的方案.博文发布后,受到不少同行们的关注,也有不少咨询一些专业问题,其中大家可能疑惑 ...
- Linux搭建SVN服务器详细教程
前言 本文讲解Linux系统下如何搭建SVN服务器,详细说明各配置项的功能,最终实现可管控多个项目的复杂配置. SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统 ...
- VS Code C/C++开发环境配置
VS Code C/C++开发环境配置 一.安装 1.前往官网下载安装即可 https://code.visualstudio.com/ 2.进入VS Code安装如下插件 二.C/C++开发 ...