6819. 【2020.10.07提高组模拟】七曜圣贤 (sage)

本文介绍了一种关于茶购买和回收的策略问题解决方案。通过分析茶的购买与回收特性,利用标记数组确保购买序列不下降,并采用单调队列来处理回收情况。详细解析了算法流程与实现细节。

Description

Input

Output

每组数据输出一行表示答案。

Solution


Explanation

比赛的时候没注意到SeedSeedSeed的数据类型,然后调了好久😓
也就是C++的unsigned int
这道题观察到如果是扔出去的茶,肯定有两个性质:
1.已经被买过了
2.一定比它后面扔出去的茶先捡回来
我们先考虑只买茶的情况
对于这种情况,我们发现答案肯定是不下降的,所以我们用标记数组维护一下就好了
然后就是扔出去的茶
根据性质2,如果后面扔出来的茶比前面的茶要小,那前面的茶对后面的答案肯定是没贡献了
所以我们可以用单调队列维护
对于捡回来的情况,用个普通队列维护就行了
注意细节

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MO 998244353
#define M 3000001
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int t,m,a,b,c,d,i,ma,l,head,tail,ans,tot,ls,p[M],pl[M],qu[M];
bool bz[M],bj[M];
unsigned int seed;
unsigned int randnum()
{
    seed=seed^(seed<<13);
    seed=seed^(seed>>17);
    seed=seed^(seed<<5);
    return seed;
}
int main()
{
    open("sage");
    scanf("%d",&t);
    for (;t;t--)
    {
        scanf("%d%d%d%d%d%d",&m,&seed,&a,&b,&c,&d);
        for (i=1;i<=m;i++)
        {
            if (randnum()%c==0) p[i]=-1;else p[i]=randnum()%b;
        }
        for (i=0;i<=a;i++)
            bz[i]=1;
        ma=a+1;l=1;head=1;tail=0;tot=0;
        for (i=1;i<=m;i++)
        {
            if (p[i]==-1)
            {
                if (d || l>tot) continue;
                bj[qu[l]]=0;
                if (pl[head]==qu[l] && head<=tail) head++;
                l++;
            }else 
            if (!bz[p[i]])
            {
                bz[p[i]]=1;
                while (bz[ma]) ma++;
                if (p[i]==pl[head] && head<=tail) head++;

            }else 
            if (!bj[p[i]])
            {
                if (d==1) continue;
                bj[p[i]]=1;
                qu[++tot]=p[i];
                while (head<=tail && (pl[tail]>=p[i] || !bj[pl[tail]])) tail--;
                pl[++tail]=p[i];
            }else 
            {
            	if (d || l>tot) continue;
            	bj[qu[l]]=0;
            	if (pl[head]==qu[l] && head<=tail) head++;
            	l++;
			}
			if (head>tail) ls=2147483647;else ls=pl[head];
            ans=ans^(1ll*min(ls,ma)*(1ll*(7+i)*i%MO)%MO);
        }
        printf("%d\n",ans);
        ans=0;
        memset(bz,0,sizeof(bz));
        memset(bj,0,sizeof(bj));
    }
    return 0;
}
内容概要:本文系统探讨了CUDA并行计算优化技巧在计算机竞赛中的实战应用,重点解决暴力枚举在大规模数据下超时的问题。通过将独立的解空间验证任务分配给GPU海量线程并发执行,显著提升计算效率。文章围绕图论(全源最短路径Floyd-Warshall算法)和数值计算(多初始值牛顿迭代求解非线性方程)两大高频竞赛场景,详细剖析了线程索引映射、原子操作、常量内存、流并发等核心优化技术,并提供了串行与并行代码对比及性能分析。结果显示,在A100和RTX 3090等GPU上,加速比可达72至150倍,实现从分钟级到秒级甚至毫秒级的性能突破。此外,文章展望了动态并行、多GPU协同、AI辅助调优等未来趋势,强调CUDA优化对培养软硬件协同思维的重要意义。; 适合人群:具备一定C/C++编程基础和算法竞赛经验,熟悉基本图论与数值计算问题,希望提升高性能计算能力的高校学生或竞赛选手(尤其是参与ACM、ICPC、NOI等赛事的1-3年备赛者); 使用场景及目标:①掌握如何将传统暴力枚举算法转化为GPU并行版本;②深入理解Floyd-Warshall和牛顿迭代等经典算法的并行化限制与优化策略;③学习CUDA内存模型、线程织与同步机制在实际问题中的应用; 阅读建议:建议结合文中代码案例在支持CUDA的环境上动手实现并调试,重点关注线程映射、内存访问模式与数据依赖处理,同时对比串行与并行版本的运行效率,深化对并行计算本质的理解。
题目描述 在雾之湖畔红色洋馆的地下图书室中, Patchouli 正在操纵名为「七曜元素秘典」的魔法卷轴构建法术序列。这个装置通过悬浮的符文阵列储存七种元素之力,每个符文的能量印记对应现代计算机中的字符编码。 秘典规则 秘法操作 指令格式 功能描述 锚定 Anchor k 将编织指针固定到第 kk 个符文后方( k=0k=0 时锚定到阵列起始) 召唤 Summon n s 在指针处召唤符文 ss ,总长度为 nn 湮灭 Annihilate n 抹除指针后方 nn 个符文的能量印记 显现 Manifest n 将指针后方 nn 个符文的能量印记具现化 溯流 Rewind 指针逆流回溯一个符文位 涌进 Surge 指针顺流前进一个符文位 模拟任务 初始化空白卷轴 解析 Patchouli 的秘法操作 将「显现」结果刻录至元素秘典 输入格式 第一行为秘法操作总数 tt; 每个 Summon 操作中的 ss 可能包含可见字符( ASCIIsi∈[32,126]ASCIIsi​​∈[32,126] )或者换行符 (\n)。换行符仅为提高可读性,执行指令时忽略 \n 。 保证所有操作参数合法(无需处理异常输入)。 输出格式 每行依次对应 Manifest 指令具现得到的符文。 样例 输入 9 Summon 13 Balanc ed eert Anchor 2 Annihilate 5 Surge Summon 7 1919810 Anchor 0 Manifest 15 Anchor 11 Manifest 3 输出 Bad1919810 eert eer 数据范围 Anchor 操作不超过 5000050000 次; Summon 与 Annihilate 操作总数不超过 40004000 次; 时空回溯( Rewind / Surge )总次数不超过 200000200000 次; 所有 Summon 操作注入的符文总数不超过 22 Mb (1024×10242×1024×1024 字节); Manifest 结果的总长度不超过 33 Mb; 湮灭与显现操作执行时指针后方必有足够符文; 所有指针移动操作不会越界。 对新手魔法使的忠告: 需要处理的 I/O 流规模较大,建议关闭同步流 Hint: 时空磁盘限制(运行时) 时间限制:200 ms 内存空间限制:244 MiB 磁盘空间限制:不可使用磁盘 分析这道题并给出几个测试数据,将Summon操作的字符串放在第二行
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值