abc253 F – Operations on a Matrix

题意:

\(n\times m\) 矩阵,初始全零。\(q\) 次操作:

  • 1 l r x\([l,r]\) 列的所有元素 \(+x\)
  • 2 i x 令第 \(i\) 行的所有元素 \(=x\)
  • 3 i j 输出位于 \((i,j)\) 的元素

\(n,m,q\le 2e5\)

思路:

Sir, this way: https://www.cnblogs.com/jakon/p/16323545.html

const signed N = 2e5 + 5;
int n, m, q, las[N];
struct {
    int id, l, r, x, i, j;
    vector<int> ve;
    ll ans;
} Q[N];

ll tr[N];
int lowbit(int x) {return x&-x; }
void add(int p, int x) {for(;p<=m;p+=lowbit(p))tr[p]+=x; }
ll ask(int p) {ll s=0;for(;p>0;p-=lowbit(p))s+=tr[p];return s; }

void sol() {
    cin >> n >> m >> q;
    for(int i = 1; i <= q; i++) {
        cin >> Q[i].id;
        if(Q[i].id == 1)
            cin >> Q[i].l >> Q[i].r >> Q[i].x;
        if(Q[i].id == 2) {
            cin >> Q[i].i >> Q[i].x;
            las[Q[i].i] = i;
        }
        if(Q[i].id == 3) {
            cin >> Q[i].i >> Q[i].j;
            Q[i].ans = Q[las[Q[i].i]].x;
            Q[las[Q[i].i]].ve.push_back(i);
        }
    }
    for(int i = 1; i <= q; i++) {
        if(Q[i].id == 1)
            add(Q[i].l, Q[i].x), add(Q[i].r + 1, -Q[i].x);
        if(Q[i].id == 2)
            for(int t : Q[i].ve)
                Q[t].ans -= ask(Q[t].j);
        if(Q[i].id == 3)
            cout << Q[i].ans + ask(Q[i].j) << '\n';
    }
}

原文链接: https://www.cnblogs.com/wushansinger/p/17048274.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    abc253 F - Operations on a Matrix

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/311561

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午12:02
下一篇 2023年2月16日 下午12:03

相关推荐