【NOIP2012提高组】借教室

题面

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

4 3
2 5 4 3
2 1 3
3 2 4
4 2 4

Sample Output

-1
2

Hint

第一份订单满足后,4天剩余教室分数分别为0,3,2,3. 第二份订单要求第二天到第四天每天提供三个教室,而第三天剩余的教室数为二,因此无法满足。分配停止通知第二个申请人修改订单。
10% → \to 1<=n,m<=10
30% → \to 1<=n,m<=1000
70% → \to 1<=n,m<=100000
100% → \to 1<=n,m<=1000000, 0<=ri,dj<=1000000000, 1<=sj<=tj<=n

思路

我们可以用线段树维护一个最小值,每次进行一个区间修改区间查询操作,判断最小值是否小于0。结果TLE95……


As we all know,线段树常数不稳定
一些玄学优化:(每日一个卡常小技巧)

  1. register是个好东西,加在变量名前。
  2. define太low了,建议不要用。
  3. 把程序连交4次(针对gmoj优化)

Code

#include<cstdio>
#include<iostream>
#include<cmath>
#define N 1000005
#define rg register
using namespace std;
int n,m,a[N],v,x,y,tree[4*N],lazy[4*N];
void build(int k,int l,int r)
{
    
    
	if(l==r)
	{
    
    
		tree[k]=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	tree[k]=min(tree[k<<1],tree[k<<1|1]);
}
void add(rg int k,int v1)
{
    
    
	lazy[k]+=v1;
	tree[k]+=v1;
}
void pushdown(rg int k,int v1)
{
    
    
	add(k*2,v1);
	add(k*2+1,v1);
	lazy[k]=0;
}
void change(rg int k,rg int l,rg int r)
{
    
    
	if(l>=x&&r<=y) return add(k,v);
	if(lazy[k]!=0) pushdown(k,lazy[k]);
	int mid=l+r>>1;
	if(x<=mid) change(k<<1,l,mid);
	if(y>mid) change(k<<1|1,mid+1,r);
	tree[k]=min(tree[k<<1],tree[k<<1|1]);
}
int find(rg int k,rg int l,rg int r)
{
    
    
	if(l>=x&&r<=y) return tree[k];
	if(lazy[k]!=0) pushdown(k,lazy[k]);
	int mid=l+r>>1,ans=999999999;
	if(x<=mid) ans=min(ans,find(k<<1,l,mid));
	if(y>mid) ans=min(ans,find(k<<1|1,mid+1,r));
	tree[k]=min(tree[k<<1],tree[k<<1|1]);
	return ans;
}
int main()
{
    
    
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	build(1,1,n);
	for(rg int i=1;i<=m;i++)
	{
    
    
		scanf("%d%d%d",&v,&x,&y);
		v=-v;
		change(1,1,n);
		if(find(1,1,n)<0)
		{
    
    
			printf("-1\n%d",i);
			return 0;
		}
	}
	printf("0");
}

后记

下面的代码谨慎使用, 如果你不怕死的话

#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")

加在程序开头使用哦

  • 线段树
  • 卡常
  • AC

猜你喜欢

转载自blog.csdn.net/weixin_46830417/article/details/112687972