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. Unity——Js和Unity互相调用

    Unity项目可以打包成WebGl,打包后的项目文件: Build中是打包后的Js代码: Index.html是web项目的入口,里面可以调整web的自适应,也可以拿去嵌套: TemplateData ...

  2. 日常Java 2021/9/19

    Math类方法 package m; public class m { public static void main(String args[]) { //计算平方根 System.out.prin ...

  3. acute

    In Euclidean geometry, an angle is the figure formed by two rays, called the sides of the angle, sha ...

  4. day04 sersync实时同步和ssh服务

    day04 sersync实时同步和ssh服务 sersync实时同步 1.什么是实时同步 实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器. 2.为什么使 ...

  5. doy05循环语法学习笔记

    doy05循环语法学习笔记 一.while循环语法: 1.基本用法示例 x = 1 while x <= 5: print(x) x += 1 2.死循环:永远不结束的循环 如:while Tr ...

  6. 大数据学习day34---spark14------1 redis的事务(pipeline)测试 ,2. 利用redis的pipeline实现数据统计的exactlyonce ,3 SparkStreaming中数据写入Hbase实现ExactlyOnce, 4.Spark StandAlone的执行模式,5 spark on yarn

    1 redis的事务(pipeline)测试 Redis本身对数据进行操作,单条命令是原子性的,但事务不保证原子性,且没有回滚.事务中任何命令执行失败,其余的命令仍会被执行,将Redis的多个操作放到 ...

  7. Java Swing布局管理器GridBagLayout的使用示例 [转]

    GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的, GridBagLayout 类是一个灵活的布局管理器,它不要求 ...

  8. SpringMVC responseBody注解分析

    @responsebody表示该方法的返回结果直接写入HTTP response body中一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@respo ...

  9. Classs类

    Classs类如何获得 获得Class对象 方式一: 通过Object类中的getClass()方法 方式二: 通过 类名.class 获取到字节码文件对象( 方式三: 通过Class类中的方法(将类 ...

  10. Linux服务加入systemctl|service管理

    一.加入systemctl 1.添加 vim /usr/lib/systemd/system/user_timejob.service # copy to /usr/lib/systemd/syste ...