【ZJOI2017】树状数组

sts维护两个数不同的概率就可以了

#include<cstdio>
#include<iostream>
#include<algorithm>
const int mod = 998244353;
typedef long long ll;
inline int pow(int x,int y,int ans=1){
    for(;y;y>>=1,x=ll(x)*x%mod)
        if(y&1)ans=ll(ans)*x%mod;
    return ans;
}
inline int inv(int x){return pow(x,mod-2);}
int n,m;
inline int reduce(int x){return x + (x>>31&mod);}
inline int merge(int x,int y){return (ll(mod+1-x)*y+ll(mod+1-y)*x)%mod;}
const int maxn = 100100;
namespace d2{
    const int maxm = maxn * 400;
    int L[maxm],R[maxm],tag[maxm],tot;
    inline void modify(int&rt,int ll,int rr,int v,int l=1,int r=n){
        if(!rt)rt=++tot;
        if(ll<=l&&r<=rr)return void(tag[rt]=merge(tag[rt],v));
        int mid=l+r>>1;
        if(ll<=mid)modify(L[rt],ll,rr,v,l,mid);
        if(mid<rr)modify(R[rt],ll,rr,v,mid+1,r);
    }
    inline int query(int&rt,int pos,int l=1,int r=n){
        if(rt==0||l==r)return tag[rt];
        int mid=l+r>>1,ans;
        if(pos<=mid)ans=query(L[rt],pos,l,mid);
        else ans=query(R[rt],pos,mid+1,r);
        return merge(ans,tag[rt]);
    }
}
const int maxm = maxn * 20;
int L[maxm],R[maxm],val[maxm],tot;
inline void add(int&rt,int ll,int rr,int ll2,int rr2,int v,int l=1,int r=n){
    if(!rt)rt=++tot;
    if(ll<=l&&r<=rr)return d2::modify(val[rt],ll2,rr2,v);
    int mid=l+r>>1;
    if(ll<=mid)add(L[rt],ll,rr,ll2,rr2,v,l,mid);
    if(mid<rr)add(R[rt],ll,rr,ll2,rr2,v,mid+1,r);
}
inline int query(int&rt,int pos1,int pos2,int l=1,int r=n){
    if(rt==0||l==r)return d2::query(val[rt],pos2);
    int mid=l+r>>1,ans;
    if(pos1<=mid)ans=query(L[rt],pos1,pos2,l,mid);
    else ans=query(R[rt],pos1,pos2,mid+1,r);
    return merge(ans,d2::query(val[rt],pos2));
}
int rt,rt2;
int main(){
    std::ios::sync_with_stdio(false),std::cin.tie(0);
    std::cin >> n >> m;
    for(int i=1,l,r,opt,sum=0;i<=m;++i){
        std::cin >> opt >> l >> r;
        if(opt == 1){
            const int p1 = inv(r-l+1),p2=p1*2%mod;
            add(rt,l,r,l,r,p2);
            if(r!=n)add(rt,l,r,r+1,n,p1);
            if(l!=1)add(rt,1,l-1,l,r,p1);
            d2::modify(rt2,l,r,p1);
            sum^=1;
        }else{
            if(l!=1)
                std::cout << reduce(1-query(rt,l-1,r)) << ‘\n‘;
            else {
                std::cout << (sum?d2::query(rt2,r):reduce(1-d2::query(rt2,r))) << ‘\n‘;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/skip1978/p/10332538.html

时间: 2024-11-11 00:43:59

【ZJOI2017】树状数组的相关文章

【BZOJ4785】[Zjoi2017]树状数组 树套树(二维线段树)

[BZOJ4785][Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1) mod 2. 2 l r,表示询问 sigma(Ai) mod 2,L<=i<=r 尽管那个时候的可怜非常的 simple,但是她还是发现这题可以用树状数组做.当时非常yo

[BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status][Discuss] Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道 基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1)

【bzoj4785】[Zjoi2017]树状数组 线段树套线段树

题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: 1 x,表示将 Ax 变成 (Ax + 1) mod 2. 2 l r,表示询问 sigma(Ai) mod 2,L<=i<=r 尽管那个时候的可怜非常的 simple,但是她还是发现这题可以用树状数组做.当时非常young 的她写了如下的算法: 1: function Add(x

Zjoi2017树状数组

2.1 题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的 OI 比赛经历.那是一道基础的树状数组题. 给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作,操作有两种: ? 1 x,表示将 Ax 变成 (Ax + 1) mod 2. ? 2 l r,表示询问 ( ∑r i=l Ai) mod 2. 尽管那个时候的可怜非常的 simple,但是她还是发现这题可以用树状数组做. 当时非常 young 的她写了如下的算法: 1: functio

ZJOI2017 树状数组

属于可怜出的小清新数据结构题呢 题目链接 解析 因为全部都在模\(2\)意义下,因此相当于单点异或,查询区间异或和. 如果你对树状数组足够熟悉,那么你会发现可怜写了一个单点加求后缀和的程序. 因此\([l,r]\)正确的概率就要使\(a_{l-1}\oplus a_l\oplus a_{l+1}\oplus ...\oplus a_n=a_r\oplus a_{r+1}\oplus...\oplus a_n\) 即\(a_{l-1}=a_r\) 于是我们用线段树维护这个问题好像就做完了 当然不对

「ZJOI2017」树状数组

「ZJOI2017」树状数组 以下均基于模2意义下,默认\(n,m\)同阶. 熟悉树状数组的应该可以发现,这题其实是求\(l-1\)和\(r\)位置值相同的概率. 显然\(l=1\)的情况需要特盘. 大暴力 对于\(l=1\)的情况,可以发现一个操作不会产生影响当且仅当增加\(r\)的值,而其他情况会改变\(l-1\)或\(r\). 对于\(l!=1\)的情况: ? 针对一次修改区间\([ql,qr]\). \([ql,qr]\)包含\(l-1,r\),那么有\(\displaystyle 2

bzoj4785【Zjoi2017】树状数组

漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的 OI 比赛经历.那是一道基础的树状数组题. 给出一个长度为 nn 的数组 AA,初始值都为 00,接下来进行 mm 次操作,操作有两种: 1 x1 x, 表示将 AxAx 变成 (Ax+1)mod2(Ax+1)mod2. 2 l r2 l r, 表示询问 (∑ri=lAi)mod2(∑i=lrAi)mod2. 尽管那个时候的可怜非常的 simple,但是她还是发现这题可以用树状数组做.当时非常 young 的她写了如

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

(POJ 3067) Japan (慢慢熟悉的树状数组)

Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29295   Accepted: 7902 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coas

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi