WA #10 line 6 column 11 求调
查看原帖
WA #10 line 6 column 11 求调
1296826
lcfollower楼主2024/11/2 15:43

赛时好像调过但是我忘了是什么错误了。

# include <bits/stdc++.h>

# define int long long
# define inf 1e15

using namespace std;

const int N = 1e5 + 10;
int n , m, l ,V ,cnt ,d[N] ,v[N] ,a[N] ,p[N];
bool f[N];

struct node {int l ,r;}segment[N];

inline void solve0 (int i){
  if (d[i] > p[m] || v[i] <= V) return;
  int l = 1 ,r = m ,res = -114;
  while (l <= r){
    int mid = ((l + r) >> 1ll);
    if (p[mid] > d[i] - 1) r = mid - 1 ,res = mid;//找到第一个>= d[i] (> d[i] - 1) 的数的位置。
    else l = mid + 1;
  }
   segment[++ cnt].l = res ,segment[cnt].r = m;
} inline void solve1 (int i){
  if (d[i] > p[m]) return ;
  int l = 1 ,r = m , t = V * V - v[i] * v[i] ,res = -114;
// (V * V - v[i] * v[i]) / 2 / a[i] + d[i] < (找到一个合法的 k 且最小) p[k] 
// t + d[i] * 2 * a[i] < p[k] * 2 * a[i] 
  while (l <= r){
    int mid = ((l + r) >> 1ll);
    if (t + d[i] * 2ll * a[i] < p[mid] * 2ll * a[i]) r = mid - 1 ,res = mid;
    else l = mid + 1;
  } 
  if (res <= m && res != -114) segment[++ cnt].l = res ,segment[cnt].r = m;
} inline void solve2 (int i){
  if (d[i] > p[m] || v[i] <= V) return;
  int l = 1 ,r = m ,t = V * V - v[i] * v[i] ,res = -114 ,pos = -114;
  //t = -t ,a[i] = -a[i];
  while (l <= r){
    int mid = ((l + r) >> 1ll);
    if (p[mid] > d[i] - 1) r = mid - 1 ,pos = mid;
    else l = mid + 1;
  } 
  l = pos ,r = m;
//  cout << a[i] << ' ';
//  for (int j = 1; j <= m ;j ++)cout << p[j] * 2 * a[i] << ' ';
//  cout << "    const: " << t + d[i] * 2ll * a[i] << endl;
  while (l <= r){
    int mid = ((l + r) >> 1ll);
    double vi = v[i] * v[i] * 1.0 + 2.0 * a[i] * (p[mid] - d[i]);
	if (vi > V * V) l = mid + 1 ,res = mid;
	else r = mid - 1 ;
  }
//   cout << "pos and res is : " << pos << ' ' << res << endl;
  if (res <= m && res != -114) segment[++ cnt].l = pos ,segment[cnt].r = res;
} inline void solve3 (){
  sort (segment + 1, segment + 1 + cnt ,[](node &x ,node &y){return (x.l == y.l ? x.r > y.r : x.l < y.l);});
  int NR = inf;
  for (int i = 1 ;i <= cnt ;i ++) f[i] = 0;
//  for (int i = 1 ;i <= cnt; i ++)
//    cout << segment[i].l << ' ' << segment[i].r << endl;
  for (int i = cnt ;i >= 1; i --){
  	if (NR <= segment[i].r) f[i] = 1;
	NR = min (NR ,segment[i].r);
  } int ans = 0 ,NL = 0;
  for (int i = 1;i <= cnt ;i ++){
  	if (f[i]){
  	  f[i] = 0;
  	  continue;
	} if (NL < segment[i].l){
	  NL = segment[i].r;
	  ++ ans;
	}
  } cout << m - ans << endl;
} inline void solve (){
  cin >> n >> m >> l >> V;
  cnt = 0;

  for (int i = 1; i <= n; i ++) cin >> d[i] >> v[i] >> a[i];

  for (int i = 1; i <= m; i ++) cin >> p[i];

  for (int i = 1 ;i <= n ; i ++){
    if (!a[i]) solve0 (i);
    else if (a[i] > 0) solve1 (i);
    else solve2 (i);
  } cout << cnt << ' ';
  solve3 ();
} signed main (){
  int T;
  cin >> T;
  while (T --) solve ();
  return 0;
}
2024/11/2 15:43
加载中...