列表

详情


NC216031. 宝石街

描述

镇,坐落着一条长度为的宝石街。
把起点定为原点,以终点方向作为正方向建立数轴,那么对于每个整数,在点处有a_i块宝石。
身无分文的小此时就站在原点,径直向终点走去。在且仅在行走的过程中经过每一个整数点,他可以选择捡起或扔掉任意块的宝石,也可以既不捡又不扔。设他在某一点拥有的宝石数为,那么他走到下一个点需要的时间也为
现在,小想知道,在行走时间不超过(不需要到达终点)时,他最多可以拥有多少块宝石?

输入描述

由于本题数据范围较大,部分测试点的a_i将在程序内生成。
输入共行。
行包含个正整数
,保证行包含个正整数,其中第个数表示
,第行包含个正整数a_1。对于每个整数,设,则(其中是按位异或运算)。
注意,本题的标准解法并不依赖于此数据生成方法

输出描述

输出共行,包含个非负整数,表示小拥有的最多宝石数。

示例1

输入:

5 12 1
2 5 2 5 2

输出:

12

说明:

捡起点\text 2,3,4上的所有宝石;不扔宝石。
则小\text D在点\text 2的宝石数为\text 5,用\text 5的时间移动到点\text 3
在点\text 3的宝石数为\text 7,用\text 7的时间移动到点\text 4
在点\text 4的宝石数为\text 12。用时\text 12

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 2009ms, 内存消耗: 235244K, 提交时间: 2021-01-04 17:49:10

#include<bits/stdc++.h>
using namespace std;

int a[60000005];
int main()
{
    int i,l,r,n,op,p;
    long long x,y,t,s=0,S=0,ans=0;
    scanf("%d%lld%d",&n,&t,&op);
    if(op==1)for(i=1;i<=n;i++)scanf("%d",&a[i]);
    else
    {
    	scanf("%d%d",&a[1],&p);
    	for(i=2;i<=n;i++)
    	{
			x=a[i-1];
			x=x^(x<<13);
    		y=x^(x>>17);
    		a[i]=(y^(y<<5))%p+1;
		}
	}
	for(l=r=1;r<=n;r++,S+=s)
	{
		s+=a[r];
		while(S>t)s-=a[l],S-=(long long)(r-l)*a[l],l++;
		ans=max(ans,s+(l>1?(t-S)/(r-l+1):0));
	}
	printf("%lld\n",ans);
	return 0;
}

上一题