题面
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,线段树常数不稳定
一些玄学优化:(每日一个卡常小技巧)
- register是个好东西,加在变量名前。
- define太low了,建议不要用。
- 把程序连交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