CDQ凉了求调
查看原帖
CDQ凉了求调
1379742
Xiaohaoyu1020明天见_xj楼主2024/12/31 11:23

《过不了样例》

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+10;
int a[N],v[N];
struct node{
    int t,idx,val,v;
}d[N*10];
int tot;
int n,m;
bool cmp(node a,node b){
    return a.t < b.t || (a.t == b.t && a.idx < b.idx) || (a.t == b.t && a.idx == b.idx && a.val < b.val);
}
bool cmp1(node a,node b){
    return a.idx < b.idx || (a.val < b.val && a.idx == b.idx);
}
bool cmp2(node a,node b){
    return a.idx > b.idx || (a.val < b.val && a.idx == b.idx);
}
struct tlist{
    long long tre[N];
    int lowbit(int x){
        return x&(-x);
    }
    void update(int p,int val){
        for(int i = p;i <= n;i+=lowbit(i)){
            tre[i] += val;
        }
    }
    int query(int p){
        int res = 0;
        for(int i = p;i>=1;i-=lowbit(i)){
            res += tre[i];
        }
        return res;
    }
} tl1,tl2;
long long ans[N];
void solve(int l,int r){
    if(l == r){
        return;
    }
    int mid = (l+r)/2;
    solve(l,mid);
    solve(mid+1,r);
    sort(d+l,d+mid+1,cmp1);
    sort(d+mid+1,d+r+1,cmp1);
    int p = l;
    for(int i = mid+1;i<=r;i++){
        while(p <= mid && d[p].idx < d[i].idx){
            tl1.update(d[p].val,d[p].v);
            tl2.update(d[p].val,1);
            p++;
        }
        ans[d[i].t] += tl1.query(n) - tl1.query(d[i].val) + (tl2.query(n) - tl2.query(d[i].val))*d[i].v;
    }
    for(int i = l;i < p;i++){
        tl1.update(d[i].val,-d[i].v);
        tl2.update(d[i].val,-1);
    }
    sort(d+l,d+mid+1,cmp2);
    sort(d+mid+1,d+r+1,cmp2);
    p = l;
    for(int i = mid+1;i<=r;i++){
        while(p <= mid && d[p].idx > d[i].idx){
            tl1.update(d[p].val,d[p].v);
            tl2.update(d[p].val,1);
            p++;
        }
        ans[d[i].t] += tl1.query(d[i].val - 1) + (tl2.query(d[i].val - 1))*d[i].v;
    }
    for(int i = l;i < p;i++){
        tl1.update(d[i].val,-d[i].v);
        tl2.update(d[i].val,-1);
    }
}
int main(){
    cin>>n>>m;
    for(int i = 1;i<=n;i++){
        cin>>a[i]>>v[i];
        d[++tot] = {0,i,a[i],v[i]};
    }
    for(int i = 1;i<=m;i++){
        int p1,p2;
        cin>>p1>>p2;
        d[++tot] = {i,p1,a[p1],-v[p1]};
        d[++tot] = {i,p1,a[p2],v[p2]};
        d[++tot] = {i,p2,a[p2],-v[p2]};
        d[++tot] = {i,p2,a[p1],v[p1]};
        swap(a[p1],a[p2]);
        swap(v[p1],v[p2]);
    }
    sort(d+1,d+1+tot,cmp);
    solve(1,tot);
    long long sum = ans[0];
    for(int i = 1;i<=n;i++){
        sum+=ans[i];
        cout<<sum<<'\n';
    }
}
2024/12/31 11:23
加载中...