备孕百度之星-9月21日

树状数组

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
int a[500005], b[500005]; 
int n, m, tag;

int ask(int x){
	int res = 0;
	for(; x; x -= x & -x) res += b[x];
	return res;
}

int add(int x, int y){
	for(; x <= n; x += x & -x) b[x] += y;
}

int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a[i];
	//b是累加的前缀和
	 
	for(int i = 0; i < m; i++){
		cin >> tag;
		if(tag == 1){
			int x, y, z;
			cin >> x >> y >> z;
			add(x, z);
			add(y+1, -z);
		}else{
			int index;
			cin >> index;
			int res = a[index] + ask(index);
			cout << res << endl;
		}
	}
}
 

线段树

#include<iostream>
#include<cstring>

using namespace std;
const int N = 500;
int a[N];
int n;

struct segt{
	int l, r;
	int dat;
}t[4 * N];

void build(int p, int l, int r){
	t[p].l = l;
	t[p].r = r;
	if(l == r) {
		t[p].dat = a[l];
		return ;//叶子节点 
	}
	int mid = l + (r-l)/2;
	build(2 * p, l, mid);
	build(2 * p + 1, mid + 1, r);
	t[p].dat = max(t[2*p].dat, t[2*p+1].dat);
}

void change(int p, int x, int v){
	if(t[p].l == t[p].r) {
		t[p].dat = v;
		return ;
	}
	int mid = t[p].l + (t[p].r - t[p].l) / 2;
	if(x <= mid)
		change(2*p, x, v);
	else
		change(2*p + 1, x, v);
	t[p].dat = max(t[2*p].dat, t[2*p+1].dat);
	
}

int ask(int p, int l, int r){
	if(l <= t[p].l && r >= t[p].r) {
		return t[p].dat;
	}
	int val = -(1<<30);
	//计算两种子节点的包含状态
	int mid = t[p].l + (t[p].r - t[p].l) / 2;
	if(l <= mid) val = max(val, ask(2*p, l, r));
	if(r > mid) val = max(val, ask(2*p+1, l, r)); 
	return val;
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	//构建树
	build(1, 1, n);
	for(int i = 0; i < 20; i++){
		cout << t[i].l << t[i].r << t[i].dat << endl;
	}
	//单点修改 
	change(1, 2, 5);//把2位置改成5 
	//区间查询
	int res = ask(1, l, r);//返回1-5位置的最大值 

}
 

线段树(ch4301)

#include<iostream>
#include<cstring>

using namespace std;
const int N = 50000;
int a[N];
int n;

struct segt{
	int l, r;
	int dat, sum, lmax, rmax;
}t[4 * N];

void build(int p, int l, int r){
	t[p].l = l;
	t[p].r = r;
	if(l == r) {
		t[p].sum = a[l];
		t[p].lmax = a[l];
		t[p].rmax = a[l];
		t[p].dat = a[l];
		return ;//叶子节点 
	}
	int mid = l + (r-l)/2;
	build(2 * p, l, mid);
	build(2 * p + 1, mid + 1, r);
	t[p].dat = max(max(t[2*p].dat, t[2*p+1].dat), t[2*p].rmax + t[2*p+1].lmax);
	t[p].sum = t[2*p].sum + t[2*p+1].sum;
	t[p].lmax = max(t[2*p].lmax, t[2*p].sum + t[2*p+1].lmax);
	t[p].rmax = max(t[2*p+1].rmax, t[2*p+1].sum + t[2*p].rmax);
}

void change(int p, int x, int v){
	if(t[p].l == t[p].r) {
	t[p].dat = v;
	t[p].sum = v;
	t[p].lmax = v;
	t[p].rmax = v;
		return ;
	}
	int mid = t[p].l + (t[p].r - t[p].l) / 2;
	if(x <= mid)
		change(2*p, x, v);
	else
		change(2*p + 1, x, v);
	t[p].dat = max(max(t[2*p].dat, t[2*p+1].dat), t[2*p].rmax + t[2*p+1].lmax);
	t[p].sum = t[2*p].sum + t[2*p+1].sum;
	t[p].lmax = max(t[2*p].lmax, t[2*p].sum + t[2*p+1].lmax);
	t[p].rmax = max(t[2*p+1].rmax, t[2*p+1].sum + t[2*p].rmax);
	
}

segt ask(int x, int y, int p, int l, int r){
    if(x<=l&&r<=y) return t[p];
    int mid=(l+r)>>1;
    if(y<=mid) return ask(x,y,2*p,l,mid);
    if(mid<x) return ask(x,y,2*p+1,mid+1,r);
    segt L=ask(x,mid,2*p,l,mid),R=ask(mid+1,y,2*p+1,mid+1,r),res;
    res.sum=L.sum+R.sum;
    res.lmax=max(L.lmax,L.sum+R.lmax);
    res.rmax=max(R.rmax,R.sum+L.rmax);
    res.dat=max(L.rmax+R.lmax,max(L.dat,R.dat));
    return res;
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	//构建树
	build(1, 1, n);
	int m;
	cin >> m;
	for(int i = 0; i < m ; i++){
		int tag, x, y;
		cin >> tag >> x >> y;
		if(tag == 0){
			change(1,x,y);
		}else{
			cout << ask(x,y, 1,1,n).dat << endl;
		}
	}
//	cout << "===" << endl;
//	for(int i = 0; i < 20; i++){
//		cout << t[i].l << "==" << t[i].r << "==" << t[i].dat << endl;
//	}
}
 
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:11
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务