Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30341 | LYLAKIOI | 【S】T2 | C++ | 通过 | 100 | 874 MS | 35412 KB | 3542 | 2024-06-23 18:36:40 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair using namespace std; typedef long long ll; const int maxn=6e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m; struct node { int l,r,v; }d[maxn],t[maxn]; bool operator<(node a,node b){ return a.v<b.v; } ll gcd(ll a,ll b){return ((!b)?a:gcd(b,a%b));} struct treap { struct node { int ls,rs,rnd;pi val; ll P,Q; ll valP,valQ; }d[maxn]; int rt,ct; #define ls(p) d[p].ls #define rs(p) d[p].rs #define rnd(p) d[p].rnd #define val(p) d[p].val #define P(p) d[p].P #define Q(p) d[p].Q #define valP(p) d[p].valP #define valQ(p) d[p].valQ int nnd(int x,int g){ int p=++ct; ls(p)=rs(p)=0,rnd(p)=rand(),val(p)=m_p(x,g),valP(p)=P(p)=x*1ll*g,valQ(p)=Q(p)=g; return p; } void pu(int p){ P(p)=P(ls(p))+valP(p)+P(rs(p)); Q(p)=Q(ls(p))+valQ(p)+Q(rs(p)); }void spl(int u,pi k,int &p,int &q){ if(!u){p=q=0;return;} if(val(u)<=k){ p=u,spl(rs(u),k,rs(p),q),pu(p); }else { q=u,spl(ls(u),k,p,ls(q)),pu(q); } }int mg(int p,int q){ if((!p)||(!q))return p|q; if(rnd(p)<rnd(q)){ rs(p)=mg(rs(p),q),pu(p); return p; }else { ls(q)=mg(p,ls(q)),pu(q); return q; } } void ins(int x,int g){ int p=0,q=0; spl(rt,m_p(x,g),p,q); rt=mg(p,mg(nnd(x,g),q)); }void del(int x,int g){ int p=0,q=0,r=0; spl(rt,m_p(x,g-1),p,q); spl(q,m_p(x,g),q,r); rt=mg(mg(p,mg(ls(q),rs(q))),r); } pair<ll,ll> calc(int u,ll p,ll q){ if(!u)return m_p(p,q); ll nxtp=p+P(rs(u)),nxtq=q+Q(rs(u)); if(nxtq*1ll*val(u).p1<=nxtp&&nxtq)return calc(rs(u),p,q); nxtp+=valP(u),nxtq+=valQ(u); return calc(ls(u),nxtp,nxtq); } }T; void qry(){ auto it=T.calc(T.rt,0,d[0].r); if(!it.p1){printf("0/1\n");return;} ll g=gcd(it.p1,it.p2); it.p1/=g,it.p2/=g; printf("%lld/%lld\n",it.p1,it.p2); /*up(i,1,n)t[i]=d[i];sort(t+1,t+n+1); ll p=0,q=d[0].r; down(i,n,1){ if(q*t[i].v<=p&&q)break; p+=t[i].l*1ll*t[i].v,q+=t[i].l; //p/q<v p<q*v } if(!p){printf("0/1\n");return;} ll g=gcd(p,q); p/=g,q/=g; printf("%lld/%lld\n",p,q);*/ } void slv(){ n=read(),m=read(); up(i,1,n)d[i].v=read(); up(i,0,n)d[i].l=read(); up(i,0,n)d[i].r=read(); up(i,1,n)T.ins(d[i].v,d[i].l); qry();while(m--){ int opt=read(); if(opt==1){ int x=read(); if(x)T.del(d[x].v,d[x].l); d[x].l=read(),d[x].r=read(); if(x)T.ins(d[x].v,d[x].l); }else { int x=read(); if(x)T.del(d[x].v,d[x].l); d[x].v=read(); if(x)T.ins(d[x].v,d[x].l); }qry(); } }int main(){ // freopen("market.in","r",stdin); // freopen("market.out","w",stdout); slv(); fclose(stdin); fclose(stdout); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }