先讲讲曲折的思路吧......

首先,应该是CRT之类的东西,乱搞

不行......打了打草稿,发现有解的情况是gcd(a1,a2.....an)|B,于是可以求gcd然后O(n)查询?但是B的范围直接劝退...

(这是cyr大佬讲的“烂大街”的套路(来自ctsc哦))于是我翻开了课件和百度

课件:最短路乱搞 百度:同余最短路???

说白了还是数论喽???

题解:

在课件和草稿纸的帮助下,我成功地推出了一个结论:

对于最后一个a,也就是an,设anxn=q,假设前面的数加起来是S,则S+q=B;

对于不同的Xn,q总是一个等差数列。

所以:(B-S)%an=0;

∴B %an=S%an.(B>S)

所以发现:如果式子可以达到S+q,那么式子一定也能达到S+(i*q)。

所以我们的任务就是求对于每一个a的最小S。

怎么求呢?

首先找出ai中的最小值mn

因为要求剩余系嘛,剩余我们可以连边,在i与(a[i]+i)%mn之间连一条权值为a[i]的单向边,表示在mod mn=i到mod mn=(i+ai)%mn之间,可以通过a[j]的代价达到,于是这样就处理出了每一个点的最小剩余系

于是,对于每一个S,答案就是Σ(dis[i]<a[j])(a[i]-dis[i])/mn+1

于是,这题的代码就没有什么含金量了(虽然我调了整整一上午+1h,而且整整屠了一个半的版)

坑点1:会爆long long

坑点2:无脑开long long会MLE

坑点3、long long 和int不能乱用

代码1(跑得快的)(因为没有邻接表,直接从前面一个点得出下面一个点)

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e6+;
const int maxm=5e5+;
const ll inf=1e12+;
int n;
int tot;
ll l,r;
int mn=maxm+;
int a[maxm];
int cnt,head[maxm];
inline ll read()
{
ll f=,x=;char s=getchar();
while(s>''||s<''){if(s=='-')f=-;s=getchar();}
while(s<=''&&s>=''){x=x*+s-'';s=getchar();}
return x*f;
}
struct edge
{
int to,next,dis;
}e[maxn];
inline void addedge(int from,int to,int dis)
{
e[++cnt].next=head[from];
e[cnt].to=to;
e[cnt].dis=dis;
head[from]=cnt;
}
ll dis[maxn];
int vis[maxn];
struct cmp
{
bool operator() (int a,int b)
{
return dis[a]>dis[b];
}
};
//queue < int > q;
priority_queue < int , vector < int > , cmp > q;
void spfa(int s)
{
memset(dis,0x3f,sizeof(dis));
q.push(s);
dis[s]=;
vis[s]=;
while(!q.empty())
{
int u=q.top();
q.pop();
vis[u]=;
for(int i=;i<=n;i++)
{
int v=(u+a[i])%mn;
if(dis[v]>dis[u]+a[i])
{
dis[v]=dis[u]+a[i];
if(vis[v]==)
{
vis[v]=;
q.push(v);
}
}
}
}
}
ll query(ll x)
{
ll res=;
for(int i=;i<=mn;i++)
{
if(dis[i]<=x)
{
res+=(x-dis[i])/mn+;
}
}
return res;
}
int main()
{
n=read();l=read();r=read();//
for(int i=;i<=n;i++)
{
ll x;
x=read();
if(x==)
continue;
a[++tot]=x;
mn=min(mn,a[i]); }
/*for(ll i=0;i<=mn;i++)
{
for(int j=1;j<=tot;j++)
{
if(a[j]!=mn)
addedge(i,(i+a[j])%mn,a[j]);
}
}*/
spfa();
printf("%lld",query(r)-query(l-));
return ;
}

代码2:(跑得慢的)

把上面魔改一下就行了233....

慢着!你以为到这就结束了?

↘         ↓          ↙

→    传送门     ←

↗         ↑          ↖

(完)

【洛谷】P2371 [国家集训队]墨墨的等式(屠版题)的更多相关文章

  1. 洛谷P2371 [国家集训队]墨墨的等式

    P2371 [国家集训队]墨墨的等式 题目描述 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=Ba_1x_1+a_2y_2+-+a_nx_n=Ba1​x1​+a2​y2​+-+a ...

  2. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  3. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  4. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  5. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  6. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  7. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...

  8. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  9. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  10. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

随机推荐

  1. mac下安装jmeter

    jmeter官网下载 双击解压 命令行进入/Users/yanguobin/apache-jmeter-5.1.1/bin目录下,输入sh jmeter即可启动 也可以 配置环境变量 vim ~/.b ...

  2. ReentrantLock源码学习总结 (一)

    [^ ]: 以下源码分析基于JDK1.8 ReentrantLock 示例 private ReentrantLock lock = new ReentrantLock(true); public v ...

  3. B-线性代数-矩阵转置

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...

  4. 微信小程序前端样式WXSS书写

    微信小程序前端样式WXSS书写 一. WXSS的简单介绍 WXSS(WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式. 与 CSS 相比,WXSS 扩展的特性有: ...

  5. Python3程序设计指南:02 数据类型

    目录 1.标识符与关键字 1.1 规则 1.2 约定 2.Integral类型 2.1 整数 2.1.1 数值型操作符与函数 2.1.2 使用数据类型创建对象 2.1.3 整数位逻辑操作符 2.2 布 ...

  6. Java ThreadLocal 的使用与源码解析

    GitHub Page: http://blog.cloudli.top/posts/Java-ThreadLocal-的使用与源码解析/ ThreadLocal 主要解决的是每个线程绑定自己的值,可 ...

  7. Github 上热门的 Spring Boot 项目实战推荐

    最近经常被读者问到有没有 Spring Boot 实战项目可以学习,于是,我就去 Github 上找了 10 个我觉得还不错的实战项目.对于这些实战项目,有部分是比较适合 Spring Boot 刚入 ...

  8. c使用二叉链表创建二叉树遇到的一些疑问和思考

    二叉链表存储二叉树 学习的时候参考的是<大话数据结构>,书中是这样定义的 typedef char TElemType; typedef struct BiTNode { TElemTyp ...

  9. Linux面试题-8

    1.Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于磁盘这种外部设备文件,一般应将其放在(C)目录中. A./bin B./etc C./dev D./lib 2.当使用mount进 ...

  10. MongoDB-系统时钟跳变引发的风波

    目录 背景 一. 对 oplog 的影响 oplog 原理 二.主备倒换 小结 声明:本文同步发表于 MongoDB 中文社区,传送门: http://www.mongoing.com/archive ...