P1198最大数——线段树点修改&&模板题

题目

题目链接

大意:维护一个数列,有两种操作:

  • 查询操作Q  L:查询当前数列中末尾L个数中的最大的数
  • 插入操作A  n:将n加上t再对D取模,将所得值插入数列末尾

解决方案

由题意知,只有两种操作:单点修改、区间查询

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long ll;
 5 const ll INF = (ll)1 << 60;
 6 const int maxn = 200000 + 10;
 7 ll maxv[maxn << 2];
 8 int n;
 9 ll mod;
10 
11 int ql, qr;    //查询[ql, qr]中的最小值
12 ll query(int o,int L,int R)
13 {
14     //printf("o:%d  L:%d  R:%d\n", o, L, R);
15     int M = L + (R - L) / 2;
16     ll ans = -INF;
17     if(ql <= L && R <= qr)  return maxv[o];
18     if(ql <= M)  ans = max(ans, query(2*o, L, M));
19     if(qr > M)  ans = max(ans, query(2*o+1, M+1, R));
20     return ans;
21 }
22 
23 ll P, v;  //修改A[p]=v
24 void update(int o, int L, int R)
25 {
26     int M = L + (R-L)/2;
27     if(L == R)  maxv[o] = v;  //更新叶子结点
28     else
29     {
30         if(P <= M)  update(2*o, L ,M);
31         else  update(2*o+1, M+1, R);
32         maxv[o] = max(maxv[2*o], maxv[2*o+1]);  //更新非叶子结点
33     }
34 }
35 
36 void print_debug(int o, int L, int R)
37 {
38     printf("o:%d  L:%d  R:%d  maxv:%lld\n", o, L, R,  maxv[o]);
39     if(R > L)
40     {
41         int M = L + (R - L) / 2;
42         print_debug(2*o, L, M);
43         print_debug(2*o+1, M+1, R);
44     }
45 }
46 
47 int main()
48 {
49     scanf("%d%lld", &n, &mod);
50     char order[3];
51     int cnt = 0;
52     ll val, t = 0;
53 
54     for(int i = 1;i <= (n <<2);i++)  maxv[i] = -INF;  //初始化
55 
56     for(int i = 0;i < n;i++)
57     {
58         scanf("%s", order);
59         if(order[0] == 'A')
60         {
61             scanf("%lld", &val);
62             P = ++cnt;
63             v = (val + t + mod) % mod;
64             update(1, 1, n);
65             //print_debug(1, 1, n);
66         }
67         else
68         {
69             int L;
70             //printf("cnt: %d\n", cnt);
71             scanf("%d", &L);
72             ql = cnt - L + 1; qr = cnt;
73             t = query(1, 1, n);
74             printf("%lld\n", t);
75             //print_debug(1, 1, n);
76         }
77     }
78 
79     return 0;
80 }

 

转载于:https://www.cnblogs.com/lfri/p/11144813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值