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

Problem Description
One day, a useless calculator was being built by Kuros. Let's assume that number X is showed on the screen of calculator. At first, X = 1. This calculator only supports two types of operation.
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.
 
Input
The first line is an integer T(1≤T≤10), indicating the number of test cases.
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.
 
Output
For each test case, the first line, please output "Case #x:" and x is the id of the test cases starting from 1.
Then Q lines follow, each line please output an answer showed by the calculator.
 
Sample Input
1
10 1000000000
1 2
2 1
1 2
1 10
2 3
2 4
1 6
1 7
1 12
2 7
 
Sample Output
Case #1:
2
1
2
20
10
1
6
42
504
84
 
Source
 
Recommend
hujie
 

题意:

原数开始时是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(线段树)的更多相关文章

  1. HDU 5475 An easy problem 线段树

    An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  2. 2015上海网络赛 HDU 5475 An easy problem 线段树

    题意就不说了 思路:线段树,维护区间乘积.2操作就将要除的点更新为1. #include<iostream> #include<cstdio> #include<cstr ...

  3. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

  4. POJ 2826 An Easy Problem?![线段]

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12970   Accepted: 199 ...

  5. Codeforces 803G Periodic RMQ Problem 线段树

    Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...

  6. Codeforces 903G Yet Another Maxflow Problem - 线段树

    题目传送门 传送门I 传送门II 传送门III 题目大意 给定一个网络.网络分为$A$,$B$两个部分,每边各有$n$个点.对于$A_{i} \ (1\leqslant i < n)$会向$A_ ...

  7. bzoj 3489 A simple rmq problem - 线段树

    Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...

  8. 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 ...

  9. 【CF903G】Yet Another Maxflow Problem 线段树

    [CF903G]Yet Another Maxflow Problem 题意:一张图分为两部分,左边有n个点A,右边有m个点B,所有Ai->Ai+1有边,所有Bi->Bi+1有边,某些Ai ...

随机推荐

  1. LeetCode 从头到尾打印链表

    LeetCode 从头到尾打印链表 题目描述 输入一个链表头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 一得之见(Jav ...

  2. accommodate ~ ache

    accommodate The accommodation reflex [反射] (or accommodation-convergence [会聚] reflex) is a reflex act ...

  3. 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户

    1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...

  4. 容器之分类与各种测试(三)——list部分用法

    list是一个双向链表 例程 #include<stdexcept> #include<memory.h> #include<string> #include< ...

  5. Git命令行演练-团队开发

    ** 团队开发必须有一个共享库,这样成员之间才可以进行协作开发** ### 0. 共享库分类    > 本地共享库(只能在本地面对面操作)        - 电脑文件夹/U盘/移动硬盘    & ...

  6. VScode 使用 CMake 入门

    参考 CMake 入门实战 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . 执行命令 cmake PA ...

  7. 【Python】【Module】os

    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curd ...

  8. SpringBoot项目找不到主类或无法加载主类

    问题描述 启动springboot项目的时候发现启动失败,查看日志发现因为找不到主类或无法加载主类. 解决 我这个项目是拉取的别人git上的项目,看了一下目录结构发现没有编译后的文件(target目录 ...

  9. 使用JSP实现输出

    一.在JSP页面添加java代码,实现输出,java代码写在<% %>中. 代码示例1: <body> <!-- HTML注释 --> <%-- JSP注释 ...

  10. Nginx模块之stub_status

    目录 一.介绍 二.使用 三.参数 一.介绍 Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 当前默认在nginx的源码文件中,不需要单独下载 二.使用 本模块默认是不 ...