我抄题解但是样例都没过
  • 板块灌水区
  • 楼主Antares1024
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/9/1 21:30
  • 上次更新2024/9/2 16:36:36
查看原帖
我抄题解但是样例都没过
1398205
Antares1024楼主2024/9/1 21:30
   // Written by da_ke
// Website: https://mahaoming2022.github.io

#include <bits/stdc++.h>

#define i64 long long
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define fdn(i,r,l) for(int i=(r);i>=(l);i--)
#define pii pair<int,int>
using namespace std;

typedef long long ll;
typedef double db;
typedef __int128 i128;

int n,m;

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    cin>>n>>m;
    vector<vector<int> > inv(m+1);
    vector<int> cnt(n+1);
    rep(i,1,n)
    {
        int a,b;
        cin>>a>>b;
        inv[a].push_back(i);
        inv[b].push_back(i);
    }
    int l=1,r=1;
    int k=n;
    vector<ll> sum(m+3); // 差分,注意开空间
    while(l<=m)
    {
        while(r<=m&&k!=0)
        {
            for(auto i:inv[r])
            {
                if(cnt[i]==0) k--; // 如果没被占用。
                cnt[i]++; // 占用。
            }
            r++;
        }
        if(k!=0) break; // 这玩意儿根本搞不起来,因为 r 到 m 了都不行,l 到后面更不行。
        sum[l-r]++,sum[m-l+2]--;
        // 这里相当于将 [l-r+1,m-l+1] 这个区间全部 +1,其实也可以用线段树等数据结构,但是难写。
        for(auto i:inv[l])
        {
            cnt[i]--;
            if(cnt[i]==0) k++;
        } // 还原,就是将 l 右移,故需做还原操作。
        l++;
    }
    sum[0]=0;
    rep(i,1,m)
    {
        sum[i]+=sum[i-1];
        cout<<sum[i]<<' ';
    }
}

// hope to debug successfully
#include <iostream>
#include <vector>
using namespace std;

int main() {
  int N, M;
  cin >> N >> M;
  vector<int> A(N), B(N);
  for (int i = 0; i < N; i++) cin >> A[i] >> B[i];
  vector<vector<int>> inv(M + 1);
  for (int i = 0; i < N; i++) {
    inv[A[i]].push_back(i);
    inv[B[i]].push_back(i);
  }
  vector<int> cnt(N), ans(M + 3);
  int cnt_zero = N;
  for (int i = 1, j = 1; i <= M;) {
    while (j <= M and cnt_zero != 0) {
      for (auto& x : inv[j]) {
        if (cnt[x] == 0) cnt_zero--;
        cnt[x]++;
      }
      j++;
    }
    if (cnt_zero != 0) break;
    ans[j - i]++, ans[M + 1 - i + 1]--;
    for (auto& x : inv[i]) {
      cnt[x]--;
      if (cnt[x] == 0) cnt_zero++;
    }
    i++;
  }
  for (int i = 1; i <= M; i++) {
    ans[i] += ans[i - 1];
    cout << ans[i] << " \n"[i == M];
  }
}

两份代码相似度极高!但是前一份连样例都没过!

题目:https://atcoder.jp/contests/abc260/tasks/abc260_e

2024/9/1 21:30
加载中...