蒟蒻在线求助 orz
  • 板块P1816 忠诚
  • 楼主_Nancy_
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/9 16:44
  • 上次更新2023/11/4 04:16:27
查看原帖
蒟蒻在线求助 orz
337131
_Nancy_楼主2021/10/9 16:44
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
#define R(x) x=read()
#define MAXN 100010
#define lc x<<1
#define rc x<<1|1
#define mid (l+r)/2
#define INF 0x3f3f3f3f
inline int read()
{
	int x,y;
	char c=getchar();
	x=0,y=1;
	while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*y;
}
struct node
{
	int sum;
	int add;
}tree[MAXN*4];
void pushup(int);
void pushdown(int,int,int);
int query(int,int,int,int,int);
void build(int,int,int);
void add(int,int,int,int,int,int);
int a[MAXN];
int b[MAXN]={0},tot=0;
int main()
{
	int n,m;
	R(n);R(m);
	for(int i=1;i<=n;i++) R(a[i]);
	build(1,1,n);
	int minn;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		R(x);R(y);
		minn=query(1,1,n,x,y);
		b[++tot]=minn;
	}
	for(int i=1;i<=tot;i++)
		cout<<b[i]<<' ';
	return 0;
}
void pushup(int x)
{
	tree[x].sum=tree[lc].sum+tree[rc].sum;
}
void pushdown(int x,int l,int r)
{
	tree[lc].add+=tree[x].add;
	tree[rc].add+=tree[x].add;
	tree[lc].sum+=tree[x].add*(mid-l+1);
	tree[rc].sum+=tree[x].add*(r-mid);
	tree[x].add=0; 
}
int query(int x,int l,int r,int from,int to)
{
	if(l>=from&&r<=to) return tree[x].sum;
	pushdown(x,l,r);
	int minn=INF;
	if(from<=mid) minn=min(minn,query(lc,l,mid,from,to));
	if(to>mid) minn=min(minn,query(rc,mid+1,r,from,to));
	return minn;
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		tree[x].sum=a[l];
		return;
	}
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(x);
}

样例最后一个跑不过

orz orz

2021/10/9 16:44
加载中...