HDU 5475 线段树 + 乘法+取模

本文介绍了一种使用线段树来优化大量乘法和除法操作的方法,避免了传统算法中可能遇到的精度损失问题。通过维护一系列的操作记录,并在需要时更新线段树节点,能够高效地处理乘除运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线段树 + 乘法+取模

题意:

​ 有一个数字最开始是1,现在有两种操作,1. 乘以一个数字y,取模输出答案2. 除以一个之前乘以的数字,取模输出答案。

思路:

​ 操作次数有1e5个,直接乘法也有可能,但是问题是一些数字乘了又除了,直接写很容易由于精度的问题爆了。而线段树竟然可以这样解决!!!线段树维护所有操作,核心操作是乘法,当除以一个数字时,就把那个数字改为1,然后轻轻松松根据回溯就可以不超精度解决,并且让x没必要一直保持一个很大的状态,线段树每次重新利用到没有修改的结果进行修改即可。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

typedef long long LL;

const int maxn = 1e5;

struct Tree
{
    int l,r;
    LL mul;
}rt[maxn*4];

int n;
int mod;

void build(int root,int l,int r)
{
    rt[root].l = l,rt[root].r = r;
    rt[root].mul = 1;
    if(l == r) return ;
    int mid = (l+r)>>1;
    build(root<<1,l,mid);
    build(root<<1|1,mid+1,r);
    return ;
}

void push_up(int root)
{
    rt[root].mul = (rt[root<<1].mul*rt[root<<1|1].mul)%mod;
}

void update(int root,int l,int r,int c)
{
    if(rt[root].l > r || rt[root].r < l) return ;
    if(rt[root].l >= l && rt[root].r <= r) {
        rt[root].mul = c;
        return ;
    }
    update(root<<1,l,r,c);
    update(root<<1|1,l,r,c);
    push_up(root);
}

int main()
{
    //freopen("in.txt","r",stdin);

    int t,ncase = 1;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&mod);
        build(1,1,n);
        printf("Case #%d:\n",ncase++);
        for(int i = 1;i <= n; i++) {
            int op ;
            scanf("%d",&op);
            if(op == 1) {
                int y;
                scanf("%d",&y);
                update(1,i,i,y);
                printf("%I64d\n",rt[1].mul);
            }
            else {
                int ith;
                scanf("%d",&ith);
                update(1,ith,ith,1);
                printf("%I64d\n",rt[1].mul);
            }
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值