您当前所在位置:主页 > 赛考新闻 > 2024CSP-J题解 >

2024CSP-J题解

来源:admin|发布时间:2024-10-28 23:37:57|浏览次数:



以下为题解   

/T1.决斗
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N],l=1;
signed main() {
  cin>>n;
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  sort(a+1,a+n+1);
  for(int i=1;i<=n;i++) {
    if(a[l]>=a[i]) continue ;//减不掉
    l++;
  }
  cout<<n-l+1;
  return 0;
}


//T2.超速检测
#include <bits/stdc++.h>
using namespace std;
#define double long double
int a[100005], d[100005], v[100005], p[100005];
int del[100005];

struct node {
  int ql, qr;
  friend bool operator<(node l, node r) {
    if (l.ql != r.ql)
      return l.ql < r.ql;
    return l.qr > r.qr;
  }
} s[100005];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int t;
  cin >> t;
  while (t--) {
    int n, m, L, V;
    cin >> n >> m >> L >> V;
    for (int i = 1; i <= n; i++)
      cin >> d[i] >> v[i] >> a[i];
    for (int i = 1; i <= m; i++)
      cin >> p[i];
    int tot = 0;
    for (int i = 1; i <= n; i++) {
      if (a[i] <= 0 && v[i] <= V)
        continue;
      if (a[i] > 0) {
        int wei = V * V - v[i] * v[i];
        wei /= (2 * a[i]);
        wei += d[i];
        if (v[i] > V)
          wei = d[i] - 1;
        int l = 1, r = m, ans = 0;
        while (l <= r) {
          int mid = (l + r) / 2;
          if (p[mid] > wei) {
            r = mid - 1;
            ans = mid;
          } else
            l = mid + 1;
        }
        if (!ans)
          continue;
        s[++tot].ql = ans, s[tot].qr = m;
      } else {
        int l = 1, r = m, pos = 0;
        while (l <= r) {
          int mid = (l + r) / 2;
          if (p[mid] >= d[i]) {
            r = mid - 1;
            pos = mid;
          } else
            l = mid + 1;
        }
        if (!pos)
          continue;
        l = pos, r = m;
        int ans = 0;
        while (l <= r) {
          int mid = (l + r) / 2;
          double su = sqrt(v[i] * v[i] * 1.0 + 2.0 * a[i] * (p[mid] - d[i]));
          if (su > V) {
            l = mid + 1;
            ans = mid;
          } else
            r = mid - 1;
        }
        if (ans < pos)
          continue;
        s[++tot].ql = pos, s[tot].qr = ans;
      }
    }
    sort(s + 1, s + tot + 1);
    int mr = 1000000000;
    for (int i = tot; i >= 1; i--) {
      if (mr <= s[i].qr)
        del[i] = 1;
      mr = min(mr, s[i].qr);
    }
    int ans = 0, fu = 0;
    for (int i = 1; i <= tot; i++) {
      //  cout << s[i].ql << " " << s[i].qr << " " << del[i] << endl;
      if (del[i]) {
        del[i] = 0;
        continue;
      }
      if (fu < s[i].ql) {
        ans++;
        fu = s[i].qr;
      }
    }
    cout << tot << " " << m - ans << "\n";
  }
}




//T3.染色
#include<bits/stdc++.h>
using namespace std;
inline void rd(){}
template<typename T,typename ...U>
inline void rd(T &x,U &...args){
  char ch=getchar();
  T f=1;x=0;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  x*=f;rd(args...);
}
typedef long long ll;
const int N=2e5+5,V=1e6+5;
int T,n,a[N];ll r[V];
inline void Solve(){
  memset(r,-0x3f,sizeof r);
  ll mxr=0,tgr=0;rd(n);
  for(int i=1;i<=n;i++){
    rd(a[i]);
    ll tmpr=max(mxr,r[a[i]]+a[i])+tgr;
    if(a[i]==a[i-1])tgr+=a[i];
    r[a[i-1]]=max(r[a[i-1]],tmpr-tgr);
    mxr=max(mxr,r[a[i-1]]);
  }
  mxr=0;
  for(int i=1;i<=1000000;i++)mxr=max(mxr,r[i]);
  printf("%lld\n",mxr+tgr);
}
signed main(){
  rd(T);
  while(T--)Solve();
  return 0;
}



//T4.擂台游戏
#include <bits/stdc++.h>

using LL = long long;

const int N = 1 << 18 | 7;
const int M = 18;

int n, m, t, aa[N], a[N], c[N];
int b[N], r[N], id[N], lp[N], rp[N];
LL sum[N], ans[N];
char s[M][N];

void build() {
  for(int i = 0; i < t; ++i) {
    r[i + t] = 0;
    id[i + t] = i;
    b[i + t] = i + 1;
    sum[i + t] = lp[i + t] = rp[i + t] = i + 1;
  }
  for(int i = t - 1; i >= 1; --i) {
    r[i] = r[i << 1] + 1;
    id[i] = id[i << 1] >> 1;
    lp[i] = lp[i << 1];
    rp[i] = rp[i << 1 | 1];
    sum[i] = sum[i << 1] + sum[i << 1 | 1];
    if(s[r[i]][id[i]] == '0')
      b[i] = a[b[i << 1]] >= r[i] ? b[i << 1] : b[i << 1 | 1];
    else
      b[i] = a[b[i << 1 | 1]] >= r[i] ? b[i << 1 | 1] : b[i << 1];
  }
}

LL vt[N], st;
int rd;
void dfs(int i, LL ss, int zl) {
  if(i >= t) {
    ans[i - t] = st + ss + lp[i];
    return ;
  }
  LL trd = rd, tst = st;
  if(s[r[i]][id[i]] == '0') {
    if(b[i] == b[i << 1]) {
      LL v = a[b[i]] >= rd ? b[i] : a[b[i]] + 1 >= zl ? 0 : vt[a[b[i]] + 1];
      std::fill(ans + lp[i << 1 | 1] - 1, ans + rp[i << 1 | 1], v + ss);
    }
    else {
      vt[r[i]] = vt[r[i] + 1];
      dfs(i << 1 | 1, ss, zl);
    }
    rd = trd, st = tst;
    rd = std::max(rd, r[i]);
    st += sum[i << 1 | 1];
    vt[r[i]] = st;
    dfs(i << 1, ss, zl);
  }
  else {
    vt[r[i]] = 0;
    st = 0;
    dfs(i << 1, ss + sum[i << 1 | 1] + tst, r[i]);
    st = tst, rd = trd;
    if(a[b[i << 1]] >= rd) {
      rd = std::max(rd, r[i]);
      vt[r[i]] = b[i << 1];
      st += b[i << 1];
      dfs(i << 1 | 1, ss, zl);
    }
    else {
      int tp = std::max(r[i], a[b[i << 1]]) + 1;
      vt[r[i]] = tp >= zl ? 0 : vt[tp];
      dfs(i << 1 | 1, ss, zl);
    }
  }
  vt[r[i]] = 0;
  rd = trd, st = tst;
}
 
void solve() {
  build();
  for(int i = 1; i < t; i <<= 1)
    if(s[r[i]][id[i]] == '0')
      if(b[i] == b[i << 1])
    std::fill(ans + lp[i << 1 | 1] - 1, ans + rp[i << 1 | 1], b[i]);
      else {
        vt[r[i]] = 0;
        rd = st = 0;
        dfs(i << 1 | 1, 0, 20);
      }
    else {
      rd = r[i];
      st = vt[r[i]] = b[i << 1];
      dfs(i << 1 | 1, 0, 20);
    }
  LL val = 0;
  for(int i = 1, x; i <= m; ++i) {
    for(x = 0; (1 << x) < c[i]; ++x) ;
    LL v = (1 << x) == c[i] ? b[t / c[i]] : ans[c[i]];
    //printf("%lld ", v);
    val ^= i * v;
  }
  printf("%lld\n", val);
}

int main() {

  freopen("arena.in", "r", stdin);
  freopen("arena.out", "w", stdout);
    
  scanf("%d%d", &n, &m);
  for(int i = 1; i <= n; ++i)
    scanf("%d", &aa[i]);
  for(int i = 1; i <= m; ++i)
    scanf("%d", &c[i]);
  for(t = n; t & (t - 1); t += t & -t) ;
  for(int i = 1; (1 << i) <= t; ++i)
    scanf("%s", s[i]);
  
  int cases;
  scanf("%d", &cases);

  while(cases--) {
    int x[4];
    scanf("%d%d%d%d", &x[0], &x[1], &x[2], &x[3]);
    for(int i = 1; i <= n; ++i)
      a[i] = aa[i] ^ x[i & 3];
    solve();
  }
  
  return 0;

}



COPYRIGHT © 2009-2025,WWW.xSteam.CN,ALL RIGHTS RESERVED版权所有 苏ICP备2024134452号
sitemap feed