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

本文共 1479 字,大约阅读时间需要 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; }

转载于:https://www.cnblogs.com/Lyush/archive/2012/02/26/2369036.html

你可能感兴趣的文章
hive 分区表
查看>>
观影计划:漫威电影宇宙「无限战争」系列
查看>>
用番茄工作法提升工作效率 (二)用番茄钟实现劳逸结合(简单到不可相信)...
查看>>
1.3 排序显示数据
查看>>
在form上设定了defaultbutton属性之后,切换提交按钮的解决办法
查看>>
HTMl5视频播放
查看>>
struts2标签之列求和
查看>>
《面向对象程序设计课程学习进度条》
查看>>
oracle 迁移数据文件( 转)
查看>>
mybatis association和collection标签怎么用
查看>>
一个最简单的Delphi2010的PNG异形窗口方法
查看>>
怎样关闭拼写错误标记
查看>>
常见COM问题解答
查看>>
用到的linux命令
查看>>
【词云】代码
查看>>
201521123038 《Java程序设计》 第十二周学习总结
查看>>
UIImageView 一些属性设置
查看>>
C# winfrom 打印到Excel中
查看>>
Java中ThreadLocal类的作用以及实现原理
查看>>
mustache学习补遗
查看>>