线段树代码求调
  • 板块学术版
  • 楼主AsoltA
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/21 17:30
  • 上次更新2023/10/27 14:17:53
查看原帖
线段树代码求调
475419
AsoltA楼主2022/8/21 17:30

这是我的代码:

#include<iostream>
#include<cstdio>
#define INF 999999999
using namespace std;
const int maxn=200005;
int c,s,r;
struct wk{int a,b,lazy,minn;} tree[4*maxn];
void bd(int p,int x,int y)
{
	tree[p].a=x;tree[p].b=y;
	tree[p].minn=s;
	if(x<y)
	{
		int mid=(x+y)>>1;
		bd(p<<1,x,mid);
		bd(p<<1|1,mid+1,y);
	}
}
void putdown(int r)
{
	tree[r<<1].minn-=tree[r].lazy;
	tree[r<<1].lazy+=tree[r].lazy;
	tree[r<<1|1].minn-=tree[r].lazy;
	tree[r<<1|1].lazy+=tree[r].lazy;
	tree[r].lazy=0;
}
int getnum(int r,int x,int y)
{
	if(tree[r].lazy) printf("aqaaaa\n"),putdown(r);
	if(x<=tree[r].a&&tree[r].b<=y)return tree[r].minn;
	int ls=INF,lz=INF,mid=(tree[r].a+tree[r].b)>>1;
	if(mid>=x) ls=getnum(r<<1,x,y);
	if(y>mid) ls=getnum(r<<1|1,x,y);
	return printf("%d\n",min(ls,lz)),min(ls,lz);
} 
void add(int r,int x,int y,int z)
{
	if(tree[r].lazy)putdown(r);
	if(x<=tree[r].a&&tree[r].b<=y)
	{
		tree[r].minn-=z;
		tree[r].lazy+=z;
		return;
	}
	int mid=(tree[r].a+tree[r].b)>>1;
	if(mid>=x) add(r<<1,x,y,z);
	if(mid<y) add(r<<1|1,x,y,z);
	tree[r].minn=min(tree[r<<1].minn,tree[r<<1|1].minn);
}
int main()
{
	scanf("%d%d%d",&c,&s,&r);
	bd(1,1,c);
	for(int i=1;i<=r;i++)
	{
		int xx,yy,zz;
		cin>>xx>>yy>>zz;
		yy--;
		int vd=getnum(1,xx,yy);
		printf("%d\n",vd);
		if(zz<=vd)
		{
			printf("T\n");
			add(1,xx,yy,zz);
		}
		else printf("N\n");
	}
	return 0;
}

这是题解的:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
#define maxn 480000
#define inf 999999999
struct node{
  int l,r,n,lazy;   
};
node tree[maxn];
int c,s,r;
void bt(int p,int x,int y)
{
    tree[p].l=x;tree[p].r=y;
    tree[p].n=s;
    if(x<y)
    {
        int mid=(x+y)>>1;
        bt(p<<1,x,mid);
        bt(p<<1|1,mid+1,y);
    }
}
void pd(int k)
{
    tree[k<<1].n-=tree[k].lazy;
    tree[k<<1].lazy+=tree[k].lazy;;
    tree[k<<1|1].n-=tree[k].lazy;
    tree[k<<1|1].lazy+=tree[k].lazy;
    tree[k].lazy=0;
}
int query(int k,int x,int y)
{
    if(tree[k].lazy) printf("aqaaaa\n"),pd(k);
    if(x<=tree[k].l&&tree[k].r<=y) return tree[k].n;
    int lm=inf,rm=inf,mid=(tree[k].l+tree[k].r)>>1;
    if(mid>=x) lm=query(k<<1,x,y);
    if(y>mid) rm=query(k<<1|1,x,y);
    return printf("%d\n",min(lm,rm)),min(lm,rm);
}
void change(int k,int x,int y,int z)
{
    if(tree[k].lazy) pd(k);
    if(x<=tree[k].l&&tree[k].r<=y)
    {
        tree[k].n-=z;
        tree[k].lazy+=z;
        return;
    }
    int mid=(tree[k].l+tree[k].r)>>1;
    if(mid>=x) change(k<<1,x,y,z);
    if(mid<y) change(k<<1|1,x,y,z);
    tree[k].n=min(tree[k<<1].n,tree[k<<1|1].n);
}
int main()
{
    scanf("%d%d%d",&c,&s,&r);
    bt(1,1,c);
    int i;
    for(i=1;i<=r;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        y--;
        int temp=query(1,x,y);
        printf("%d\n",temp);
        if(z<=temp){
            cout<<"T"<<endl;
            change(1,x,y,z);
        }
        else cout<<"N"<<endl;
    }
}

(请忽略其中的调试语句)

2022/8/21 17:30
加载中...