真人推锅


真人推锅往左面看去,就能看到白塔的景致!往右面看去,就能把五亭桥尽收眼底!在吹台上玩了一会,又照了几张像。真人推锅你的眼眸中满是摄像头的味道
真人推锅爱自己
真人推锅老婆闺蜜她儿子3岁,每次去她家的时候她儿子特别亲我,他爸都不给抱,我去了又是亲又是抱,吃饭也让我喂,走的时候还不让走抱着我大腿,看孩子他爸脸色不好看以后都不好意思去她家了。跟老婆还没孩子,老婆看着觉得我跟她闺蜜是不是有事儿,卧槽,你闺蜜我都没见过几次,哪来的事儿啊!解释不清了。她闺蜜也在跟她老公解释孩子怎么回事儿呢!真人推锅你们怎么这么不听话呢?一张泉泠般的声音在飞亭耳畔响起,抬头看去,一个乌黑长发的女孩单膝跪在他的身旁,灵动的墨眸静静地看着他,一身黄纱被风吹起,隐隐还有一股淡淡的清香。她细长的眉轻轻蹙起,拜托你们不要乱动好不好?
真人推锅我这颗颠簸的心
真人推锅我的室友经常时不时的拿出身份证看,  我问她什么原因,她说:有时候觉得自己变丑了就拿出身份证,  于是发现自己多虑了。真人推锅心情短语【有些人,有些往事】有些人只是遇见,匆匆的行程里眼光的一次对视。不需言语,忽略情节。有些人会在心上驻留一些时间,带给彼此温暖。那是最美的一种际遇,留待余生去不断重复地去...[阅读全文]
真人推锅却没料到
真人推锅想到这二十几年来,我所感受到的这个大家庭的温暖,我真的很感恩!
真人推锅远岛笑流篙,单舞梦影独相思。痴?
真人推锅叶发一年年。
真人推锅两个有夫之妇在聊天  A:刚刚去报了个补习班,以后再也不用担心老公挑剔我做的饭不好吃了。  B:你可真行,做饭我教你不就行了吗?还用得着去上什么补习班呀!  A:我报的是跆拳道补习班!!!

皇冠足球比分

大发论坛时时彩平台尊龙娱乐是黑网吗海天国际娱乐城注册送钱凯发娱乐乐宝娱乐城真人赌钱亚美国际娱乐城 金龙国际 www.am8.com 亚洲城娱乐 老k国际娱乐城 666k8.com 金威国际娱乐城 名人国际娱乐城 ag娱乐平台 V博娱乐城 尊龙国际895959.com网站地图网络赌球网站地图盈彩国际娱乐网站地图东桃园娱乐城网站地图亚洲娱乐城网站地图http://tinyurl.com/qgbc7ja网站地图79手机版真钱捕鱼游戏注册送钱e8889.com网站地图皇冠真人娱乐城网站地图真钱游戏平台注册就送50元网站地图威斯汀国际娱乐城网站地图利来国际娱乐平台网站地图澳门赌场送彩金网站网站地图网上百家乐平台哪家返水高网站地图新全讯体验彩金网网站地图大金线上娱乐官网网站地图通宝娱乐网站地图888真人注册送钱e8889.com网站地图易发娱乐网站地图注册送白菜网站网站地图博彩巴厘岛娱网站地图乐天国际娱乐网站地图365bet注册送钱e8889.com网站地图ios棋牌游戏换现金网站地图爱博娱乐牌九博彩网站地图大发娱乐网站地图百嘉乐网站地图尤溪县国语学校网站地图ag88.ccom/网站地图加州娱乐城时讯网网站地图

【进阶树状数组】 区间求最值

上一篇讲的是区间求和,这一篇讲区间求最值。

首先,a[]数组仍然是保存原始数据。但是c[]数组变了,c[i]将会保存从a[1]a[i]的最值。

初始化c[]

当我们输入a[i]时,c[i]需要需要向前依次枚举被c[i]所包含的c[]数组。比如,当i == 8时,需要向前依次枚举c[7], c[6], c[4],取a[8]与这几个c[]中的最值保存在c[8]中。找到c[]的规律了没有?依次是i-1, i-2, i-4...

 1 void Init()
 2 {
 3     int  y;
 4     memset(c, 0, sizeof(c));
 5     for(int i = 1; i <= n; i++)
 6     {
 7         scanf("d", &y);
 8         a[i] = y;
 9         c[i] = y;
10         for(int j = 1; j <lowbit(i); j <<= 1)           //需要比较的c[]
11             c[i] = c[i] > c[i-j] ? c[i] : c[i-j];
12     }
13 }

可以看出,每输入一个a[i],处理c[i]的时间复杂度为log2(n),输入n个,初始化的时间复杂度就是n*log2(n)

 

修改c[]

我们改变了一个a[i],那么就需要修改所有与a[i],相关的c[]。修改每个的c[]的方法可以用上面初始化的方法,而需要修改的c[]可以用区间求和里的一段代码确定。

 

 1 void Maxn(int x, int y)
 2 {
 3     a[x] = y;
 4     for(int i = x; i <= n; i += lowbit(i))              //需要修改的c[]
 5     {
 6         c[i] = y;
 7         for(int j = 1; j < lowbit(i); j <<= 1)          //修改时需要比较的c[]
 8         {
 9             c[i] = c[i] > c[i-j] ? c[i] : c[i-j];
10         }
11     }
12 }

 

每次修改的时间复杂度近似为log2(n)*log2(n)

 

查询:

查询从a[i]a[j]之间的最值(i <= j)。我们不能直接查看c[j],因为也许c[j]中包含的区间[l, r]l < il > ic[j]不能恰好包含区间[i, j]

因此,当l < i时,我们就取a[j]与当前已经取到的最值比较,如果a[j]满足取代条件,就用a[j]取代当前最值。

l >= i,我们取c[j]与当前最值比较,如果c[j],满足取代条件,就用c[j]取代当前最值。

l == i时,比较结束。

 

 1 void Query(int l, int r)
 2 {
 3     int ans = 0;
 4     while(1)
 5     {
 6         ans = ans > a[r] ? ans : a[r];
 7         if(r == l) break;
 8         for(r -= 1; r-l >= lowbit(r); r -= lowbit(r))
 9             ans = ans > c[r] ? ans : c[r];
10     }
11     printf("d\n", ans);
12 }

 

时间复杂度近似为log2(n)

 

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N = 200010;
 8 
 9 int a[N], c[N];
10 int t, n, m;
11 
12 int lowbit(int x)
13 {
14     return x&(-x);
15 }
16 
17 void Maxn(int x, int y)
18 {
19     a[x] = y;
20     for(int i = x; i <= n; i += lowbit(i))              //需要修改的c[]
21     {
22         c[i] = y;
23         for(int j = 1; j < lowbit(i); j <<= 1)          //修改时需要比较的c[]
24         {
25             c[i] = c[i] > c[i-j] ? c[i] : c[i-j];
26         }
27     }
28 }
29 
30 void Init()
31 {
32     int  y;
33     memset(c, 0, sizeof(c));
34     for(int i = 1; i <= n; i++)
35     {
36         scanf("d", &y);
37         a[i] = y;
38         c[i] = y;
39         for(int j = 1; j <lowbit(i); j <<= 1)           //需要比较的c[]
40             c[i] = c[i] > c[i-j] ? c[i] : c[i-j];
41     }
42 }
43 
44 void Query(int l, int r)
45 {
46     int ans = 0;
47     while(1)
48     {
49         ans = ans > a[r] ? ans : a[r];
50         if(r == l) break;
51         for(r -= 1; r-l >= lowbit(r); r -= lowbit(r))
52             ans = ans > c[r] ? ans : c[r];
53     }
54     printf("d\n", ans);
55 }
56 
57 void Work()
58 {
59     char s[2];
60     int x, y;
61     for(int i = 1; i <= m; i++)
62     {
63         scanf("sdd", s, &x, &y);
64         if(s[0] == 'U') Maxn(x, y);
65         else if(s[0] == 'Q') Query(x, y);
66     }
67 }
68 
69 int main()
70 {
71     //freopen("test.in", "r", stdin);
72     while(~scanf("dd", &n, &m))
73     {
74         Init();
75         Work();
76     }
77 }
mod

 

树状数组区间求和——
http://www.cnblogs.com/mypride/p/5001858.html

 

posted @ 2015-11-28 13:28 mypride 阅读(...) 评论(...) 编辑 收藏