hdu-5475 An easy problem---线段树+取模
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5475
题目大意:
给X赋初值1,然后给Q个操作,每个操作对应一个整数M;
如果操作是1则将X乘以对应的M,
如果是2则除以第M次操作对应的M',求每次操作后X的值对给定值取摸的结果。
解题思路:
第一眼看这道题,以为就是水题,直接模拟暴力呀,但是发现这样是错误的,因为这里有除法,对除法取模,就应该是逆元,但是逆元不一定存在
想了之后发现可以用线段树保存每一个要乘以的数字,对于操作一就加入数字即可,操作二就对第M次操作的数字进行标记,不让他参与乘法运算,每次输出tree[1]的值就可以了。
线段树维护两个值,一个为标记,一个是区间内的数字的积,对于操作一,更新叶节点,并且更新其父节点。对于操作2也是更新叶节点,标记他,更新父节点时,不让标记过的叶节点参与乘法运算。
#include<bits/stdc++.h>
#define MID(l, r) (l + (r - l) / 2)
#define lc (o<<1)
#define rc (o<<1|1)
using namespace std;
typedef long long ll;
int n, m;
const int maxn = + ;
struct node
{
bool flag;
ll num;
int l, r;
}tree[maxn << ];
void build(int o,int l, int r)
{
tree[o].l = l, tree[o].r = r;
tree[o].flag = ;
if(l == r)
{
tree[o].num = ;
return;
}
int m = MID(l ,r);
build(lc, l, m);
build(rc, m + , r);
tree[o].num = ;
if(tree[lc].flag)tree[o].num = tree[o].num * tree[lc].num % m;
if(tree[rc].flag)tree[o].num = tree[o].num * tree[rc].num % m;
}
int flag;
int p, v;
void update(int o)
{
if(tree[o].l == tree[o].r)
{
if(flag)
{
tree[o].flag = ;
tree[o].num = v;
}
else
{
tree[o].flag = ;
}
return;
}
if(p <= tree[lc].r)update(lc);
else update(rc);
tree[o].num = ;
if(tree[lc].flag)tree[o].num = tree[o].num * tree[lc].num % m;
if(tree[rc].flag)tree[o].num = tree[o].num * tree[rc].num % m;
}
int main()
{
int T, cases = ;
cin >> T;
while(T--)
{
printf("Case #%d:\n", ++cases);
scanf("%d%d", &n, &m);
int a, b;
build(, , n);
for(int i = ; i <= n; i++)
{
scanf("%d%d", &a, &b);
if(a == )
{
flag = ;
p = i, v = b;
}
else
{
flag = ;
p = b;
}
update();
printf("%lld\n", tree[].num);
}
}
return ;
}
hdu-5475 An easy problem---线段树+取模的更多相关文章
- HDU 5475 An easy problem 线段树
An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 2015上海网络赛 HDU 5475 An easy problem 线段树
题意就不说了 思路:线段树,维护区间乘积.2操作就将要除的点更新为1. #include<iostream> #include<cstdio> #include<cstr ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- hud-5475 An easy problem(线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- hdu 4291 A Short problem(矩阵+取模循环节)
A Short problem Time Limit: 2000/1000 MS (J ...
- Gym 101201J Shopping (线段树+取模)
题意:给定 n 个物品,然后有 m 个人买东西,他们有 x 元钱,然后从 l - r 这个区间内买东西,对于每个物品都尽可能多的买,问你最少剩下多少钱. 析:对于物品,尽可能多的买的意思就是对这个物品 ...
- hdu 5443 The Water Problem 线段树
The Water Problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
随机推荐
- Java通过流对MP4视频文件进行加密,H5 video播放流
加密目标文件 代码如下: 不建议进行二次加密,若二次加密必须要二次解密 package com.xgt.util; import java.io.*; public class VideoEncode ...
- jQuery 自定义方法(扩展方法)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划
Description 外卖店一共有N种食物,分别有1到N编号.第i种食物有固定的价钱Pi和保质期Si.第i种食物会在Si天后过期.JYY是不会吃过期食物的. 比如JYY如果今天点了一份保质期为1天的 ...
- 用 Redis Desktop Manager 远程连接 redis 数据库。
环境: 本机OS:window 10(本机没有安装redis) redis 服务器:centos 7 使用 Redis Desktop Manager 工具远程连接 redis. Redis Desk ...
- Centos7 linux 安装 redis 遇到的几个问题
环境:centos7 + redis 5.0 解决方案仅供参考,如不能解决问题,请查找请他方案. 1.不能编译没有GCC 编译工具 make报错: make[1]: [persist-set ...
- jsp servlet基础复习 Part2--GET,Post请求
最近进行servlet和jsp方面的梳理复习时,发现以前忽略了一个非常重要的知识点:get和post的请求(如果你觉得两者仅仅是提交数据量的大小以及方式不同就大错特错了)的正真区别,下面进行简答的整理 ...
- Spring课程 Spring入门篇 6-1 Spring AOP API的PointCut、advice的概念及应用
本节主要是模拟spring aop 的过程. 实现spring aop的过程 这一节老师虽然说是以后在工作中不常用这些api,实际上了解还是有好处的, 我们可以从中模拟一下spring aop的过程. ...
- 打印thinkphp中的sql语句
var_dump($repair->fetchSql(true)->where(array('cuername' =>$cuername))->order('applytime ...
- 小白学flask之hello,world
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "He ...
- 关于开发Cesium造成的电脑风扇狂飙的问题
最近在开发Cesium的项目,每次一打开浏览器渲染3D 模型.风扇就狂飙起来,进任务管理器查看发现集显使用率100%,独显使用率0%.使用的是集显进行渲染.怪不得风扇会飙起来.既然知道问题所在,解决的 ...