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 }
时间: 2024-11-09 02:18:39

2017 ACM-ICPC 北京网络赛 Minimum 线段树的相关文章

HDU 5875 Function (2016年大连网络赛 H 线段树+gcd)

很简单的一个题的,结果后台数据有误,自己又太傻卡了3个小时... 题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对数字b取模时:如果a<b,则等于原数,否则a会变小至少一半.就是说a最多成功取模(log2 a)次,所以我们只需要每次在区间内找到最前面一个小于等于a的值,接着更新a与区间左端点,直到没有值比a小或者区间取模完成. 我们可以使用线段树求出区间内小于某个值的最前一个位置,具体方法就是:父节点记录区间最

hdu5023 ( 广州网络赛 ) 线段树

题意是给你n个连续的点(1-n) m次操作  开始每个点都为2 两种操作 1:把一段区间的点变为c 2:询问区间有多少种点 很明显的线段树      对每个节点 flash表示该节点是否全为一样的数  若是  则flash=这个数否则  flash=-1: 数组color记录该节点输得状态    1表示有0表示没有(我开成字符型  之前为int超类存了   真是无语) 然后  有更新和查询操作 #include<stdio.h> #include<string.h> #includ

19徐州网络赛E 线段树加离散化

题目链接:https://www.jisuanke.com/contest/3005/267806 按wi的值建立权值线段树维护值为wi出现的最后位置,对于第i个人的答案,查询线段树[wi+m,max]区间的最大位置pos,令如果pos-i-1小于等于-1则是在i之后不存在大于等于wi+m的人,否则第i个人的答案即为pos-i-1.由于wi范围过大所以需对wi离散化 #include<iostream> #include<cmath> #include<algorithm&g

2017 ACM/ICPC(北京)总结

这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂时放弃去做计算几何题目,很庆幸计算几何的题目并不算很难(求二分+两圆相交面积)很快1A,A掉后便继续去做难道搜索题,因为我感觉自己的状态比较差,便让队友去敲,队友实现代码后因为对题意的理解有误,WA了几发之后才过掉,之后的题目是一道网络流,因为中间耽误了一段时间,继续敲网络流时间可能不够,所以我们队

2017 ACM/ICPC 北京赛区小结 By JSB @ Reconquista

之前的蜜汁格式等待拷贝lsmll学长. Day -2 出发前晚上还训了一场.C题是个MST规律题,我傻乎乎地写了个状压,快写完才发现复杂度爆炸了:颜学长有一题似乎被卡常数了?然后就日常被二队虐了两个题.>_< Day -1 早上4:20起床,和John.lzw学长一起打车去机场. 在飞机上,风学长悉心指导我如何优雅地向空姐要四杯饮料>< 之前听说川航的空餐很不错,终于尝到了呢! 在翔景轩酒店安顿好后,大家就迫不及待地去必胜客.吃饱后我还强行往嘴里塞披萨--学生打八折,大家都吃得挺欢

acm 2015北京网络赛 F Couple Trees 主席树+树链剖分

提交 题意:给了两棵树,他们的跟都是1,然后询问,u,v 表 示在第一棵树上在u点往根节点走 , 第二棵树在v点往根节点走,然后求他们能到达的最早的那个共同的点 解: 我们将第一棵树进行书链剖,然后第二棵树采用主席树,他的信息来自他的父亲节点,每个点存他在第一棵树 树链剖分后的位置,这样我们每次查询uv的时候我们只要 我们选取u和top[u]这段区间在主席树v这颗树上找,在这个区间能取到的最大值,一旦存在,这个最大值就我们要的,这个点保存着他到根节点这条路上所有点在第一棵树剖分后的位置 #inc

2017年icpc西安网络赛 Maximum Flow (找规律+数位dp)

题目 https://nanti.jisuanke.com/t/17118 题意 有n个点0,1,2...n-1,对于一个点对(i,j)满足i<j,那么连一条边,边权为i xor j,求0到n-1的最大流,结果取模,n<=1e18 分析 可以写个最大流对数据找规律,但没找出来…… 然后只能取分析了,首先最大流等价于最小割 明确一定,0->n-1这个要先割掉 然后我们贪心,希望有一些点割掉与0相连的边,一些点割掉与n-1相连的边 我们去观察每个点与0相连和与n-1相连的两条边权值,容易发现

hdu 4046 2011北京赛区网络赛G 线段树 ***

还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w 1 #include<cstdio> 2 #include<cstring> 3 #define lson l,m,rt<<1 4 #define rson m+1,r,rt<<1|1 5 using namespace std; 6 const int maxn=50010; 7 int n,m,sum[maxn<<2]; 8 char str[ma

2013 ACM/ICPC 长沙现场赛 A题 - Alice&#39;s Print Service (ZOJ 3726)

Alice's Print Service Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using her print service found some tricks to save money. For example, the price when