首页 > 编程语言 >2024牛客寒假算法基础集训营4 K.方块掉落

2024牛客寒假算法基础集训营4 K.方块掉落

时间:2024-02-19 21:44:06浏览次数:55  
标签:sz now mat int res Seg 2024 牛客 集训营

线段树维护的信息有当前行有多少方块, 一共有多少方块

拿线段树维护一个矩阵就行,转移更新就是矩阵乘

类似题有这个 牛客多校第二场-H - zhujio

两题都基本上就是转移矩阵求出来正常建线段树, pushup就是直接矩阵乘

 

#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
typedef long long ll;

const int sz = 3;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;

struct mat {
    ll m[sz][sz];

//可能还要有mod

    mat() { memset(m, 0, sizeof m); }

    mat operator-(const mat& T) const {
        mat res;
        for (int i = 0; i < sz; ++i)
            for (int j = 0; j < sz; ++j) {
                res.m[i][j] = (m[i][j] - T.m[i][j]);
            }
        return res;
    }

    mat operator+(const mat& T) const {
        mat res;
        for (int i = 0; i < sz; ++i)
            for (int j = 0; j < sz; ++j) {
                res.m[i][j] = (m[i][j] + T.m[i][j]);
            }
        return res;
    }

    mat operator*(const mat& T) const {
        mat res;
        int r;
        for (int i = 0; i < sz; ++i)
            for (int k = 0; k < sz; ++k) {
                r = m[i][k];
                for (int j = 0; j < sz; ++j)
                    res.m[i][j] = (res.m[i][j] + T.m[k][j] * r % mod) % mod;
            }
        return res;
    }

    mat operator^(ll x) const {
        mat res, bas;
        for (int i = 0; i < sz; ++i) res.m[i][i] = 1;
        for (int i = 0; i < sz; ++i)
            for (int j = 0; j < sz; ++j) bas.m[i][j] = m[i][j];
        while (x) {
            if (x & 1) res = res * bas;
            bas = bas * bas;
            x >>= 1;
        }
        return res;
    }
} Seg[N * 5], A, B, C, f;

char op[N];

void build(int now, int l, int r) {
    if (l == r) {
        if (op[l] == 'Y') Seg[now] = A;
        else if (op[l] == 'B') Seg[now] = B;
        else Seg[now] = C;
        return;
    }
    int mid = (l + r) >> 1;
    build(now * 2, l, mid);
    build(now * 2 + 1, mid + 1, r);
    Seg[now] = Seg[now * 2] * Seg[now * 2 + 1];
}

void modify(int now, int l, int r, int pos, char v) {
    if (l == r) {
        if (v == 'Y') Seg[now] = A;
        else if (v == 'B') Seg[now] = B;
        else Seg[now] = C;
        return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) modify(now * 2, l, mid, pos, v);
    else modify(now * 2 + 1, mid + 1, r, pos, v);
    Seg[now] = Seg[now * 2] * Seg[now * 2 + 1];
}

mat qurey(int now, int l, int r, int x, int y) {
    if (x <= l && y >= r)return Seg[now];
    int mid = (l + r) >> 1;
    if (y <= mid) return qurey(now * 2, l, mid, x, y);
    if (x > mid) return qurey(now * 2 + 1, mid + 1, r, x, y);
    return qurey(now * 2, l, mid, x, y) * qurey(now * 2 + 1, mid + 1, r, x, y);
}

void solve() {
    int n, q; cin >> n >> q;
    A.m[0][0] = A.m[1][1] = A.m[2][0] = A.m[2][1] = A.m[2][2] = 1;
    B.m[1][1] = B.m[2][0] = B.m[2][1] = B.m[2][2] = 1;
    C.m[1][1] = C.m[2][0] = C.m[2][1] = C.m[2][2] = C.m[0][1] = 1;
    C.m[0][0] = 2;
    f.m[0][2] = 1;
    for (int i = 1; i <= n; i++) cin >> op[i];
    build(1, 1, n);
    while (q--) {
        int op; cin >> op;
        if (op == 1) {
            int p; cin >> p;
            char c; cin >> c;
            modify(1, 1, n, p, c);
        } else {
            int x, y; cin >> x >> y;
            auto ans = f * qurey(1, 1, n, x, y);
            cout << ans.m[0][1] % mod << endl;
        }
    }
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    // int T = 1; cin >> T;
    // while (T--) solve();
    solve();

    return 0;
}
View Code

 

标签:sz,now,mat,int,res,Seg,2024,牛客,集训营
From: https://www.cnblogs.com/zhujio/p/18022031

相关文章

  • 2024程序员能有什么新的出路?
    前言前两天和一个前端同学聊天,他说不准备再做前端了,准备去考公。不过难度也很大。从20152016年那会儿开始互联网行业爆发,到现在有7、8年了,当年20多岁的小伙子们,现在也都30+了大量的人面临这个问题:大龄程序员就业竞争力差,未来该如何安身立命?先说我个人的看法:除非你......
  • [20240219]建立完善sql_idx.sh脚本.txt
    [20240219]建立完善sql_idx.sh脚本.txt--//再次遇到sql_id的计算问题,该语句已经dba_hist相关视图无法查询.--//w3wp.exe程序里面的sql语句脚本带有^M符号(dos文本格式),执行时并不过滤.--//而我的计算sql_id脚本计算时过滤掉^M符号,导致计算错误.--//我修改完善如下:(注里面的^M......
  • 2024九省联考 数学 T19
    寒假有朋友打电话吐槽九省联考,看了眼数学卷子感觉非常刺激。刚开学没事干,试着做一下\(19\).(\(17\)分)离散对数在密码学中有重要的应用。设\(p\)是素数,集合\(X=\{1,2,\cdots,p-1\}\),若\(u,v\inX,m\in\mathbb{N}\),记\(u\otimesv\)为\(uv\)除以\(p\)的余数,\(u^{m,......
  • 2024牛客寒假算法基础集训营4 H&K
    H传送门  观察下图  1.只有在横着连续有三个*的时候才可能会出现三角形,并且随着横坐标的增加实际上增加的是(从左往右从上往下方向)斜对角线上点的数量。  2.当横着连续有3-4个的时候斜线的长度为2,当横着又连续5-6个的时候斜线的长度为3,以此类推,所以启发使用......
  • 2024 SICTF Round#3出题 crypto misc osint
    有幸参与了本次比赛cryptomiscOSINT出题,难易程度循序渐进,下面记录一下本人题目题解(( 比赛网址:https://yuanshen.life/CRYPTOSuperbRSA(85支队伍攻克)题目CRYPTO真的很难吗?Ö_O不会吧不会吧!,一定要相信自己咩~出题人:Kicky_Mu#user:mumu666fromCrypto.Util.number......
  • 2024-02-19 闲话
    2019-06CET4-2你怎么知道我听力都对了Vocabularyrevenuen.收入aslumpinoilrevenue石油收入的下跌workers'strike工人罢工Theynestonthevolcano'sslopes.它们在火山山坡上筑巢。slope这里是另译idleabout游手好闲/虚度时光(贬义)闲逛(中性)acquirev.1.(通......
  • 2024,立一些flag
    关于2023进入了一些新的领域ANC:前半年一直再弄ANC,折腾折腾,好不容易原理搞懂,有了初步的优化结果,结果公司砍了需求,感觉现在处于半吊子水平。没有需求也没有理由去深入,就此搁置。nnAEC:后面做了nnAEC的数据增强,借助这个项目,对整个AEC的处理流程和某些卡喉的难点(非线性失真,延时抖动)......
  • 9.【2024初三集训模拟测试1】
    \(\Huge打了一场模拟赛,又垫底了。qwq\)2024初三集训模拟测试1T1edit\(30pts\)前言被签到题薄纱了。由于没看清题面以为是个数字就要输出空格然后\(\Large④\)了\(qwq\Huge......
  • USACO 2024 February Contest, Bronze Problem 1. Palindrome Game
    1.猜结论2.证明如果\(s<=9\)则\(Bessie\)必赢。如果\(s=10\)则\(Elsie\)必赢。如果\(10<s<=19\)则\(Bessie\)可以减去\(s-10\),使自己必赢。如果\(s=20\)则\(Bessie\)无论如何减去一个回文数都会离\(10\)差一个个位数,\(Elsie\)减去这个个位......
  • 20240219总结
    P9994[YnoiEasyRound2024]TEST_132根号分治。考虑修改操作。如果修改的x数量大于阙值B,那么打上操作次数标记,否则直接各自修改对应的\(y_i\)答案。查询时对于一个y,记录下所有使得xi数量大于B且yi=y的i,这一些贡献是没有加上的。显然xi的数量<=n/B,对于每一个这样的xi快速......