关于++的离奇错误
查看原帖
关于++的离奇错误
1372132
cshur楼主2025/8/30 17:24
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5,M = 2e5 + 5,maxn = 2e5;

int n,m;
struct Tuple { int a,b,c,ans = 0,cnt = 0,id; } r[N],A[N];

bool cmpA(Tuple x,Tuple y)
{
    return x.a == y.a? (x.b == y.b? x.c < y.c : x.b < y.b) : x.a < y.a;
}
bool cmpB(Tuple x,Tuple y) { return x.b == y.b? x.c < y.c : x.b < y.b; }

struct BIT
{
    int t[M] = {};
    inline int lowbit(int x) { return x & (-x); }
    inline void add(int x,int v) { while(x <= m) t[x] += v,x += lowbit(x); }
    inline int query(int x) { int sum = 0; while(x) sum += t[x],x -= lowbit(x); return sum; }
}T;
int ans[N],cnt[N];
void CDQ(int l,int r)
{
    if(l >= r) return;
    int mid = (l + r) >> 1;
    CDQ(l,mid); CDQ(mid + 1,r);
    sort(A + l,A + mid + 1,cmpB);
    sort(A + mid + 1,A + r + 1,cmpB);
    int j = l; multiset<int> S1,S2;
    for(int i = mid + 1; i <= r; i++)
    {
        while(j <= mid && A[j].b <= A[i].b) T.add(A[j].c,A[j].cnt),j++;
        A[i].ans += T.query(A[i].c);
    }
    for(int i = l; i < j; i++) T.add(A[i].c,-A[i].cnt);
}

int main() 
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> r[i].a >> r[i].b >> r[i].c,r[i].cnt = 1;
    sort(r + 1,r + n + 1,cmpA);
    int p = 0;
    for(int i = 1; i <= n; i++)
    {
        if(r[i].a != r[i - 1].a || r[i].b != r[i - 1].b || r[i].c != r[i - 1].c)
            A[++p] = r[i],A[p].cnt = 1,A[p].id = p;
        else A[p].cnt++;
    }
    CDQ(1,p);
    // for(int i = 1; i <= p; i++) ans[A[i].id] = A[i].ans;
    // for(int i = 1; i <= p; i++) cout << ans[i] << endl;
    for(int i = 1; i <= p; i++) cnt[A[i].ans + A[i].cnt - 1] += A[i].cnt;
    for(int i = 0; i < n; i++) cout << cnt[i] << endl;
    return 0;
}

把高亮行:

while(j <= mid && A[j].b <= A[i].b)  T.add(A[j].c,A[j].cnt),j++;

改作

while(j <= mid && A[j].b <= A[i].b)  T.add(A[j].c,A[j++].cnt);

会WA+RE0pts,着实奇怪

有没有大佬为本蒟蒻答疑

2025/8/30 17:24
加载中...