luogu p4085 [usaco17dec]haybale feast

尺取法+线段树

(你甚至可以前缀和、单调队列、st表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

#include<algorithm>
#include<cstring>
using namespace std;
namespace io{
#define re register
#define ll long long
#define inf 0x3f3f3f3f
#define il inline
#define in1(a) read(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)
il void (ll &x){
x=0;ll f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=f;
}
il void read(int &x){
x=0;int f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=f;
}
}using namespace io;
#define N 100005
#define ls p<<1
#define rs p<<1|1
int n;
ll m;
int a[N],b[N],tree[N<<2];
il void up(int p){
tree[p]=max(tree[ls],tree[rs]);
}
void build(int p,int l,int r){
if(l==r){
tree[p]=b[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
up(p);
}
int query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tree[p];
int res=0,mid=(l+r)>>1;
if(ql<=mid) res=max(res,query(ls,l,mid,ql,qr));
if(qr>mid) res=max(res,query(rs,mid+1,r,ql,qr));
return res;
}
int main(){
read(n);
readl(m);
for(re int i=1;i<=n;i++) in2(a[i],b[i]);
build(1,1,n);
int ans=inf;
ll sum=0;
for(re int i=1,j=0;i<=n&&j<=n;i++){
while(sum<m&&j<n){
j++;
sum+=a[j];
}
if(sum<m) break;
ans=min(ans,query(1,1,n,i,j));
sum-=a[i];
}
printf("%d",ans);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

#include<algorithm>
#include<cstring>
using namespace std;
namespace io{
#define re register
#define ll long long
#define inf 0x3f3f3f3f
#define il inline
#define in1(a) read(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)
il void (ll &x){
x=0;ll f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=f;
}
il void read(int &x){
x=0;int f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=f;
}
}using namespace io;
#define N 100005
int n;
ll m;
int a[N],b[N],q[N];
int main(){
read(n);
readl(m);
for(re int i=1;i<=n;i++) in2(a[i],b[i]);
int ans=inf,head=1,tail=0;
ll sum=0;
for(re int i=1,j=0;i<=n&&j<=n;i++){
while(sum<m&&j<n){
j++;
sum+=a[j];
while(head<=tail&&b[q[tail]]<=b[j]) tail--;
q[++tail]=j;
}
if(sum<m) break;
if(q[head]<i) head++;
ans=min(ans,b[q[head]]);
sum-=a[i];
}
printf("%d",ans);
return 0;
}