hud-5475 An easy problem(线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=5475
An easy problem
Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1146 Accepted Submission(s): 560
1. multiply X with a number.
2. divide X with a number which was multiplied before.
After each operation, please output the number X modulo M.
For each test case, the first line are two integers Q and M. Q is the number of operations and M is described above. (1≤Q≤105,1≤M≤109)
The next Q lines, each line starts with an integer x indicating the type of operation.
if x is 1, an integer y is given, indicating the number to multiply. (0<y≤109)
if x is 2, an integer n is given. The calculator will divide the number which is multiplied in the nth operation. (the nth operation must be a type 1 operation.)
It's guaranteed that in type 2 operation, there won't be two same n.
Then Q lines follow, each line please output an answer showed by the calculator.
10 1000000000
1 2
2 1
1 2
1 10
2 3
2 4
1 6
1 7
1 12
2 7
2
1
2
20
10
1
6
42
504
84
题意:
原数开始时是1按顺序给你Q个操作,然后其中操作分两种。
1表示将上个操作后的数乘以后面给你的数然后对取余,然后输出结果,2表示除的操作,将现在的数除以指定的先前你所乘上的第几个数
然后对M取模。
思路:
这题用线段树写,断点更新,复杂度是n*(log(n));
代码:
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<stdlib.h>
6 typedef long long LL;
7 void up(LL k,LL l);
8 void build(LL l,LL r,LL k);
9 LL que(LL l,LL r,LL k,LL aa,LL dd);
10 typedef struct pp
11 {
12 LL x;
13 LL y;
14 LL id;
15 LL t;
16 } ss;
17 typedef struct tree1
18 {
19 LL x;
20 LL y;
21 LL id;
22 LL cou;
23 } sd;
24 LL M,N;
25 ss cnt[100005];
26 int flag[4*100005];
27 sd tree[4*100005];
28 using namespace std;
29 int main(void)
30 {
31 LL n,i,j,k,p,q;
32 scanf("%lld",&n);
33 for(i=1; i<=n; i++)
34 {
35 scanf("%lld %lld",&N,&M);
36 memset(tree,0,sizeof(tree));
37 for(j=1; j<=N; j++)
38 {
39 scanf("%lld %lld",&cnt[j].x,&cnt[j].y);
40 cnt[j].id=j;
41 if(cnt[j].x==1)
42 {
43 cnt[j].t=cnt[j].y;//操作1时所要乘的数。
44 }
45 else cnt[j].t=1;//操作2时乘的数等价为1;
46 }
47 build(1,N,0);//建树(因为每步操作都有对应的操作,所以将操作2也放入一起操所,等价为所要乘的数为1)
48 printf("Case #%lld:\n",i);
49 for(j=1; j<=N; j++)
50 {
51 if(cnt[j].x==1)
52 {
53 LL dd=que(1,j,0,1,N);//当1时询问找点
54 printf("%lld\n",dd);
55 }
56 else if(cnt[j].x==2)
57 {
58 up(flag[cnt[j].y],j);//当2时断点更新
59 LL dd=que(1,j,0,1,N);//询问找点
60 printf("%lld\n",dd);
61 }
62 }
63 }
64 return 0;
65 }
66 void build(LL l,LL r,LL k)//建树
67 {
68 tree[k].x=l;
69 tree[k].y=r;
70 if(l==r)
71 {
72 tree[k].cou=cnt[l].t%M;
73 flag[l]=k;
74 return;
75 }
76 else
77 {
78 build(l,(l+r)/2,2*k+1);
79 build((l+r)/2+1,r,2*k+2);
80 tree[k].cou=(tree[2*k+1].cou*tree[2*k+2].cou)%M;
81 }
82 }
83 void up(LL k,LL l)//断点更新
84 {
85 tree[k].cou=1;//要删除的点处就相当于乘
86 k=(k-1)/2;
87 while(k>=0)//向上更新到根结点
88 {
89 tree[k].cou=(tree[2*k+1].cou*tree[2*k+2].cou)%M;
90 if(k==0)
91 {
92 break;
93 }
94 k=(k-1)/2;
95 }
96 }
97 LL que(LL l,LL r,LL k,LL aa,LL dd)//询问
98 {
99 if(l>dd||r<aa)
100 {
101 return 1;
102 }
103 else if(l<=aa&&r>=dd)
104 {
105 return tree[k].cou;
106 }
107 else
108 {
109 LL nx=que(l,r,2*k+1,aa,(aa+dd)/2);
110 LL ny=que(l,r,2*k+2,(aa+dd)/2+1,dd);
111 return (nx*ny)%M;
112 }
113
114 }
hud-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 ...
- POJ 2826 An Easy Problem?![线段]
An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12970 Accepted: 199 ...
- Codeforces 803G Periodic RMQ Problem 线段树
Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...
- Codeforces 903G Yet Another Maxflow Problem - 线段树
题目传送门 传送门I 传送门II 传送门III 题目大意 给定一个网络.网络分为$A$,$B$两个部分,每边各有$n$个点.对于$A_{i} \ (1\leqslant i < n)$会向$A_ ...
- bzoj 3489 A simple rmq problem - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
- spoj IITWPC4F - Gopu and the Grid Problem 线段树
IITWPC4F - Gopu and the Grid Problem no tags Gopu is interested in the integer co-ordinates of the ...
- 【CF903G】Yet Another Maxflow Problem 线段树
[CF903G]Yet Another Maxflow Problem 题意:一张图分为两部分,左边有n个点A,右边有m个点B,所有Ai->Ai+1有边,所有Bi->Bi+1有边,某些Ai ...
随机推荐
- 前端2 — CSS — 更新完毕
1.CSS是什么? 指:Cascading Style Sheet --- 层叠样式表 CSS 即:美化网页( 在HTML不是说过W3C规定网页为三种标准嘛,结构层HTML已经玩了,而这个CSS就是 ...
- day17 阶段测验
题目 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 有以下几种方法: [root@localhost ~]# grep -iE "^s" /pro ...
- Flink(三)【核心编程】
目录 一.Environment 二.Source 从集合读取数据 从文件读取数据 从kakfa读取数据(常用) 自定义数据源 三.Transform map Rich版本函数 flatMap key ...
- 零基础学习java------35---------删除一个商品案例,删除多个商品,编辑(修改商品信息),校验用户名是否已经注册(ajax)
一. 删除一个商品案例 将要操作的表格 思路图 前端代码 <%@ page language="java" contentType="text/html; cha ...
- 重磅丨腾讯云开源业界首个 etcd 一站式治理平台 Kstone
Kstone 开源 在 CNCF 云原生基金会举办的2021年12月9日 KubeCon China大会上,腾讯云容器 TKE 团队发布了 Kstone etcd 治理平台开源项目. Kstone ...
- vue开发多页面应用 - hash模式和history模式
我们知道vue可以快速开发web单页应用,而且官方为我们提供了自己的应用脚手架vue-cli,我们只需要下载脚手架,安装依赖后就可以启动vue应用雏形. 这得益与webpack的依赖追踪,各种资源后缀 ...
- 案例 stm32单片机,adc的双通道+dma 内部温度
可以这样理解 先配置adc :有几个通道就配置几个通道. 然后配置dma,dma是针对adc的,而不是针对通道的. 一开始我以为一个adc通道对应一个dma通道.(这里是错的,其实是我想复杂了) 一个 ...
- 【Linux】【Basis】网络
Linux网络属性配置 计算机网络: TCP/IP:协议栈(使用) ISO,OSI:协议栈(学习) ...
- 基于阿里云ecs(centos 7) 安装jenkins
1. 安装好 jdk 2. 官网(https://pkg.jenkins.io/redhat-stable/)下载rpm包(稳定版): wget https://pkg.jenkins.io/redh ...
- Markdown随时记录
Markdown学习 推荐文本编译器 Typora 标题(支持六级) 一级标题:# + 空格 + 内容 二级标题:## + 空格 + 内容 三级标题:### + 空格 + 内容 . . . 字体 粗体 ...