SDKD 2017 Summer Team Training #12, tm--A(Queries )

题目大意:

给你一个数组,给你如下几种操作:

s l r mod 查询区间【l,r】中模m等于mod的数字之和;

+ p r 将p位置的数加上r后模m;

- p r 将p位置的数减去r后模m;

解题思路:

一般进行区间查询,位置操作可以使用线段树或者树状数组解决(暂时只会树状数组);这题的特殊之处就在于要求模m等值;

由于m的值较小(m<10) 因此我们可以开一个二重的树状数组,第二重保存模m后的值;其余操作就是基本的树状~

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <iterator>
#include <queue>
#include <cmath>
#include <map>
#include <cstdio>

using namespace std;
typedef long long ll;
#define maxn 100007
#define INF 0x3f3f3f3f
ll n,m,mod;
ll a[maxn];
ll c[maxn][20];

int lowbit(int x)
{
    return x&(-x);
}

void add(int pos,ll v,int mod)
{
   // cout<<v<<" "<<mod<<"+++++++"<<endl;
    while(pos<=n)
    {
        c[pos][mod]+=v;

        pos+=lowbit(pos);
    }
}

ll ac_sum(int pos,int mod)
{
    ll sum=0;
    while(pos>0)
    {
        //cout<<"++++"<<endl;
        sum+=c[pos][mod];
        pos-=lowbit(pos);
    }
    return sum;
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        //int a;
        cin>>a[i];
        add(i,a[i],(a[i]%m));
    }
    int k;
    cin>>k;
    while (k--)
    {
        string s;
        cin>>s;
        if (s[0]==‘s‘)
        {
            ll i,j,l;
            cin>>i>>j>>l;
            cout<<ac_sum(j,l)-ac_sum(i-1,l)<<endl;
        }
        else  if (s[0]==‘+‘)
        {
            ll i,j;
            cin>>i>>j;
            add(i,-a[i],a[i]%m);
            a[i]+=j;
            add(i,a[i],a[i]%m);
            cout<<a[i]<<endl;
        }
        else if (s[0]==‘-‘)
        {
            ll i,j;
            cin>>i>>j;
            add(i,-a[i],a[i]%m);
            if (a[i]>=j)
            {
                a[i]-=j;
            }
            add(i,a[i],a[i]%m);
            cout<<a[i]<<endl;
        }
    }
}

时间: 2024-10-02 10:16:26

SDKD 2017 Summer Team Training #12, tm--A(Queries )的相关文章

SDKD 2017 Summer Team Training #12, tm ( Yet Another Median Task )

题目大意:给定一个矩阵,给你多次查询,查询一个小矩阵中的数的中位数: 解题思路:完全没往二分上想,我们可以二分枚举中位数数值,搜索矩阵中数值小于中位数的个数. #include <cstdio> #include <iostream> #include <string.h> #include <string> #include <map> #include <queue> #include <vector> #includ

2017&quot;百度之星&quot;程序设计大赛 - 初赛(A)

2017"百度之星"程序设计大赛 - 初赛(A) hdu6108    求出 n-1 的因子个数即可 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b;

HDU 6114 Chess 【组合数】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 513    Accepted Submission(s): 319 Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻

HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1572    Accepted Submission(s): 513 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

HDU 6113 度度熊的01世界 【DFS】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 400 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0

HDU 6122 今夕何夕 【数学公式】 (2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1295    Accepted Submission(s): 455 Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了"今夕何夕,见此良人"的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最

HDU 6109 数据分割 【并查集】 (2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

数据分割 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1119    Accepted Submission(s): 268 Problem Description 小w来到百度之星的赛场上,准备开始实现一个程序自动分析系统. 这个程序接受一些形如xi=xj 或 xi≠xj 的相等/不等约束条件作为输入,判定是否可以通过给每个 w 赋

HDU 6108 小C的倍数问题 【数学】 (2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 481    Accepted Submission(s): 278 Problem Description 根据小学数学的知识,我们知道一个正整数x是3的倍数的条件是x每一位加起来的和是3的倍数.反之,如果一个数每一位加起来是3的倍数,则这个数肯定是3的倍数. 现在给定进制

Team Foundation Server 2013 KEY(密钥)

isual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥):FBJVC-3CMTX-D8DVP-RTQCT-92494 Visual Studio Professional 2013  KEY(密钥): XDM3T-W3T3V-MGJWK-8BFVD-GVPKY Team Foundation Server 2013 KEY(密钥):MHG9J-HHHX9-