博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你听说过排序吗?
阅读量:2038 次
发布时间:2019-04-28

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

题解:

由于x,y,z 都是大于等于1 的,

所以原序列是升序的,但是注意给你的a[0],a[1]可能不是升序的(这里要特别处理)。
对于这些操作很容易发现较长的操作会覆盖掉较小的操作
所以如果一个操作的区间比它后面的某个操作的区间小,那么这个操作是无效的,
可以发现有效的操作的区间必定是递减的,
由于只会按照从大到小和从小到大排序,
而每个有效操作的有效区间是它下一个有效区间没有覆盖的部分,所以只需要把原序列
用双指针维护,每次把每个有效操作的有效区间填好就行了。

#include
using namespace std;typedef long long LL;const int N = 1e5 + 10;const int mod = 1e9 + 7;int v[N], q[N];int line[N];int ans[N];int n, qq;int main(){ freopen("data.in","r",stdin); freopen("data.out","w",stdout); int t, x, y, z; scanf("%d", &t); while(t--){ scanf("%d%d%d%d%d%d%d", &v[1], &v[2], &x, &y, &z, &n, &qq); for(int i = 3; i <= n; ++i) v[i] = (v[i - 1] * 1ll * x + y * 1ll * v[i - 2] + z) % mod; q[1] = v[1] % n + 1, q[2] = v[2] % n + 1; for(int i = 3; i <= qq; ++i) q[i] = (y * 1ll * q[i - 1] + x * 1ll * q[i - 2] + z) % n + 1; int en = 0, l = 1, r; for(int i = qq; i ; --i){ if(q[i] > line[en]) line[++en] = q[i]; } if(line[en] >= 2 && v[1] > v[2]) swap(v[2], v[1]); for(int i = line[en] + 1; i <= n; ++i) ans[i] = v[i]; r = line[en]; for(int i = en; i; --i){ for(int j = line[i]; j > line[i - 1]; --j){ if(line[i] & 1) ans[j] = v[l], l++; else ans[j] = v[r], r--; } } LL aans = 0; for(int i = 1; i <= n; ++i){ aans += ans[i] * 1ll * i % mod; if(aans >= mod) aans -= mod; } printf("%I64d\n", aans); } return 0;}

 

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

你可能感兴趣的文章
组件化、模块化、集中式、分布式、服务化、面向服务的架构、微服务架构
查看>>
分布式服务架构与微服务架构概念的区别与联系是怎样的
查看>>
微服务架构的优势与不足
查看>>
微服务架构中的进程间通信
查看>>
选择微服务部署策略
查看>>
Docker 在分布式和大数据框架中的应用
查看>>
javaweb学习总结——获得MySQL数据库自动生成的主键
查看>>
【zabbix教程三】——centos7 安装zabbix客户端并监控
查看>>
SpringMVC
查看>>
多线程
查看>>
设计模式之一适配器模式
查看>>
MVC、MVP、MVVM之间的关系
查看>>
计算机网络--HTTP协议(二)
查看>>
Spring 手动提交事务
查看>>
代码重构(一):函数重构规则
查看>>
IP地址分类
查看>>
Spring总结之注解(2)
查看>>
Maven常用命令大全与pom文件讲解
查看>>
Java和JavaScript中使用Json方法大全
查看>>
Ubuntu14.04下安装docker
查看>>