codves 4919 线段树练习4「建议收藏」

codves 4919 线段树练习4

大家好,又见面了,我是全栈君。

 时间限制: 1 s

 空间限制: 128000 KB

 题目等级 : 黄金 Gold

题目描述 Description

给你N个数,有两种操作

1:给区间[a,b]内的所有数都增加X

2:询问区间[a,b]能被7整除的个数

输入描述 Input Description

第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是add,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是count,表示统计区间[a,b]能被7整除的个数

输出描述 Output Description

对于每个询问输出一行一个答案

样例输入 Sample Input

   

3 
2 3 4
6
count 1 3
count 1 2
add 1 3 2
count 1 3
add 1 3 3
count 1 3

 

样例输出 Sample Output

0

0

0

1

数据范围及提示 Data Size & Hint

10%:1<N<=10,1<Q<=10

30%:1<N<=10000,1<Q<=10000

100%:1<N<=100000,1<Q<=100000

codves 4919 线段树练习4「建议收藏」codves 4919 线段树练习4「建议收藏」

#include<cstdio>
#include<cstring>
using namespace std;
const int N=100010;
struct node
{
    int lazy,l,r;
    int sum[8];
}tr[N<<2];
int arr[10];
inline void pushup(int ro)
{
    for(int i=0;i<=6;i++) tr[ro].sum[i]=tr[ro<<1].sum[i]+tr[ro<<1|1].sum[i];    
}
void build(int ro,int l,int r)
{
    tr[ro].l=l,tr[ro].r=r;
    if(l==r)
    {
        int a;
        scanf("%d",&a);
        tr[ro].sum[a%7]++;
    }
    else
    {
        int mid=(l+r)>>1;
        build(ro<<1,l,mid);
        build(ro<<1|1,mid+1,r);
        pushup(ro);
    }
    return;
}
inline void down(int ro)
{
    tr[ro<<1].lazy+=tr[ro].lazy;
    tr[ro<<1|1].lazy+=tr[ro].lazy;
    for(int i=0;i<=6;i++) arr[i]=0,arr[i]=tr[ro<<1].sum[i];
    for(int i=0;i<=6;i++) tr[ro<<1].sum[(i+tr[ro].lazy)%7]=arr[i];
    for(int i=0;i<=6;i++) arr[i]=0,arr[i]=tr[ro<<1|1].sum[i];
    for(int i=0;i<=6;i++) tr[ro<<1|1].sum[(i+tr[ro].lazy)%7]=arr[i];
    tr[ro].lazy=0;
}
void change(int ro,int l,int r,int add)
{
    if(l<=tr[ro].l&&tr[ro].r<=r)
    {
        for(int i=0;i<=6;i++) arr[i]=0,arr[i]=tr[ro].sum[i];
        for(int i=0;i<=6;i++) tr[ro].sum[(i+add)%7]=arr[i];
        //printf("%d\n",add);
        tr[ro].lazy+=add;
        tr[ro].lazy%=7;
        //for(int i=1;i<=20;i++) {for(int j=0;j<=6;j++) printf("%d ",tr[i].sum[j]);printf("%d %d\n",tr[i].l,tr[i].r);}
        return;
    }
    if(tr[ro].lazy) down(ro);
    int mid=(tr[ro].l+tr[ro].r)>>1;
    if(l<=mid) change(ro<<1,l,r,add);
    if(mid<r)  change(ro<<1|1,l,r,add);
    pushup(ro);
    return;
}
long long int query(int ro,int l,int r)
{
    if(l<=tr[ro].l&&tr[ro].r<=r) return tr[ro].sum[0];
    if(tr[ro].lazy) down(ro);
    long long int ans=0;
    int mid=(tr[ro].l+tr[ro].r)>>1;
    if(l<=mid)  ans+=query(ro<<1,l,r);
    if(r>mid)   ans+=query(ro<<1|1,l,r);
    return ans;
}
int main()
{
    int n;
    scanf("%d",&n);
    build(1,1,n);
    //for(int i=1;i<=20;i++) {for(int j=0;j<=6;j++) printf("%d ",tr[i].sum[j]);printf("%d %d\n",tr[i].l,tr[i].r);}
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        char pd[8];
        scanf("%s",pd);
        if(pd[0]=='a')
        {
            int a,b,x;
            scanf("%d %d %d",&a,&b,&x);
            change(1,a,b,x%7);
            //for(int k=1;k<=20;k++) {for(int j=0;j<=6;j++) printf("%d ",tr[k].sum[j]);printf("%d %d\n",tr[k].l,tr[k].r);}
        }
        else
        {
            int l,r;
            scanf("%d %d",&l,&r);
            printf("%lld\n",query(1,l,r));
        }
    }
    return 0;    
}

View Code

关键是我们需要维护的东西是什么?

我们用一个数组存区间内%7后每个值的个数;

最后输出值为0的个数。

转载于:https://www.cnblogs.com/12fs/p/7457535.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108201.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 俞敏洪是新东方_新东方创始人是谁

    俞敏洪是新东方_新东方创始人是谁一年前,不用考虑省略号后的故事,那是个不可能的假设。作为教育培训机构,新东方带有比一般企业更为浓烈的创始人气质。俞敏洪就是新东方,他的儒雅风度、人文情怀、幽默口才,卡内基式奋斗经历,都成为公司的标签。特别是另外两位同样富有个性魅力的创始人徐小平和王强离开后,俞更没有理由拒绝扮演这

    2025年11月2日
    6
  • Tips–解决BeatsX开机白灯闪三下无法连接问题(附拆机教程)[通俗易懂]

    Tips–解决BeatsX开机白灯闪三下无法连接问题(附拆机教程)[通俗易懂]解决BeatsX开机白灯闪三下无法连接问题(附拆机教程)问题描述解决方法BeatsX拆机教程问题描述BeatsX耳机用了有一年左右,但是突然有一天,开机的时候只有白灯闪三下,然后连接不上蓝牙,即使重启也没有办法。这个问题困扰了很久,我一度以为是因为里面的固件出了问题,然后在官网刷固件的时候发现固件是最新的无法在刷了,也因此意外收获了修改beatsX名字的方法,哈哈,算是因祸得福吧。最后通过咨…

    2022年6月27日
    124
  • Springboot的jar包和war包的区别

    Springboot的jar包和war包的区别转自: https://blog.csdn.net/qq_32331073/article/details/81544061SpringBoot默认支持很多模板引擎,但是JSP只能够在War中使用,同时mvc.view.prifix/suffix必须主动配置给出,另外必须导入JSP的默认渲染servlet:”org.apache.jasper.servlet.JspServlet”,即添加依赖:…

    2022年5月23日
    27
  • js 后退刷新[通俗易懂]

    js 后退刷新[通俗易懂]history.back()和history.go(-1)都可以实现返回上一页并不刷新向要页面后退刷新使用:window.location.href=document.referrer;即可实现

    2022年7月25日
    6
  • 动态库编程详解_c语言gui库

    动态库编程详解_c语言gui库目录概述一、动态库概念与分类1、什么是动态库2、动态库分类4、动态库解决的问题二、动态库的创建1、规则动态库2、声明导出函数的两种方式2.1__declspec(dllexport)导出2.2.def文件导出3、导出导入类三、隐式、显示调用动态库1、动态库隐式调用2、动态库显示调用3.显示、隐

    2022年9月30日
    4
  • 显示搜索dota2协调服务器,老司机教你处理搜索dota2游戏协调服务器中【操作流程】…[通俗易懂]

    显示搜索dota2协调服务器,老司机教你处理搜索dota2游戏协调服务器中【操作流程】…[通俗易懂]win7系统有很多人都喜欢使用,我们操作的过程中常常会碰到win7系统搜索dota2游戏协调服务器中的问题。如果遇到win7系统搜索dota2游戏协调服务器中的问题该怎么办呢?很多电脑水平薄弱的网友不知道win7系统搜索dota2游戏协调服务器中究竟该怎么解决?其实不难根据下面的操作步骤就可以解决问题1:DOTA2服务器蹦了之后,进入DOTA2,发现最顶端先是提示:“搜索DOTA2协调服务器中…”…

    2022年5月13日
    129

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号