- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近,我学习了Mo's algorithm用于查询的平方根分解,以加快解决某些问题的速度。
为了练习实现,我一直在努力解决D. Powerful array (Codeforces 上的一个过去的竞赛问题)使用这个想法。问题如下:
考虑一个任意子数组 .定义 是整数出现的次数 在这个子数组中。子数组的 幂 定义为 的总和对于所有整数 (请注意,只有正数的项不为零)。
回答查询。在每个查询中,给定两个整数 和 , 计算 的幂 .
它拥有:
使用莫氏算法,我在中编写了离线解决这个问题的代码。 .我确信这个问题可以使用这个算法和时间复杂度来解决,因为我已经检查了其他人接受的代码并且他们也使用了类似的算法。
然而,我的代码是gets a time limit exceeded verdict .
下面是我写的代码:
#include <ios>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <utility>
#include <map>
int sqt;
long long int ans = 0;
long long int arr[200005] = {};
long long int cnt[1000005] = {};
long long int tans[200005] = {};
struct el
{
int l, r, in;
};
bool cmp(const el &x, const el &y)
{
if (x.l/sqt != y.l/sqt)
return x.l/sqt < y.l/sqt;
return x.r < y.r;
}
el qr[200005];
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
int n, q, a, b;
std::cin >> n >> q;
sqt = sqrt((double)(n))+27;
for (int i = 0; i < n; i++)
std::cin >> arr[i];
for (int i = 0; i < q; i++)
{
std::cin >> a >> b;
a--; b--;
qr[i].l = a;
qr[i].r = b;
qr[i].in = i;
}
std::sort(qr, qr+q, cmp);
int li = 0; //left iterator
int ri = 0; //right iterator
ans = arr[0];
cnt[arr[0]]++;
for (int i = 0; i < q; i++)
{
while (li < qr[i].l)
{
ans -= cnt[arr[li]]*cnt[arr[li]]*arr[li];
cnt[arr[li]]--;
ans += cnt[arr[li]]*cnt[arr[li]]*arr[li];
li++;
}
while (li > qr[i].l)
{
li--;
ans -= cnt[arr[li]]*cnt[arr[li]]*arr[li];
cnt[arr[li]]++;
ans += cnt[arr[li]]*cnt[arr[li]]*arr[li];
}
while (ri < qr[i].r)
{
ri++;
ans -= cnt[arr[ri]]*cnt[arr[ri]]*arr[ri];
cnt[arr[ri]]++;
ans += cnt[arr[ri]]*cnt[arr[ri]]*arr[ri];
}
while (ri > qr[i].r)
{
ans -= cnt[arr[ri]]*cnt[arr[ri]]*arr[ri];
cnt[arr[ri]]--;
ans += cnt[arr[ri]]*cnt[arr[ri]]*arr[ri];
ri--;
}
tans[qr[i].in] = ans;
}
for (int i = 0; i < q; i++)
std::cout << tans[i] << '\n';
}
您能否提出任何非渐近(或什至可能是渐近)改进,使程序加速到足以通过时间限制?
我已经尝试过以下方法,但无济于事:
sqt
添加一些不同的常量(例如上面代码中的 )。el
本身中重载 < 比较运算符。我觉得我错过了一些重要的东西,因为我检查过的其他代码似乎以相当大的回旋余地(大约半秒)通过了时间限制。然而,他们似乎使用与我的代码相同的算法。
非常感谢任何帮助!
最佳答案
你可以降低强度
while (li < qr[i].l)
{
ans -= cnt[arr[li]]*cnt[arr[li]]*arr[li];
cnt[arr[li]]--;
ans += cnt[arr[li]]*cnt[arr[li]]*arr[li];
li++;
}
到
while (li < qr[i].l)
{
ans -= (2*cnt[arr[li]]-1)*arr[li];
cnt[arr[li]]--;
li++;
}
其他人也是如此。
关于c++ - Mo算法计算数组的 "power",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36405620/
明日方舟TW-MO-1怎么打 TW-MO-1通关攻略 必备干员 关卡本身不算难,而且也没有刷多次的必要性,所以打完一次就直接结束,这次的必备干员只有爆费先锋,也就是桃金娘或者极境。然后有银老板也
我在使用我们的学习管理系统 (LMS) 中内置的 MathML 编辑器时发现了一些奇怪的东西。当我输入 float 时,它用 包裹小数点标签。 例如,我期望 1.2输出为: 1.2 但是,编辑器输出
我在使用我们的学习管理系统 (LMS) 中内置的 MathML 编辑器时发现了一些奇怪的东西。当我输入 float 时,它用 包裹小数点标签。 例如,我期望 1.2输出为: 1.2 但是,编辑器输出
我需要MO TU WE TH FR SA SU中的工作日符号 我正在使用setDateFormat:@"EEEEE"];和shortWeekdaySymbols 但是它只会返回Sun Mon等。让我知
我正在关注 mo.js 教程,并且正在研究圆形点击爆发部分。 const OPTS = { fill: 'none', radius: 25, stro
我需要你的帮助。要将动画应用到具有单个“my-button”类的多个元素?现在这仅适用于单个按钮。 在 querySelectorAll 上替换 querySelector 无法解决问题,脚本变得无法
我正在使用 PHP 从数据库中生成 .mo 文件,遇到了一个奇怪的问题:有些键有效,有些键无效。我认为生成的文件存在某种问题。如何检查 .mo 文件是否正确? 最佳答案 使用msgunfmt,与msg
对于我们应用程序中的翻译,我们使用 Zend Translate使用 gettext 适配器。在每个模块中都有一个文件夹translations,包含所有语言的.mo 文件; 大莫 nl.mo zh.
我能否在 Java 中获得本地化的短星期名称(英语为 Mo/Tu/We/Th/Fr/Sa/Su)? 最佳答案 最好的方法是使用 java.text.DateFormatSymbols DateForm
我正在尝试使用gettext。 这是我认为起作用的方式- 首先,您使用某种po编辑器,并告诉它扫描应用程序的目录,创建这些“.po”文件,该应用程序会为每个扫描的文件创建一个po文件,其中包含以编程语
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我在核心数据托管对象中有一个属性,我正在尝试根据另一个属性来更新该属性。 如何实现每次更改原始属性时都会调用的方法? awakeFromInsert 和 awakeFromFetch 显然不起作用。我
问题的设置很简单: 用户选择语言首选项(可以从用户的 session 中读取此首选项); 基于此选择,从可用的翻译中加载适当的 .mo; (没有设置单独的域,如果有什么不同的话) 问题:由于此返回必须
这个问题已经有答案了: Reading from a plain text file (4 个回答) 已关闭 4 年前。 我有一个常规的 text.txt 文件,正在另一个程序中使用,文件扩展名为 .
我正在尝试使用 mojs、strokeDasharray 和 strokeDashoffset 为 SVG 的简单线条形状制作动画,也许我对这些属性和值感到困惑,它们在制作动画时表现得很奇怪。 预期的
我正在使用: 罗塞塔 - 0.7.2 Django - 1.4.3 我正在尝试: 忽略 .mo 文件,但继续跟踪 .po 过去一年我一直在使用 Rosetta 和 Django,从来没有遇到过这样的问
我一直在做一个项目,我终于决定制作翻译文件,所以现在我已经翻译了.po文件,但我现在不知道如何在C上使用它,只是我有使用那些 .po 制作 .mo 文件(没关系)。 我一直在四处寻找,但我找到了适用于
我正在尝试解决此问题以加载两个 mo 文件。我有两个 mo 文件,它们都有不同的 msgid 和 msgstr。 我的文件夹结构如下。local/zh_CN/LC_MESSAGES/lang.molo
如何从 .po 或 .mo 文件中提取所有翻译?我需要创建一个包含所有翻译的数组。 最佳答案 您可以使用 Zend Translate来自 Zend Framework 的模块。 $translate
我正在努力使我的 django 应用程序以法语提供(以前它仅以英语提供)。我在我的应用程序中标记了一些字符串进行翻译,以进行尝试。我转到我的应用程序的根目录(manage.py 所在的位置)并运行 d
我是一名优秀的程序员,十分优秀!