求调,悬3关

P3157 [CQOI2011] 动态逆序对

```cpp #include<bits/stdc++.h> #define SZ(x) (int(x.size())-1) #define all(x) x.begin(),x.end() #define F(i,x,y) for(int i=(x);i<=(y);i++) #define pb push_back #define lowbit(x) (x&(-x)) #define mid ((l+r)>>1) using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; template<typename T>inline void chkmax(T &x,T y){x=max(x,y);} template<typename T>inline void chkmin(T &x,T y){x=min(x,y);} int n,m; struct T{ int a,b,c=0,ans=0; bool operator < (const T& y) const { if(a^y.a)return a<y.a; if(b^y.b)return b<y.b; return c<y.c; } }; bool cmp(T a,T b) { if(a.b^b.b)return a.b<b.b; return a.c<b.c; } T a[100010],b[100010]; int tree[100010]; long long ans[100010]; void add(int x,int y) { for(int i=x;i<=n+2;i+=lowbit(i)) tree[i]+=y; } int query(int x) { int res=0; for(int i=x;i>=1;i-=lowbit(i)) res+=tree[i]; return res; } void CDQ(int l,int r) { if(l>=r)return; CDQ(l,mid); CDQ(mid+1,r); sort(a+l,a+mid+1,cmp); sort(a+mid+1,a+r+1,cmp); int p1=l,p2=mid+1; while(p2<=r) { while(a[p2].b>a[p1].b&&p1<=mid) { add(a[p1].c+1,1); // cout<<"add1"<<' '<<a[p1].c<<' '<<endl; p1++; } ans[a[p2].c]+=query(a[p2].c+1); a[p2].ans+=query(a[p2].c+1); // cout<<"query1"<<' '<<a[p2].c<<' '<<query(a[p2].c+1)<<endl; p2++; } F(i,l,p1-1) add(a[i].c+1,-1); p1=mid; p2=r; while(p1>=1) { while(a[p2].b>a[p1].b&&p2>mid) { add(a[p2].c+1,1); // cout<<"add2"<<' '<<a[p2].c<<' '<<endl; p2--; } ans[a[p1].c]+=query(a[p1].c+1); a[p1].ans+=query(a[p1].c+1); // cout<<"query2"<<' '<<a[p1].c<<' '<<query(a[p1].c+1)<<endl; p1--; } F(i,p2+1,r) add(a[i].c+1,-1); } int pos[100010]; int main() { ios::sync_with_stdio(false); cin>>n>>m; F(i,1,n) { cin>>a[i].a; a[i].a=a[i].a; a[i].b=n-i+1; pos[a[i].a]=i; } int idx=n; F(i,1,m) { int x; cin>>x; a[pos[x]].c=idx--; } long long aa=0; sort(a+1,a+1+n); F(i,1,n) { aa+=query(a[i].b); add(a[i].b,1); } F(i,1,n)add(a[i].b,-1); // F(i,1,n) // { // if(a[i].c)continue; // a[i].c=0; // } // F(i,1,n)cout<<a[i].a<<' '<<a[i].b<<' '<<a[i].c<<endl; sort(a+1,a+1+n); CDQ(1,n); // F(i,1,n)cout<<ans[i]<<endl;//ans[i]+=ans[i-1]; F(i,1,m) { cout<<aa<<endl; aa-=ans[n-i+1]; } return 0; } ```
by ByGones @ 2023-06-27 17:33:33


@[ByGones](/user/209848) $68$ 行,`while(p1>=1)` 改为 `while(p1>=l)`,可过。
by c20231020 @ 2023-06-27 18:59:35


@[c20231020](/user/561785) 太感谢了,我已经犯了至少五次这样的错误了。 粉丝36->39,done.
by ByGones @ 2023-06-27 21:24:28


|