首页 > 其他分享 >2023年01月16日训练日志

2023年01月16日训练日志

时间:2023-01-16 21:26:08浏览次数:68  
标签:01 Matrix 16 int ret il bmatrix 2023 define

P7453

我终于过力

线段树维护矩阵区间和的大卡常师

srds感觉这题不卡常

造屎山的过程不尽顺利

但是终究还是造出来了

事实告诉我们,模板常打常新因为后面的那几个20pts都是因为有个pushdown没有打

此题唯一可以说的点就是加入常量1来维护加常数的操作如 \(A_i=A_i+v\)

六个转移矩阵如下:

\[\begin{bmatrix}1&0&0&0\\1&1&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix} \begin{bmatrix}1&0&0&0\\0&1&0&0\\0&1&1&0\\0&0&0&1\end{bmatrix} \begin{bmatrix}1&0&1&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix} \begin{bmatrix}1&0&0&v\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix} \begin{bmatrix}1&0&0&0\\0&v&0&0\\0&0&1&0\\0&0&0&1\end{bmatrix} \begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&0&v\\0&0&0&1\end{bmatrix}\]

维护时使用这六个矩阵区修 \(\begin{bmatrix}A_i&B_i&C_i&1\end{bmatrix}\) 即可

感谢@FreeTimeLove提供hack数据

还是放下代码吧,首个5k码量,值得纪念

// coding by cxz_0
#include <bits/stdc++.h>
#define awa cerr << "xlx is my superman!!!!!!!!!!!\n";
#define FOR(x,l,r) for(int (x) = (l); (x) <= (r); (x)++)
#define _FOR(x,l,r) for(int (x) = (r); (x) >= (l); (x)--)
#define gc getchar()
#define pb emplace_back
#define mp make_pair
#define pii pair<int, int >
#define PII pair<ll, ll >
#define fi first
#define se second
#define p_q priority_queue
// #define int ll
#define il inline
using namespace std;
typedef long long ll;

const int N = 3e5 + 1,MOD = 998244353;
int n, m;

namespace cxz_0
{
    il int read(int x=0,bool f=0,char c=gc){while(!isdigit(c))f=c=='-',c=gc;while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=gc;return f?-x:x;}
    il void write(int x){if(x<0)x=-x,putchar('-');if(x>9)write(x/10);putchar(x%10+'0');}
    il ll readl(ll x=0,bool f=0,char c=gc){while(!isdigit(c))f=c=='-',c=gc;while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=gc;return f?-x:x;}
    il void writel(ll x){if(x<0)x=-x,putchar('-');if(x>9)write(x/10);putchar(x%10+'0');}
    il int qpow(int a, int n, int p){int b=1;while(n){if(n&1)b=1ll*b*a%p;a=1ll*a*a%p;n>>=1;}return b;}
    il int max(int&a,int&b){return a>b?a:b;}
    il int min(int&a,int&b){return a<b?a:b;}
    il void swap(int&a,int&b){a^=b^=a^=b;}
    il int Mod(int x){return x>=MOD?x-MOD:x;}
} using namespace cxz_0;

struct Matrix
{
    int M[5][5], _r, _c;
    Matrix () {memset (M, 0, sizeof (M));}
    il void clear () {memset(M, 0, sizeof (M));}
    il void init () {FOR (i, 1, min (_r, _c)) M[i][i] = 1;}
    il Matrix operator + (const Matrix& a) const 
    {
        Matrix ret;
        ret._r = _r; ret._c = _c;
        FOR (i, 1, _r) FOR (j, 1, _c) ret.M[i][j] = Mod (M[i][j] + a.M[i][j]);
        return ret;
    }
    il Matrix operator * (const Matrix& a) const
    {
        Matrix ret;
        ret._r = _r; ret._c = _c;
        FOR (i, 1, _r) FOR (j, 1, _c) FOR (k, 1, a._c)
        {
            ret.M[i][j] += (1ll * M[i][k] * a.M[k][j]) % MOD;
            ret.M[i][j] = Mod (ret.M[i][j]);
        }
        return ret;
    }
    il void debugMatrix ()
    {
        FOR (i, 1, _r)
        {
            FOR (j, 1, _c) cerr << M[i][j] << " ";
            cerr  << endl;
        }
    }
    il void printMatrix ()
    {
        FOR (i, 1, _r)
        {
            FOR (j, 1, _c - 1) printf ("%d ", M[i][j]);
            puts("");
        }
    }
}a[N];

struct Segtr
{
    Matrix M_sum, laz;
    #define lc (p << 1)
    #define rc (p << 1 | 1)
    #define MID int mid = (l + r) >> 1
}tr[N << 2];

il void pushup (int p)
{
    tr[p].M_sum = tr[lc].M_sum + tr[rc].M_sum;
}

il void pushdown (int p)
{
    tr[lc].M_sum = tr[lc].M_sum * tr[p].laz;
    tr[rc].M_sum = tr[rc].M_sum * tr[p].laz;
    tr[lc].laz = tr[lc].laz * tr[p].laz;
    tr[rc].laz = tr[rc].laz * tr[p].laz;
    tr[p].laz.clear ();
    tr[p].laz.init ();
}

il void build (int p, int l, int r)
{
    tr[p].M_sum._r = 1, tr[p].M_sum._c = tr[p].laz._r = tr[p].laz._c = 4;
    tr[p].laz.init ();
    if (l == r)
    {
        tr[p].M_sum = a[l];
        return;
    }
    MID;
    build (lc, l, mid);
    build (rc, mid + 1, r);
    pushup (p);
}

il void modify (int p, int l, int r, int ql, int qr, Matrix k)
{
    if (ql <= l && r <= qr)
    {
        tr[p].M_sum = tr[p].M_sum * k;
        tr[p].laz = tr[p].laz * k;
        return;
    }
    pushdown (p);
    MID;
    if (ql <= mid) modify (lc, l, mid, ql, qr, k);
    if (qr > mid) modify (rc, mid + 1, r, ql, qr, k);
    pushup (p);
}

il Matrix query (int p, int l, int r, int ql, int qr)
{
    if (ql <= l && r <= qr) return tr[p].M_sum;
    MID;
    pushdown (p);
    Matrix ret;
    ret._r = 1, ret._c = 4;
    if (ql <= mid) ret = ret + query(lc, l, mid, ql, qr);
    if (qr > mid) ret = ret + query(rc, mid + 1, r, ql, qr);
    return ret;
}

Matrix base;

signed main()
{
#ifndef ONLINE_JUDGE
    double start = clock();
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    base._c = base._r = 4;
    scanf ("%d", &n);
    FOR (i, 1, n)
    {
        int x, y, z;
        scanf ("%d%d%d", &x, &y, &z);
        a[i].M[1][1] = x, a[i].M[1][2] = y, a[i].M[1][3] = z, a[i].M[1][4] = 1;
        a[i]._r = 1, a[i]._c = 4;
    }
    build (1, 1, n);
    scanf ("%d", &m);
    while (m--)
    {
        int op, l, r, v;
        scanf ("%d%d%d", &op, &l, &r);
        if (op == 7){query (1, 1, n, l, r).printMatrix ();continue;}
        base.clear ();
        base.init ();
        if (op >= 4 && op <= 6) scanf ("%d", &v);
        if (op == 1) base.M[2][1] = 1;
        else if (op == 2) base.M[3][2] = 1;
        else if (op == 3) base.M[1][3] = 1;
        else if (op == 4) base.M[4][1] = v;
        else if (op == 5) base.M[2][2] = v;
        else if (op == 6) base.M[3][3] = 0, base.M[4][3] = v;
        modify (1, 1, n, l, r, base);
    }
#ifndef ONLINE_JUDGE
    cerr << "Time: " << 1e3 * (clock() - start) / CLOCKS_PER_SEC << " ms" << endl;
    awa
#endif
    return 0;
}
/*5
0 2 3
3 2 2
2 2 0
1 1 1
2 2 1
4
3 4 5
4 3 4 0
1 1 5
7 3 5*/

从下午到晚上一直在看ddp的相关知识

明天继续

标签:01,Matrix,16,int,ret,il,bmatrix,2023,define
From: https://www.cnblogs.com/cxz-stO/p/17056302.html

相关文章

  • 2023.1.16周报
    本周总结:《算法竞赛》5.1、5.2,5.5、5.6,《算法竞赛进阶指南》0x53、0x54。大方向:动态规划小专题:区间DP、树形DP题目完成情况:div2、abc各一场。P2015(树形DP)、P1352......
  • 案例01 新浪导航栏
    效果: 问题:每个盒子中的字数不一样,但是间隔需要一样解决:先将盒子设定一个宽度是不合理的  ......
  • 2023.1.15/16 日寄
    2023.1.15日寄一言在现实断裂的地方,梦,汇成了海。——顾城昨日复习内容:组合数学「APIO2016」划艇题意\(~~~~\)\(n\)个位置,每个位置有取值区间,对于取值了的位置......
  • 2023.1.16训练日志
    AtCoderBeginnerContest285成绩报告\(AC:T1,\T2,\T3,\T4\quad1000pts\)\(rk2122,\+59\)P1280尼克的任务这道题标签是\(DP\),但是按照标签写题显得没有挑战......
  • 2023.1.9周报
    2023.1.9周报本周总结本周复习了树的直径,最近公共祖先,树上差分和前缀和和tarjan求scc等内容,学习了0/1分数规划,负环,差分约束系统。大主题图论小专题树的直径,最近公共......
  • 回顾2022,展望2023
    大家好,我是练习时长5年半的java选手,回顾2022,是我的人生低谷,因为这一年我被裁了。之前工作的公司中也经历过裁员,但是当时没觉得会裁自己(事实上也没有裁我),所以没当回事......
  • ABB 800XA学习笔记16:系统架构8
    这一篇学习笔记我在新浪博客发表过,地址是ABB800XA学习笔记16:系统架构8_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失1.4.12AC800M冗余System80......
  • 2023/1/16 20221321杨渝学习打卡
    python入门学习学习链接:https://www.bilibili.com/video/BV14r4y1k7F9/?spm_id_from=333.999.0.0&vd_source=a989a1afa6cb8b6527dd9bf059d71439字典的循环打印(解构)字典......
  • WC 2023 游记
    先写在这里,以后排版Day01.12开幕式&文艺汇演最近事比较多,浅浅地看了一下最后几分钟。当时川剧的时候演员下台和嘉宾们握手,距离比较近。握完最后一个时,突然变一张脸,那......
  • C++文学研究助手[2023-01-16]
    C++文学研究助手[2023-01-16]综合实验18文学研究助手一、实验目的(1)熟练掌握串的基本操作及应用。(2)熟练掌握串的匹配操作算法。(3)基于串的存储和操作,实现对英文......