首页 > 其他分享 >6567: 清点人数 树状数组

6567: 清点人数 树状数组

时间:2023-05-31 21:56:02浏览次数:40  
标签:节车厢 火车 树状 int 6567 1B 年级 清点人数 105

描述

 

NK 中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去。由于 NK 中学的学生很多,在火车开之前必须清点好人数。

初始时,火车上没有学生。当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第 m 节车厢时,他想知道前 m 节车厢上一共有多少学生,但是他没有调头往回走的习惯。也就是说每次当他提问时,m 总会比前一次大。

 

输入

 

第一行两个整数 n,k,表示火车共有 n 节车厢以及 k 个事件。

接下来有 k 行,按时间先后给出 k 个事件,每行开头都有一个字母 A,B 或 C。

如果字母为 A,接下来是一个数 m,表示年级主任现在在第 m 节车厢;

如果字母为 B,接下来是两个数 m,p,表示在第 m 节车厢有 p 名学生上车;

如果字母为 C,接下来是两个数 m,p,表示在第 m 节车厢有 p 名学生下车。

学生总人数不会超过 105 。

对于 30% 的数据,1≤n,k≤104 ,至少有 3000 个 A;

对于 100% 的数据,1≤n≤5×105,1≤k≤105 ,至少有 3×104 个 A。

 

输出

 

对于每个 A ,输出一行,一个整数,表示年级主任的问题的答案。

 

样例输入

 

10 7
A 1
B 1 1
B 3 1
B 4 1
A 2
A 3
A 10

样例输出

 

0
1
2
3

 

思路:A是求m的前缀和,B是在m点加上p,C是在m点减去p

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5+10,inf = 0x3f3f3f3f;
int c[N];
int n,k,v,m,p;
char op[2];
int lowbit(int x)
{
    return x&(-x);
}
void updata(int x,int v) //在x点上加v
{
    while(x<=n)
    {
        c[x]+=v;
        x+=lowbit(x);
    }
} 
int sum(int x)
{
    int res = 0;
    while(x>0)
    {
        res+=c[x];
        x-=lowbit(x);
    }
    return res;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;i++)
    {
        scanf("%s",op);
        //cout<<op<<endl
        if(op[0]=='A')
        {
            scanf("%d",&m);
            printf("%d\n",sum(m));
        }
        else if(op[0]=='B')
        {
            scanf("%d%d",&m,&p);
            updata(m,p);
        }
        else
        {
            scanf("%d%d",&m,&p);
            updata(m,-p);
        }
    }
     return 0;
}

 

标签:节车厢,火车,树状,int,6567,1B,年级,清点人数,105
From: https://www.cnblogs.com/jyssh/p/17447435.html

相关文章

  • 6566: 校门外的树2 树状数组
    描述  校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作:K=1,读入l,r表示在l到r之间种上一种树,每次操作种的树的种类都不同;K=2,读入l,r表示询问l到r之间有多少种树。注意:每个位置都可以重复种树。  ......
  • 树状数组详解
    先来看几个问题吧。1.什么是树状数组?顾名思义,就是用数组来模拟树形结构呗。那么衍生出一个问题,为什么不直接建树?答案是没必要,因为树状数组能处理的问题就没必要建树。和Trie树的构造方式有类似之处。2.树状数组可以解决什么问题可以解决大部分基于区间上的更新以及求和问题。......
  • 如何使用TreeView展示树状数据
    如何使用TreeView展示树状数据TreeView是一个可用于显示树形数据结构的UI组件。它提供了一个可折叠、可展开的树状视图。TreeView是一个树状结构,其根节点的类型是TreeItem。每个TreeItem又可以包含若干TreeItem。由此可组成一颗树形结构。效果展示示例代码importj......
  • POJ2352 stars(树状数组)
    题目:Stars #include<stdio.h>#include<string.h>constintN=32005;intC[N];intlevel[N];intLowbit(intx){returnx&(-x);}voidUpdate(intx){inti;for(i=x;i<=N;i+=Lowbit(i)){C[i]++;}}i......
  • Gym - 101174F[(DSU)+树状数组]
    题目链接:https://vjudge.net/problem/Gym-101174F 解题思路:其实这题不同启发式合并也可以做,对rank排个序,然后在做个dfs序,把rank值小的先插入树状数组中更新,然后对每个节点查询它的dfs序的区间和就好了。对于DSU来说就更加无脑了,本来就是"暴力",所以我们直接DSU再加一个树状数组维......
  • hdu 3874(树状数组+离线算法)
    解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和。可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所以离线算法帮助我们把要查询的区间先按照右端点进行排序,因为在处理更靠右的区间时,......
  • hdu 4417(树状数组+离线算法)
    解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样。关键是如何转换成树状数组的模型,这才是本题的难点。我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了。我们还可以发现,如果找到了当前的比h小的所有点(大于的点我们先忽略掉),那么我们就......
  • poj 1195(二维树状数组)
    解题思路:这是一道很裸的二维树状数组AC:#include<stdio.h>#include<string.h>#defineN1100intc[N][N],n,arr[N][N];intlowbit(intx){returnx&(-x);}voidupdate(intx,inty,intnum){inti,j;for(i=x;i<=n;i+=lowbit(i))for(j=y;......
  • hdu 5157(manacher+前缀和+树状数组)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5157解题思路:我们可以先用mancher算法对字符串进行处理,把以每个点为中心的回文串半径求出来,然后进行处理。加入对以p为中心的点,从p-r[i]+1~p都是回文串的开头,那么对于每个回文串(开头是j)只要记录结尾从1~j-1的回文串个数,我们可......
  • 树状数组学习总结
    今天本初中生蒟蒻学习了一下\(\color{red}{树状数组}\),总结一下~~~树状数组的实现功能简介快速求前缀和(\(\color{purple}{O(log_2n)}\))修改某一个数(\(\color{green}{O(log_2n)}\))树状数组图示树状数组其实就是如图所建立的~~~下面引入一个函数——lowbitlowbit(x)是x......