题目截图如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int* a = new int[n];
int* b = new int[n];
int* x = new int[m];
int* y = new int[m];
for (int i = 0;i < n;i++)
{
cin >> a[i] >> b[i];
}
for (int i = 0;i < m;i++)
{
cin >> x[i] >> y[i];
}
for (int i = 0;i < m;i++)
{
int lo=0, hi=n;
while (1 < hi-lo)
{
int mi = (hi + lo) >> 2;
long long int t;
t = (long long)b[mi] * (long long)x[i] + (long long)a[mi] * (long long)y[i] - (long long)a[mi] * (long long)b[mi];
if (t >= 0)
lo = mi + 1;
else
hi = mi;
}
long long int t;
t = (long long)b[lo] * (long long)x[i] + (long long)a[lo] * (long long)y[i] - (long long)a[lo] * (long long)b[lo];
if (t >= 0)
cout << lo + 1 << endl;
else
cout << lo << endl;
}
delete []a, b, x, y;
return 0;
}
没必要动态数组,你改用全局变量,int a[200000]这样,快点,最多空间应该用到0.76MB,没有超;每次动态数组申请浪费时间
试试这个:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main() {
int n, m;
scanf("%d%d", &n, &m);
int* a = new int[n];
int* b = new int[n];
int* x = new int[m];
int* y = new int[m];
for (int i = 0; i < n; i++) {
scanf("%d%d", &a[i], &b[i]);
}
for (int i = 0; i < m; i++) {
scanf("%d%d", &x[i], &y[i]);
}
for (int i = 0; i < m; i++) {
int lo = 0, hi = n;
while (1 < hi - lo) {
int mi = (hi + lo) >> 2;
long long int t;
t = (long long)b[mi] * (long long)x[i] + (long long)a[mi] * (long long)y[i] - (long long)a[mi] * (long long)b[mi];
if (t >= 0)
lo = mi + 1;
else
hi = mi;
}
long long int t;
t = (long long)b[lo] * (long long)x[i] + (long long)a[lo] * (long long)y[i] - (long long)a[lo] * (long long)b[lo];
if (t >= 0)
printf("%d\n", lo + 1);
else
printf("%d\n", lo);
}
return 0;
}
vector的,其实定义完之后一样当数组用的
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
int main() {
int n, m;
scanf("%d%d", &n, &m);
vector<int> a(n);
vector<int> b(n);
vector<int> x(m);
vector<int> y(m);
for (int i = 0; i < n; i++) {
scanf("%d%d", &a[i], &b[i]);
}
for (int i = 0; i < m; i++) {
scanf("%d%d", &x[i], &y[i]);
}
for (int i = 0; i < m; i++) {
int lo = 0, hi = n;
while (1 < hi - lo) {
int mi = (hi + lo) >> 2;
long long int t;
t = (long long)b[mi] * (long long)x[i] + (long long)a[mi] * (long long)y[i] - (long long)a[mi] * (long long)b[mi];
if (t >= 0)
lo = mi + 1;
else
hi = mi;
}
long long int t;
t = (long long)b[lo] * (long long)x[i] + (long long)a[lo] * (long long)y[i] - (long long)a[lo] * (long long)b[lo];
if (t >= 0)
printf("%d\n", lo + 1);
else
printf("%d\n", lo);
}
return 0;
}