2017 ACM-ICPC 北京网络赛 Minimum 线段树

本文解析了一道关于线段树的模版题目,详细介绍了如何使用线段树进行区间查询和单点更新,包括代码实现细节。通过具体实例展示了算法的应用过程。

描述

You are given a list of integers a0, a1, …, a2^k-1.

You need to support two types of queries:

1. Output Minx,y∈[l,r] {ax∙ay}.

2. Let ax=y.

输入

The first line is an integer T, indicating the number of test cases. (1≤T≤10).

For each test case:

The first line contains an integer k (0 ≤ k ≤ 17).

The following line contains 2k integers, a0, a1, …, a2^k-1 (-2k ≤ ai < 2k).

The next line contains a integer  (1 ≤ Q < 2k), indicating the number of queries. Then next Q lines, each line is one of:

1. 1 l r: Output Minx,y∈[l,r]{ax∙ay}. (0 ≤ l ≤ r < 2k)

2. 2 x y: Let ax=y. (0 ≤ x < 2k, -2k ≤ y < 2k)

输出

For each query 1, output a line contains an integer, indicating the answer.

样例输入

1
3
1 1 2 2 1 1 2 2
5
1 0 7
1 1 2
2 1 2
2 2 2
1 1 2

样例输出

1
1
4

一道线段树单点更新模版题,比赛的时候居然因为N定义小了WA,可是我明明放大了呀,摊手jpg。
  1 #include<iostream>
  2 #include<math.h>
  3 #include<algorithm>
  4 #define ll long long
  5 #define MAX_N 132000
  6 
  7 using namespace std;
  8 
  9 struct node
 10 {
 11     ll minn,maxx;
 12     int l,r;
 13 }num[MAX_N*4];
 14 int pp[MAX_N];
 15 void pushUp(int count)
 16 {
 17     num[count].minn = min(num[count<<1].minn,num[count<<1|1].minn);
 18     num[count].maxx = max(num[count<<1].maxx,num[count<<1|1].maxx);
 19 }
 20 void built_tree(int l,int r,int count)
 21 {
 22     num[count].l=l;
 23     num[count].r=r;
 24     if(l==r)
 25     {
 26         num[count].minn = pp[l];
 27         num[count].maxx = pp[l];
 28         return ;
 29     }
 30     int mid = (l+r)/2;
 31     built_tree(l, mid, count*2);
 32     built_tree(mid+1, r, count*2+1);
 33     pushUp(count);
 34 }
 35 ll query(int l,int r,int count,int flag)
 36 {
 37     if(num[count].l==l && num[count].r==r)
 38     {
 39         if(flag)
 40             return num[count].minn;
 41         else
 42             return num[count].maxx;
 43     }
 44     int mid = (num[count].l+num[count].r)/2;
 45     if(r<=mid)
 46         return query(l,r, count<<1,flag);
 47     else
 48         if(l>mid)
 49             return query(l, r, count<<1|1,flag);
 50         else
 51         {
 52             if(flag)
 53                 return  min(query(l, mid,count<<1,flag),query(mid+1, r, count<<1|1,flag));
 54             else
 55                 return  max(query(l, mid,count<<1,flag),query(mid+1, r, count<<1|1,flag));
 56         }
 57 }
 58 void update(int count,int pos,int val)
 59 {
 60     if(num[count].l==num[count].r)
 61     {
 62         num[count].minn=val;
 63         num[count].maxx=val;
 64         return ;
 65     }
 66     int mid = (num[count].l+num[count].r )/2;
 67     if(pos <= mid)
 68     {
 69         update(count<<1,pos,val);
 70     }
 71     else
 72         update(count<<1|1,pos,val);
 73     
 74     pushUp(count);
 75 }
 76 int main()
 77 {
 78     cin.sync_with_stdio(false);
 79     int t,n;
 80     cin>>t;
 81     while(t--)
 82     {
 83         cin>>n;
 84         n = pow(2,n);
 85         for(int i = 1; i <= n; i++)
 86             cin>>pp[i];
 87         
 88         built_tree(1, n, 1);
 89         
 90         int q,flag,l,r;
 91         cin>>q;
 92         for(int i = 1; i <= q; i++)
 93         {
 94             cin>>flag>>l>>r;
 95             if(flag==1)
 96             {
 97                 ll minn = query(l+1,r+1,1,1);
 98                 ll maxx = query(l+1,r+1,1,0);
 99                 if(maxx<0)
100                     cout<<maxx*maxx<<endl;
101                 else
102                 {
103                     if(minn<0)
104                         cout<<minn*maxx<<endl;
105                     else
106                         cout<<minn*minn<<endl;
107                 }
108             }
109             else
110             {
111                 update(1,l+1,r);
112             }
113         }
114     }
115     return 0;
116 }

 

转载于:https://www.cnblogs.com/Xycdada/p/7586054.html

源码来自:https://pan.quark.cn/s/fdd21a41d74f 正方教务管理系统成绩推送 简介 使用本项目前: 早晨睡醒看一遍教务系统、上厕所看一遍教务系统、刷牙看一遍教务系统、洗脸看一遍教务系统、吃早餐看一遍教务系统、吃午饭看一遍教务系统、睡午觉前看一遍教务系统、午觉醒来看一遍教务系统、出门前看一遍教务系统、吃晚饭看一遍教务系统、洗澡看一遍教务系统、睡觉之前看一遍教务系统 使用本项目后: 成绩更新后自动发通知到微信 以节省您宝贵的时间 测试环境 正方教务管理系统 版本 V8.0、V9.0 如果你的教务系统页面与下图所示的页面完全一致或几乎一致,则代表你可以使用本项目。 目前支持的功能 主要功能 每隔 30 分钟自动检测一次成绩是否有更新,若有更新,将通过微信推送及时通知用户。 相较于教务系统增加了哪些功能? 显示成绩提交时间,即成绩何时被录入教务系统。 显示成绩提交人姓名,即成绩由谁录入进教务系统。 成绩信息按时间降序排序,确保最新的成绩始终在最上方,提升用户查阅效率。 计算 计算百分制 对于没有分数仅有级别的成绩,例如”及格、良好、优秀“,可以强制显示数字分数。 显示未公布成绩的课程,即已选课但尚未出成绩的课程。 使用方法 Fork 本仓库 → 开启 工作流读写权限 → → → → → 添加 Secrets → → → → → → Name = Name,Secret = 例子 程序会自动填充 尾部的 ,因此你无需重复添加 对于部分教务系统,可能需要在 中添加 路径,如: 开启 Actions → → → 运行 程序 → → 若你的程序正常运行且未报错,那么在此之后,程序将会每隔 30 分钟自动检测一次成绩是否有更新 若你看不懂上述使用...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值