2020牛客寒假算法基础集训营3 G - 牛牛的Link Power II(前缀和)

🍈 🍈 🍈

就把计算公式一顿化简,,代码混合了无修的F题的代码,所以看起来比较长QWQ

在这里插入图片描述(1)直接把F题的代码粘过来计算未修改时的答案
(2)对于每次操作,按照化简后的公式计算他对答案的贡献

#define int ll
const int mod = 1e9 + 7;
int n, m;
char s[MAXN];
vector<int> v;
int c[2][MAXN];//一维为位置和,二维为个数和
void update(int x, int v,int k){ while (x <= n) { c[k][x] += v; x += (x & (-x)); }}
int que(int x,int k){int sum = 0;while (x){sum =(sum+ c[k][x])%mod; x -= (x & (-x));}return sum;}
signed main()
{
    cin >> n ; scanf("%s",s+1); v.push_back(0);
    int pre = -1;
    rpp(i, n)
    {
        if (s[i] == '1')
        {
            update(i,i,0); update(i,1,1);
            if (pre != -1)  v.push_back(i - pre);
            pre = i;
        }
    }
    int ans = 0, k = sz(v);
    rpp(i, k - 1) ans = (ans + ((k - i) * i * v[i]) % mod) % mod;
    cout << ans << endl;
    //以上为F题
    int m;cin >> m;
    rep(i, m)
    {
        int k, x;
        cin >> k >> x;
        if (k == 1) //赋值为1
        {
            ll a=que(x,0),b=que(x,1), c=que(n,0),d=que(n,1);
            ans=(ans+(c-a*2)%mod+(2*b-d)*x%mod)%mod;
            ans=(ans%mod+mod)%mod;
            update(x,x,0); update(x,1,1);
            cout<<ans<<endl;
        }
        else
        {
            update(x,-x,0);update(x,-1,1);
            ll a=que(x,0),b=que(x,1), c=que(n,0),d=que(n,1);
            ans=(ans-(c-a*2)%mod-(2*b-d)*x%mod)%mod;
            ans=(ans%mod+mod)%mod;
            cout<<ans<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值