新生赛模拟翩

zstu2018新生赛 p8
1416: 你听说过排序吗?
时间限制: 1 Sec 内存限制: 128 MB
提交: 22 解决: 9
[提交] [状态] [讨论版] [命题人:admin]
题目描述
TT最近对排序算法很感兴趣,
现在他碰到了一个排序题,
给出包含n个数字的数组,
现在有两种操作:
1:把1到x之间的数从小到大排序,
2:把1到x之间的数从大到小排序,
初始序列满足
a[i] = a[i-1]x+a[i-2]y+z;(i>=3);
现给出a[1],a[2],x,y,z;
q[1] = a[1]%n+1,q[2] = a[2]%n+1;
q[i] = (y
q[i-1]+x
q[i-2]+z)%n+1;(i>=3)
op[i] = q[i]%2+1;(i>=1);
(op[i] 为第i个操作的类型,q[i]为第i次操作的x);

输入
第一行:T(T<=30)T组
每组测试包含7个数字:a[1],a[2],x,y,z,n,q,(1<=a[1],a[2],x,y,z<=1e9; 0<=n,q<=1e5)数组包含n个数字,q次操作;

输出
ans = (a[1]*1+a[2]*2,a[n]*n)%1000000007,

样例输入
1
2 3 1 2 3 6 3

样例输出
806

提示
原始序列为:2 3 10 19 42 83

第一次操作为 2 3 ,10 3 2 19 42 83

第二次操作为 1 4 ,2 3 10 19 42 83

第三次操作为 2 3 ,10 3 2 19 42 83

来源/分类
2018浙江理工大学新生赛
初看以为要用什么数学知识做,后来发现这个鬼公式实在没有好变形的,a与q只能暴力求,这里数据很大,所以采取边求边取模。
a最后输出结果是mod1000000007的,所以边求边mod1000000007
p公式里含有mod n,所以边求边mod n
之后排序的过程很显然不能模拟,肯定的是当p[i]>pj时,我们无视第j个操作
因此我们需要进行的操作k属于{n,n0,n1,n2,…,nx}
(p[n]<p[n0]<p[n1]<p[n2]<…<p[nx],n>n0>n1>n2>,…,nx)
将p[k]组成一个新的队列queue
区间 [queue[i-1]+1,queue[i]]需要进行对应的排序操作
由题意,queue[i]为奇数降序,偶数升序
我们用l,r表示排序即时的位置左右区间
从后往前维护,用数组ffind标记代替交换操作,当使用l,r时将l,r更新
tips a[1]<a[2]不一定,需要特判。
and more tips 从这题我学会了 1ll的操作,防止计算中途数据爆掉,方便许多-_-
Code:
#include
#include
#define Mod 1000000007
using namespace std;
typedef long long ll;
int l,r,q[100001],ffind[100001],queue[100001],a[100001];
void give(int start,int end,int flag)
{
int i;
if(flag==1)
for(i=end;i>=start;i–) ffind[i]=(l++);
else
for(i=end;i>=start;i–) ffind[i]=(r–);
}
int main()
{
int t,x,y,z,n,qq,i;
cin>>t;
while(t–)
{
cin>>a[1]>>a[2]>>x>>y>>z>>n>>qq;
q[1]=a[1]%n+1; q[2]=a[2]%n+1;
for(i=3;i<=n;i++)
a[i]=(1ll
a[i-1]x+1lla[i-2]y+z)%Mod;
for(i=3;i<=qq;i++)
q[i]=(1ll
yq[i-1]+1llxq[i-2]+z)%n+1;
int len=0;
queue[++len]=q[qq];
for(i=qq-1;i>=1;i–)
if(q[i]>queue[len]) queue[++len]=q[i];
if(queue[len]>=2&&a[1]>a[2]) swap(a[1],a[2]);
l=1;r=queue[len];int shut=r;
ll sum=0;
for(i=r+1;i<=n;i++)
sum=(sum+1ll
a[i]i%Mod)%Mod;
while(len–)
give(queue[len]+1,queue[len+1],queue[len+1]%2);
for(i=1;i<=shut;i++)
sum=(sum+1ll
a[ffind[i]]*i%Mod)%Mod;
cout<<sum<<endl;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复出一样的项目。 本人系统开发经验充足,有任何使用问欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞、初期项目立项、学习/练手等方面中 可借鉴此优质项目实复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值