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号 ...
随机推荐
- PHP常用文件操作
<?php $path = "/home/work/srccode/hello.go"; $dirName = dirname($path); $name = basenam ...
- .net core 第一篇选择开发工具和环境
.net core 已经发布三年了,社区也逐步成熟.作为微软阵营的一员,忙了一年年底抽点时间系统学习下.学习资料主要为以下为主: 1. https://docs.microsoft.com/zh-cn ...
- 在 Web 应用中创建 Node.js 应用程序
本分步指南将通过 Azure Web 应用帮助您启动并运行示例 Node.JS 应用程序.除 Node.JS 外,Azure Web 应用还支持其他语言,如 PHP..NET.Node.JS.Pyth ...
- 添加jquery脚本文件
对于后台添加JQuery需要加上../js {insert_scripts files ="../js/jquery.1.14.min.js"}
- 1、springboot之HelloWorld
最基本的,官网copy 创建maven项目 maven中添加 <parent> <groupId>org.springframework.boot</groupId> ...
- JUC总览,来自汪文君整理
- centos自带python2.6升级到python2.7。并解决yum pip easy_install pip等模块兼容性问题
参考原文: https://www.cnblogs.com/kimyeee/p/7250560.html https://www.cnblogs.com/galaxy-gao/p/5796488 ...
- Django之路由、模板和模型系统 (转载)
一.路由系统 浏览器会自动给url后加一个“/” django会自动给路由的正则表达式前面加一个“/” django会给任何不带“/”结尾的url语句添加“/”(可设置) 短路路由规则:匹配到第一条就 ...
- webapp 的简单开发
web app 的技术平台很多,如adobe phonegap.sencha touch.appcan(国产).dcloud(国产)平台.我选择了dcloud平台,原因:简单,容易上手. web ap ...
- js-滚动到指定位置导航栏固定顶部
最近整理一下之前做的一个项目,把滚动条动态固定顶部的代码整理出来和大家分享,上代码 <!DOCTYPE html> <html> <head> <meta c ...