How D
  • 板块学术版
  • 楼主Lele_Programmer
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/14 18:03
  • 上次更新2024/12/14 20:42:40
查看原帖
How D
961972
Lele_Programmer楼主2024/12/14 18:03

刚刚 Div.2 的 T4 怎么写啊,我看好像很多大佬都是一开始 T 了很多后面就 A 了,而本蒟蒻一直 TLE,不知道还能怎么优化。

#include <bits/stdc++.h>
using namespace std;

#define int long long

#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define TIMESTAMP cerr<<fixed<<setprecision(3)<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl;
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
typedef pair<int,int> pii;

namespace IO {
    inline void read(int &a) {
        int sym=1,num=0;
        char c=getchar();
        while (c<'0' || c>'9') {
            if (c=='-') {
                sym=-1;
            }
            c=getchar();
        }
        while (c>='0' && c<='9') {
            num=num*10+c-'0';
            c=getchar();
        }
        a=sym*num;
    }
    inline void write(int a) {
        if (a<0) {
            putchar('-');
            a*=-1;
        }
        if (a>=10) {
            write(a/10);
        }
        putchar(a%10+'0');
    }
}

using IO::read;
using IO::write;

const int N=300005;

int T,n,m;
vector<int> nums;

struct node {
    int a,b;
} arr[N];

struct Seg {
    int l,r;
    int num,sum;
} tr[N<<2];

Seg tmp[N];

inline void pushup(int u) {
    if (tr[u<<1].sum==tr[u<<1|1].sum) {
        tr[u].sum=tr[u<<1].sum;
        tr[u].num=max(tr[u<<1].num,tr[u<<1|1].num);
    } else if (tr[u<<1].sum>tr[u<<1|1].sum) {
        tr[u].sum=tr[u<<1].sum;
        tr[u].num=tr[u<<1].num;
    } else {
        tr[u].sum=tr[u<<1|1].sum;
        tr[u].num=tr[u<<1|1].num;
    }
}

inline void build(int u,int l,int r) {
    tr[u]={l,r,l,0};
    if (l==r) return;
    int mid=l+r>>1;
    build(u<<1,l,mid); build(u<<1|1,mid+1,r);
    pushup(u);
}

inline void modify(int u,int p,int k) {
    if (tr[u].l==p && tr[u].r==p) tr[u].sum+=k;
    else {
        int mid=tr[u].l+tr[u].r>>1;
        if (p<=mid) modify(u<<1,p,k);
        else modify(u<<1|1,p,k);
        pushup(u);
    }
}

inline Seg query(int u,int l,int r) {
    if (tr[u].l>=l && tr[u].r<=r) return tr[u];
    Seg ans,L={0,0,0,0},R={0,0,0,0};
    int mid=tr[u].l+tr[u].r>>1;
    if (l<=mid) L=query(u<<1,l,r);
    if (r>mid) R=query(u<<1|1,l,r);
    if (L.sum==R.sum) {
        ans.sum=L.sum;
        ans.num=max(L.num,R.num);
    } else if (L.sum>R.sum) {
        ans.sum=L.sum;
        ans.num=L.num;
    } else {
        ans.sum=R.sum;
        ans.num=R.num;
    }
    return ans;
}

signed main() {
    read(T); read(n); read(m);
    _rep(i,1,n) {
        int a,b;
        read(a); read(b);
        arr[i]={a,b};
        nums.emplace_back(b);
    }
    sort(nums.begin(),nums.end());
    nums.erase(unique(nums.begin(),nums.end()),nums.end());
    _rep(i,1,n) arr[i].b=lower_bound(nums.begin(),nums.end(),arr[i].b)-nums.begin()+1;
    build(1,1,(int)nums.size());
    _rep(i,1,n) modify(1,arr[i].b,arr[i].a);
    int debug=0;
    if (T==8 || T==9) {
        int i=n;
        while (i) {
            tmp[i]=query(1,1,(int)nums.size());
            modify(1,arr[i].b,-arr[i].a);
            --i;
        }
        ++i;
        while (i<=n) modify(1,arr[i].b,arr[i].a),++i;
    }
    while (m--) {
        int op;
        read(op);
        if (op==1) {
            int x,y;
            read(x); read(y);
            arr[x].a+=y;
            modify(1,arr[x].b,y);
        } else {
            int q;
            read(q);
            int i=n;
            int sum=0;
            // unordered_map<int,int> hs;
            while (i) {
                Seg t;
                if (T!=8 && T!=9) t=query(1,1,(int)nums.size());
                else t=tmp[i];
                sum^=(nums[t.num-1]*arr[i].a);
                if (sum==q) break;
                if (T!=8 && T!=9) modify(1,arr[i].b,-arr[i].a);
                // hs[arr[i].b]+=arr[i].a;
                --i;
            }
            // printf("%lld\n",n-i+1);
            write(n-i+1); putchar(10);
            debug+=n-i+1;
            ++i;
            if (T!=8 && T!=9) while (i<=n) modify(1,arr[i].b,arr[i].a),++i;
            // _iter(it,hs) modify(1,it->first,it->second);
        }
    }
    return 0;
}
2024/12/14 18:03
加载中...