请求开大时间限制

P4169 [Violet] 天使玩偶/SJY摆棋子

附一份代码,如果是我写的常数太大了请大佬们指正 ```php #include<bits/stdc++.h> using namespace std; #define int long long const int N=2000005; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } struct node { int a; int b; int c; bool f1,f2,qk; int to; }p[N]; int asknum,tot; int sf1,sf2; bool cmp1(node g1,node g2) { if(g1.a!=g2.a) return g1.a*sf1<g2.a*sf1; return g1.qk<g2.qk; } bool cmp2(node g1,node g2) { if(g1.b!=g2.b) return g1.b*sf2<g2.b*sf2; return g1.f1+g1.qk<g2.f1+g2.qk; } bool cmp3(node g1,node g2) { if(g1.c!=g2.c) return g1.c<g2.c; return g1.f1+g1.f2+g1.qk<g2.f1+g2.f2+g2.qk; } node p1[N]; int ans[N]; void cdq2(int l,int r) { if(l==r) return; int mid=(l+r)/2; cdq2(l,mid); cdq2(mid+1,r); for(int i=l;i<=r;i++) { if(i<=mid) p[i].f2=0; else p[i].f2=1; } int zk=l-1; for(int i=l,j=mid+1;i<=mid||j<=r;) { zk++; if(i>mid) { p1[zk]=p[j]; j++; } else if(j>r) { p1[zk]=p[i]; i++; } else { if(cmp3(p[i],p[j])) { p1[zk]=p[i]; i++; } else { p1[zk]=p[j]; j++; } } } for(int i=l;i<=r;i++) p[i]=p1[i]; int now=1e18; //cout<<l<<" "<<r<<"______________________"<<endl; for(int i=l;i<=r;i++) { // cout<<"a: "<<p[i].a<<" b: "<<p[i].b<<" c: "<<p[i].c<<endl; // cout<<"** "<<p[i].f1<<" "<<p[i].f2<<" "<<p[i].qk<<"**"<<endl; if(p[i].f1+p[i].f2+p[i].qk==0) { now=min(now,(sf1*p[i].a+sf2*p[i].b)*(-1)); // cout<<"add "<<" "<<(sf1*p[i].a+sf2*p[i].b)*(-1)<<" "<<now<<endl; } if(p[i].f1+p[i].f2+p[i].qk==3) { ans[p[i].to]=min(ans[p[i].to],(p[i].a*sf1+p[i].b*sf2)+now); // cout<<"query "<<now<<" "<<(p[i].a*sf1+p[i].b*sf2)+now<<endl; } } } void cdq1(int l,int r) { if(l==r) return; int mid=(l+r)/2; cdq1(l,mid); cdq1(mid+1,r); for(int i=l;i<=r;i++) { if(i<=mid) p[i].f1=0; else p[i].f1=1; } sort(p+l,p+r+1,cmp2); // cout<<l<<" "<<r<<"******************"<<endl; cdq2(l,r); } void solve(int s1,int s2) { sf1=s1; sf2=s2; sort(p+1,p+tot+1,cmp1); // cout<<"((((((((((((((((((((( "<<sf1<<" "<<sf2<<" )))))))))))))))))))))))))))"<<endl; cdq1(1,tot); } signed main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { tot++; p[tot].a=read(); p[tot].b=read(); p[tot].c=0; p[tot].qk=0; } for(int i=1;i<=m;i++) { int op; cin>>op; if(op==1) { tot++; p[tot].a=read(); p[tot].b=read(); p[tot].c=i; p[tot].qk=0; } else { tot++; asknum++; p[tot].a=read(); p[tot].b=read(); p[tot].c=i; p[tot].qk=1; p[tot].to=asknum; } } for(int i=1;i<=asknum;i++) ans[i]=1e18; solve(-1,-1); solve(1,-1); solve(-1,1); solve(1,1); for(int i=1;i<=asknum;i++) printf("%lld\n",ans[i]); return 0; } ```
by u______n @ 2024-01-03 07:44:23


这一题的o2优化很神奇,经测试题解能缩减四倍左右的时间,但我开了也过不掉,4s7e8还是太勉强了
by u______n @ 2024-01-03 07:50:59


@[realskc](/user/35672)
by u______n @ 2024-01-03 07:56:15


@[u______n](/user/965755) 写了快读你不用?
by Miss_SGT @ 2024-01-03 08:29:32


@[zhouchenqiao1](/user/705012) ?我没有用吗???
by u______n @ 2024-01-03 08:32:20


@[u______n](/user/965755) 额看见你n,m没用,这题你可以尝试cdq用归并排序
by Miss_SGT @ 2024-01-03 08:52:49


我这边完全不卡常,建议换成归并试试
by naroanah @ 2024-01-03 10:07:23


好的,我试试
by u______n @ 2024-01-03 10:09:10


但理论上也确实需要777,600,000次
by u______n @ 2024-01-03 10:09:47


归并快了点,但还是卡
by u______n @ 2024-01-03 10:14:36


| 下一页