首页 > 其他分享 >YC359D [ 20241029 CQYC NOIP 模拟赛 T4 ] 平方(square)

YC359D [ 20241029 CQYC NOIP 模拟赛 T4 ] 平方(square)

时间:2024-10-30 15:20:35浏览次数:1  
标签:square NOIP int T4 texttt define array include mod

题意

P9994 相同。

模数改为 \(998244353\)。

Sol

有点魔怔了。

注意到我们代码中存在:

if (siz[x] <= bsk) {
    for (auto k : idx[x]) {
        isl[sy[k]] -= val[k];
        val[k] = 1ll * val[k] * val[k] % mod;
        isl[sy[k]] += val[k];
    }
}

这段内层会使用 \(10 ^ 9\) 次。

欸,于是我们就跑了 \(\texttt{10s}\),怎么绘事捏。

哦,原来 tmd 随机访问很慢啊!

于是我们改成 \(\texttt{pair}\) 直接扔进 \(\texttt{idx}\) 里面。

if (siz[x] <= bsk) {
    for (auto &[k, y] : idx[x]) {
        isl[y] += mod - k;
        k = 1ll * k * k % mod;
        isl[y] += k;
    }
}

直接就跑到 \(\texttt{1s}\) 之内了。

剩下的就是,注意到 \(2 ^ 23 \times 119 = mod - 1\)。

于是我们大胆猜测指数有循环节!!欸一跑,循环节长度只有 \(24\)!!!

预处理出 \(n\) 个底数所有的循环节即可。

复杂度:\(O(n \sqrt n)\)。

Code

#pragma GCC optimize("Ofast", "inline", "-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <tuple>
#include <vector>
#include <cmath>
#define ll long long
#define il inline
#define rg register
#define pii pair <int, int>
using namespace std;
/* #ifdef ONLINE_JUDGE */

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
#define putchar(x) *(u++) = (x)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 24], *u = ubuf;

/* #endif */
int read() {
    int p = 0, flg = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') flg = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        p = p * 10 + c - '0';
        c = getchar();
    }
    return p * flg;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
bool _stmer;

#define fi first
#define se second

const int N = 1.2e6 + 5, mod = 998244353;

array <int, N> sx, sy, val;

il void Mod(rg int &x) {
    if (x >= mod) x -= mod;
    if (x < 0) x += mod;
}

int pow_(int x, int k) {
    int ans = 1;
    while (k) {
        if (k & 1) ans = 1ll * ans * x % mod;
        x = 1ll * x * x % mod;
        k >>= 1;
    }
    return ans;
}

array <array <int, 47>, N> req;

il int query(int x, int k) {
    if (x <= 23) return req[k][x];
    return req[k][23 + (x - 23) % 24];
}

array <vector <pii>, N> idx;
array <vector <int>, N> idy;

array <int, N> siz, tag;

array <ll, N> isl;

const int bsk = 5095;

bool _edmer;
int main() {
    cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
    int n = read(), q = read();
    for (int i = 1; i <= n; i++)
        sx[i] = read(), sy[i] = read(), val[i] = read();
    for (int i = 1; i <= n; i++)
        siz[sx[i]]++, idx[sx[i]].push_back(make_pair(val[i], sy[i]));
    for (int i = 1; i <= n; i++)
        if (siz[sx[i]] > bsk) idy[sy[i]].push_back(i);
        else isl[sy[i]] += val[i];
    for (int j = 1; j <= n; j++) {
        req[j][0] = val[j];
        for (int i = 1; i <= 46; i += 2) {
            req[j][i] = 1ll * req[j][i - 1] * req[j][i - 1] % mod;
            req[j][i + 1] = 1ll * req[j][i] * req[j][i] % mod;
        }
    }
    int tot = 0;
    while (q--) {
        int op = read(), x = read();
        if (op == 1) {
            if (siz[x] <= bsk) {
                for (auto &[k, y] : idx[x]) {
                    isl[y] += mod - k;
                    k = 1ll * k * k % mod;
                    isl[y] += k;
                }
            }
            else tag[x]++;
        }
        else {
            ll ans = isl[x];
            for (auto k : idy[x])
                ans += query(tag[sx[k]], k);
            write(ans % mod), putchar(10);
        }
    }
/* #ifdef ONLINE_JUDGE */
    fwrite(ubuf, 1, u - ubuf, stdout);
/* #endif */
    return 0;
}

标签:square,NOIP,int,T4,texttt,define,array,include,mod
From: https://www.cnblogs.com/cxqghzj/p/18515902

相关文章

  • 多校A层冲刺 NOIP2024 模拟赛 15
    多校A层冲刺NOIP2024模拟赛15T1追逐游戏(chase)签到题注意到三个点构成的树就是全部路径,找到交汇点(两两lca中dep最大的那个),分讨能否在终点前追上即可。时间复杂度为\(O(nlogn)\)T2统计哈希,差分维护每个值的前缀个数,发现合法段的两个前缀个数的形态一致,只是整体会多......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛15
    Rank一般A.追逐游戏(chase)签,但是保龄。上来发现情况好像是有限的,于是直接分讨,不过漏了n种情况,小样例水,大样例vscose自带的compare跑不出来,注销一遍之后甚至进度条都没了导致我以为过了,最后10min才发现(赛后发现二分是可做的,但是倍增的巨大常数加上逆天评测速度......
  • [57] (多校联训) A层冲刺NOIP2024模拟赛15
    A.追逐游戏一个非常暴力的想法是直接求出最短路径\(S\),然后对\(S\)上的点,比较\(dis_{s,S_i}\)和\(dis_{s',S_i}\)的大小,如果抓捕的人先到就符合条件实际上,这个符合条件的路径是单调的,即在最短路径上存在一个断点,断点靠近起点的一侧总不可达,靠近终点的一侧总是可达的证明......
  • [USACO1.2] 回文平方数 Palindromic Squares 题目解析
    洛谷P1206[USACO1.2]回文平方数PalindromicSquares题目解析题目描述回文数是指从左向右念和从右向左念都一样的数。如123211232112321就是一个典型的回文数。给......
  • NOIP模拟赛 #2
    #1不想理会。A给定\(n\)个点和\(2n-3\)条边,这些边形成了一个凸\(n\)边形以及其三角剖分。你可以任意选择三个点,建立一个新的点以及其连接这三个点的边。最小化新建的点数,使得存在一种把最终的图拆分成两个边集无交的生成树的方案。通过交互来新建节点,并返回构造的方案......
  • NOIP 模拟赛:2024-10-23
    T1:游戏有\(n\)个关卡,编号\(1\simn\),编号\(i\)的关卡的难度是\(p_i\),其中\(p_1,p_2,\dots,p_n\)是\(1,2,\dots,n\)的一个排列。每一个关卡还定义了一个重要度\(d_i\),它的值等于其中前\(i\)个关卡中的难度最小值,即\(d_i=\min_{j=1}^ip_j\)。玩家需通关每个关......
  • P1004 NOIP2000 提高组 方格取数
    P1004NOIP2000提高组方格取数-洛谷分析与[[小烈送菜]]算姐妹题了,这个辈分甚至更老一点。如果直接按照题目,从\(A,B\)两点分别出发,那么有个问题就是不确定性,计算的时候不可控因素很多。可以注意到,从\(B\)点往回走到\(A\)点,是和从\(A\)点再走一遍走到\(B\)点是......
  • 洛谷P1045 [NOIP2003 普及组] 麦森数
    形如 2P−12P−1 的素数称为麦森数,这时 PP 一定也是个素数。但反过来不一定,即如果 PP 是个素数,2P−12P−1 不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是 P=3021377P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。任务:输......
  • 【NOIP提高组】均分纸牌
    【NOIP提高组】均分纸牌......
  • [NOIP1999普及组]导弹拦截
    题目描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所......