Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
31969 | A21μΘ_wjy | 【S】T2 | C++ | 通过 | 100 | 140 MS | 31532 KB | 2014 | 2024-08-28 16:22:16 |
#include<bits/stdc++.h> #define int long long #define pii pair<int,int> #define mp make_pair using namespace std; const int maxn=1e6+7; int n,q; int p[maxn]; inline int lb(int x){ return x&(-x); } struct BIT1{ int t[maxn]; inline void clr(){ memset(t,0,sizeof(t)); } inline void add(int x,int dt){ while(x<=n){ t[x]+=dt; x+=lb(x); } } inline int qry(int x){ int ans=0; while(x){ ans=ans+t[x]; x-=lb(x); } return ans; } }T1; struct BIT2{ int t[maxn]; inline void clr(){ for(int i=1;i<=n;i++)t[i]=q+1; } inline void upd(int x,int c){ x=n-x+1; while(x<=n){ t[x]=min(t[x],c); x+=lb(x); } } inline int qry(int x){ x=n-x+1; int ans=q+1; while(x){ ans=min(ans,t[x]); x-=lb(x); } return ans; } }T2; int f[maxn]; int qq[maxn]; int Ti[maxn]; int Tk[maxn]; int de[maxn]; template<typename type> inline void read(type &x) { x=0;bool flag(0);char ch=getchar(); while(!isdigit(ch)) flag=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); flag?x=-x:0; } template<typename type> inline void write(type x,bool mode=1) { x<0?x=-x,putchar('-'):0;static short Stack[50],top(0); do Stack[++top]=x%10,x/=10; while(x); while(top) putchar(Stack[top--]|48); mode?putchar('\n'):putchar(' '); } signed main(){ read(n),read(q); for(int i=1;i<=n;i++)read(p[i]); int S=0; T1.clr(),T2.clr(); for(int i=1;i<=n;i++)Ti[i]=q+1; for(int i=n;i>=1;i--){ f[i]=T1.qry(p[i]),S+=f[i]; T1.add(p[i],1); } for(int i=1;i<=q;i++)read(qq[i]),Ti[qq[i]]=min(Ti[qq[i]],i); for(int i=1;i<=n;i++){ // cout<<i<<" "; T2.upd(p[i],Ti[i]); // cout<<"U "; Tk[i]=T2.qry(p[i]); // cout<<"Q"<<endl; } for(int i=1;i<=n;i++)de[Tk[i]]+=f[i]; // cout<<endl; for(int i=1;i<=q;i++){ S-=de[i]; write(S); } }