首页 > 其他分享 >12.19 CW 模拟赛 T2. 数

12.19 CW 模拟赛 T2. 数

时间:2024-12-19 17:42:22浏览次数:3  
标签:return int 质数 T2 mid rm CW ll 12.19

思路

赛时读错题了, 虽然说读对了不一定能做出来, 但是还是比较可惜

首先阐述一下题意, 对 \(S\) 数组进行插入和删除操作, 每次询问让你用 \(T\) 中的质数组合出 \(x\) , 然后将 \(S\) 中的数乘以 \(x\) 之后求最多的完全立方数个数

那么显然的, 我们对于每一个数, 都可以拆成质数之积, 那么显然的, 我们可以知道每个数需要什么质数才能凑成完全立方数

\(op = 1\)

如果这个数可能成为一个完全立方数, 我们记录这个数需要 \(T\) 中质数的个数, 这应该是一个 \(0, 1, 2\) 串串, 丢进去

时间复杂度 \(\mathcal{O} (M)\)

\(op = 2\)

扔出来

时间复杂度 \(\mathcal{O} (M)\)

\(op = 3\)

找最大, 结束

题解使用了 \(0, 1, 2 \ \rm{trie}\) , 但是被 \(\rm{klr}\) 的 \(\rm{pbds}\) 轻松冲过

还是稍微写一些 \(\rm{trie}\) , 补一下我的神秘基础

实现

代码

#include <bits/stdc++.h>
const int MAXM = 520;
const int MAXN = 5e6 + 1;
typedef long long ll;

void write(__int128 x) {
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
    return;
}

int M;
int prime[MAXM];
int Q;

struct node {
    int App; // 串串的出现次数
    int son[3]; // 下一个节点
    int prime;
    __int128 x;
} Tree[MAXN];
int cnt = 1; // 0 为根节点

bool check(ll rest)
{
    ll l = 1, r = 1000000;
    while (l <= r)
    {
        ll mid = (l + r) >> 1;
        if (mid * mid * mid == rest)
            return 1;
        mid * mid * mid < rest ? l = mid + 1 : r = mid - 1;
    }
    return 0;
}

std::vector<int> mstr;
std::set<int> leave;

void ins() {
    ll num; scanf("%lld", &num);
    mstr.clear();
    for (int i = 1; i <= M; i++) {
        int cnt = 0; while (!(num % prime[i])) cnt++, num /= prime[i];
        mstr.push_back((3 - (cnt % 3)) % 3);
    }
    if (num != 1 && !check(num)) return;

    ll now = 0;
    __int128 nowx = 1;
    for (int i = 0; i < M; i++) {
        int ch = mstr[i];
        for (int j = 1; j <= ch; j++) nowx *= prime[i + 1];
        if (!Tree[now].son[ch]) Tree[now].son[ch] = cnt++;
        now = Tree[now].son[ch];
        Tree[now].prime = prime[i + 1];
        Tree[now].x = nowx;
    }
    Tree[now].App++;
    leave.insert(now);
}

void del() {
    ll num; scanf("%lld", &num);
    mstr.clear();
    for (int i = 1; i <= M; i++) {
        int cnt = 0; while (!(num % prime[i])) cnt++, num /= prime[i];
        mstr.push_back((3 - (cnt % 3)) % 3);
    }
    if (num != 1 && !check(num)) return;

    ll now = 0;
    for (int i = 0; i < M; i++) {
        int ch = mstr[i];
        now = Tree[now].son[ch];
    }
    Tree[now].App--;
}

__int128 ansx;
int ans;

void solve()
{
    while (Q--) {
        int op; scanf("%d", &op);

        if (op == 1) ins();
        if (op == 2) del();
        if (op == 3) {
            ans = 0, ansx = 0;
            for (auto i : leave) {
                int now = i;
                if (Tree[now].App == 0) {
                    continue;
                }
                __int128 x = Tree[now].x;
                if (ans == Tree[now].App) ansx = std::min(ansx, x);
                if (ans < Tree[now].App) ans = Tree[now].App, ansx = x;
            }
            write(ansx); printf("\n");
        }
    }
}

signed main()
{
    scanf("%d", &M);
    for (int i = 1; i <= M; i++)
        scanf("%d", &prime[i]);
    scanf("%d", &Q);

    solve();

    return 0;
}

总结

注意读题

字符串插入删除, 字典树是最快的

标签:return,int,质数,T2,mid,rm,CW,ll,12.19
From: https://www.cnblogs.com/YzaCsp/p/18617680

相关文章

  • 12.19 CW 模拟赛 赛时记录
    前言考试的时候只需要管考试的策略就行了,其他的想他干嘛看题一般来说,涨信心模拟赛都不会涨信心像一位故人出的题?\(\rm{T1}\)相信自己,冲一下\(\rm{T2}\)看不懂\(\rm{T3}\)博弈\(\rm{T4}\)困难\(\rm{T1}\)机房两青轴是真的蚌埠思路转化题意,对于\(N\)条线......
  • 易基因: ChIP-seq等揭示糖皮质激素和TET2共调控促进癌症转移的表观遗传机制|项目文章
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。结直肠癌(colorectalcancer,CRC)是全球范围内致死率极高的癌症之一,尤其是晚期患者。尽管手术切除是CRC的主要治疗手段,但肿瘤转移仍是影响患者长期生存的关键难题,而化疗对于提高生存率的效果有限。糖皮质激素(Glucocortic......
  • 电脑开机或打开程序提示缺少mscomct2.ocx文件问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • AT24C02密码锁,51单片机。
    #include<REGX52.H>#include<Buttons.h>#include<AT24C02.h>#include<LCD1602.h>#include<Delay.h>#include<security.h>#include<Buzzer.h>unsignedcharOriginal_Password[6]={0};//原始密码数组unsignedcharN......
  • 12.17 CW 模拟赛 赛时记录
    前言这一次又来更新比赛策略讲真打了这么久,还没有一个好的比赛策略真的是抽象回去吃点感冒药看题怎么\(\rm{T1\T2}\)是一个题\(\rm{T1}\)可能是\(\rm{dp}\)题\(\rm{T3}\)有些不好做\(\rm{T4}\)这种题一般都不会做,能骗多少是多少\(\rm{T1}\)思路转化题意......
  • 12.17 CW 模拟赛 T4. 记忆碎片
    思路转化题意,问你在一个带权无向完全图中,如何填上\(w_i\in\left[1,\frac{n\cdot(n-1)}{2}\right]\),使得其最小生成树上的边权为给定的\(n-1\)个数考虑模仿\(\rm{kruskal}\)的方式,令\(f_S\)表示当前点集为\(S\),每次转移,如果当前边权需要在最小生......
  • STM32F103c8t6基于I2C协议的AHT20温湿度传感器的数据采集
    STM32F103c8t6基于I2C协议的AHT20温湿度传感器的数据采集一、了解I2C总线通信协议1、软件I2C2、硬件I2C二、工程建立1、设计要求2、STM32CubeMX的环境配置(一)STM32CubeMX的配置(二)KEIL配置三、代码编写1、AHT20-21_DEMO_V1_3.h2、AHT20-21_DEMO_V1_3.c3、main.c四、硬......
  • [Ynoi2013] D2T2 做题记录
    link很厉害的题目。先弱化题目,考虑\(l=1,r=n\)怎么做。设\(f(x,y)\)表示只保留值域在\([a_x,a_y]\)的数的最大子段和,有用状态数为\(\mathcalO(n^2)\)。我们发现这玩意其实是可以分治的:将原序列分成两半,求出左半部分和右半部分的只保留\([a_x,a_y]\)中的数的......
  • Google Kickstart2022 Round G Problem C 快乐子数组
    有点思路,但还需要细想思路一眼上去,应该是写单调队列,但是不是像写滑动窗口一样写设前缀和为pre,如果一个区间\([l,r]\)满足条件,那么\(pre[l-1]<min(pre[l],pre[l+1],.....,pre[r]\)根据这一点,我们每次枚举到i,只需要统计左端有多少个相对应的j使得pre[j]<pre[i]即可,这时就可以......
  • 12.12 CW 模拟赛 T3. 消除贫困
    思路朴素容易发现一个人资金变化是这样的:对于\(op=1\)的情况,会将其直接变成\(x\)对于\(op=2\)的情况,将其变成\(\max(x,当前值)\)直接用线段树暴力的维护即可巧妙容易发现\(op=2\)相当于一个大保底,我们先倒着处理出每个人到\(i\)位置至少有多少......