本文共 1431 字,大约阅读时间需要 4 分钟。
#include#include #include using namespace std; const int maxn=1e5+10;const int maxk=2e5+10; int n,k; struct Triple { int a,b,c,cnt,ans;}a[maxn],A[maxn]; bool cmp(const Triple &a,const Triple &b) { if (a.a!=b.a) { return a.a 0;i-=lowbit(i)) { ans+=a[i]; } return ans; }}bit; void CDQ(Triple *l,Triple *r) { if (l==r) { l->ans+=l->cnt-1; return ; } Triple *mid=l+(r-l)/2; CDQ(l,mid); CDQ(mid+1,r); static Triple tmp[maxn]; for (Triple *p=tmp,*p1=l,*p2=mid+1;p<=tmp+(r-l);p++) { if ((p1<=mid&&p1->b<=p2->b)||p2>r) { *p=*p1++; bit.Update(p->c,p->cnt); } else { *p=*p2++; p->ans+=bit.Query(p->c); } } for (Triple *p=tmp,*q=l;q<=r;p++,q++) { bit.Clean(p->c); *q=*p; }} template inline void read(T &x) { int f=1; x=0; register char ch; ch=getchar(); while (ch>'9'||ch<'0') { if (ch=='-') { f=-f; } ch=getchar(); } while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } x*=f;} inline void write(int x){ if (x<0) { putchar('-'); } if (x>9) { write(x/10); } putchar(x%10+'0');} int main(){ scanf("%d%d",&n,&k); for (int i=0;i
转载地址:http://truen.baihongyu.com/