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 ...
随机推荐
- 【系统硬件】英伟达安培卡 vs 老推理卡硬件参数对比
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 本文分享一下英伟达安培卡 vs 老推理 ...
- 巩固javaweb第八天
巩固内容: HTML 段落 HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p& ...
- LVM磁盘创建与扩容
以虚拟机为例 1.在虚拟机上添加新磁盘,点击虚拟机→设置->添加,最后如下图. 2.进入系统fdisk -l,查看当前磁盘信息 [root@master shell]# fdisk -l Dis ...
- 隐藏状态栏后tableview自动上移20个像素的问题
最近在开发过程中碰到一个很奇怪的问题,将状态栏隐藏掉之后,页面上的tableView会自动上移20个像素. 这是因为在iOS7.0之后,系统会自动调整scrollView的layout 和 conte ...
- redis入门到精通系列(二):redis操作的两个实践案例
在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string).列表类型(list).散列类型(hash).集合类型(set).有序集合类型(so ...
- Linux基础命令---get获取ftp文件
get 使用lftp登录ftp服务器之后,可以使用get指令从服务器获取文件. 1.语法 get [-E] [-a] [-c] [-O base] rfile [-o lfil ...
- 使用NSURLSessionDownloadTask实现大文件下载-监听下载进度
- 5.1 涉及知识点(1)创建NSURLSession并设置代理,通过NSURLSessionDownloadTask并以代理的方式来完成大文件的下载 //1.创建NSURLSession,设置代理 ...
- 【Python】【Module】json and pickle
Python中用于序列化的两个模块 json 用于[字符串]和 [python基本数据类型] 间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进 ...
- Spring Boot,Spring Cloud,Spring Cloud Alibaba 版本选择说明以及整理归纳
前言 本文的核心目的: 1.方便自己以后的查找,预览,参考 2.帮助那些不知道如何选择版本的朋友进行指引,而不是一味的跟风网上的版本,照抄. Spring Boot 版本 版本查询: https:// ...
- RocketMQ应用及原理剖析
主流消息队列选型对比分析 基础项对比 可用性.可靠性对比 功能性对比 对比分析 Kafka:系统间的流数据通道 RocketMQ:高性能的可靠消息传输 RabbitMQ:可靠消息传输 RocketMQ ...