博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-3030 Increasing Speed Limits 树状数组
阅读量:6078 次
发布时间:2019-06-20

本文共 1386 字,大约阅读时间需要 4 分钟。

该题题义就是给定一个长度为M的A数组,依照这个数组生成一个长度为N的数组,然后求严格增长的子串个数。

对于所给定的值进行离散化排序,再巧用树状数组求个数。

代码如下:

#include 
#include
#include
#include
#include
#define MOD 1000000007 #define MAXN 500005 using namespace std; int num[MAXN], A[MAXN], c[MAXN], seq[MAXN], cnt; inline int lowbit(int x) {
return x & -x; } inline void modify(int pos, int val) {
for (int i = pos; i <= cnt; i += lowbit(i)) { c[i] += val; if (c[i] >= MOD) c[i] %= MOD; } } inline int getsum(int pos) {
int s = 0; for (int i = pos; i > 0; i -= lowbit(i)) {
s += c[i]; if (s >= MOD) s %= MOD; } return s; } int main() {
int T, n, m; long long X, Y, Z, res; scanf("%d", &T); for (int ca = 1; ca <= T; ++ca) {
res = 0; map
mp; scanf("%d %d %I64d %I64d %I64d", &n, &m, &X, &Y, &Z); memset(c, 0, sizeof (c)); for (int i = 0; i < m; ++i) { scanf("%d", &A[i]); } for (int i = 0; i < n; ++i) { num[i+1] = A[i%m]; seq[i] = num[i+1]; A[i%m] = (X*A[i%m]+Y*(i+1))%Z; } sort(num+1, num+1+n); cnt = unique(num+1, num+1+n) - (num+1); for (int i = 1; i <= cnt; ++i) { mp[num[i]] = i; } modify(1, 1); for (int i = 0; i < n; ++i) { long long x = getsum(mp[seq[i]]); res += x; if (res > MOD) res %= MOD; modify(mp[seq[i]]+1, x); } printf("Case #%d: %I64d\n", ca, res); } return 0; }

转载地址:http://aihgx.baihongyu.com/

你可能感兴趣的文章
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>
linux系列博文---->深入理解linux启动运行原理(一)
查看>>
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VS2008查看dll导出函数
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>