4.12日字节跳动笔试1,3,4题解,求一波第2题题解
1.
#include <iostream>
using namespace std;
const int maxn = 1000005;
int a[maxn],b[maxn],c[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
for(int i = 0; i < n; i++) scanf("%d",&b[i]);
for(int i = 0; i < n; i++) c[i] = b[i] - a[i];
int l = 0;
while(l < n && c[l] == 0) l++;
if(l == n)
{
printf("YES\n");
}
else
{
int r = l + 1;
while(r < n && c[r] != 0) r++;
bool flag = true;
for(int i = l; i < r - 1; i++)
{
if(c[i] != c[i + 1] || c[i] < 0)
{
flag = false;
break;
}
}
if(!flag)
{
printf("NO\n");
}
else
{
bool flag2 = true;
for(int i = r; i < n; i++)
{
if(c[i] != 0)
{
flag = false;
break;
}
}
if(!flag)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
}
}
return 0;
}
3. #include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000005;
typedef long long LL;
int a[maxn],b[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
for(int i = 0; i < m; i++) scanf("%d",&b[i]);
sort(a, a + n);
sort(b, b + m);
LL ans = 0;
for(int i = 0; i < m; i++)
{
int *p = lower_bound(a,a + n,b[i]);
if(!p) ans += (b[i] - a[n - 1]);
else
{
if(*p == b[i]) ans += 0;
else
{
if(p == a) ans += b[i];
else ans += (b[i] - *(p - 1));
}
}
}
printf("%lld\n",ans);
return 0;
}
4. #include <iostream>
using namespace std;
const int maxn = 100005;
int a[maxn];
int dpl[maxn],dpr[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
dpl[0] = 0;
for(int i = 1; i < n; i++)
{
if(a[i] >= a[i - 1])
{
int j = dpl[i - 1];
while(j - 1 >= 0 && a[i] >= a[j - 1])
{
j = dpl[j - 1];
}
dpl[i] = j;
}
else
{
dpl[i] = i;
}
}
dpr[n - 1] = n - 1;
for(int i = n - 2; i >= 0; i--)
{
if(a[i] >= a[i + 1])
{
int j = dpr[i + 1];
while(j + 1 < n && a[i] >= a[j + 1])
{
j = dpr[j + 1];
}
dpr[i] = j;
}
else
{
dpr[i] = i;
}
}
for(int i = 0; i < n; i++)
{
if(i == n - 1) printf("%d\n",dpr[i] - dpl[i]);
else printf("%d ",dpr[i] - dpl[i]);
}
}
return 0;
}


