twopoint

利用两个指针,其中一个从前往后扫a数组,另一个从后往前扫b数组,用可能成为最大值的数来更新答案。
优化为o(n)

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
#include<cstdio>
#include<iostream>
using namespace std;
#define for(i,n) for(int i=1;i<=n;i++)
#define D "%d"
#define prf printf
#define scf scanf
int n;int max1=-999,m,s[1999],s2[1999];
int a[1999],b[1999],c[1999],d[1999];
int main()
{
scf(D D,&n,&m);
for(i,n)
scf(D,&a[i]);
for(i,n)
scf(D,&b[i]);
for(i,n)
{
scf(D,&c[i]);
s[i]=max(s[i-1],c[i]);
}
for(i,n)
{
scf(D,&d[i]);
s2[i]=max(s2[i-1],d[i]);
}
int t=n;
for(i,n)
{
while(a[i]+b[t]>m&&t>0)
t--;
if(t==0) break;
max1=max(max1,s[i]+s2[t]);
}
prf(D,max1);
}

最近的文章

k'th number

有n个数,共有2^n个子集,一个子集的值看做其所有数的和。求这2^n个子集中第K大的子集。n&lt;=35。首先我们可以通过meet in the middle的做法,将其分成两部分。二分答案后用two point统计满足条件的方案总数。与k进行比较即可。1234567891011121314151 …

于  折半搜索+twopoint+二分 继续阅读
更早的文章

lowbit

这个题先把它搞成二进制可以发现异或出来在lowbit找的是最后一位为一的数的价值,而异或出来只有两种情况,1或0,所以一开始把所有书分成两份,同分之间没有价值,只有异份之间有价值,且价值为2^t,就是最后一位不同的价值,找出同分异分之间有多少组合,就是多少个2^t一步一步分,最后直到不能分了像这样1 …

于  分治 继续阅读