pair-pair
输入文件:pair-pair.in
输出文件:pair-pair.out
简单对比
时间限制:7 s 内存限制:64 MB
Time Limit : 7000 MS
Memory Limit : 65536 KB
Pair-Pair
Bobo is tired of all kinds of hard LIS (Longest Increasing Subsequence) problems, so he decides to make himself some easier one.
Bobo has n pairs (a1,b1),(a2,b2),…,(an,bn) where 1≤ai,bi≤m holds for all i. He defines f(i,j) be the length of longest increasing subsequence of sequence {ai,bi,aj,bj}.
It's clear that 1≤f(i,j)≤4. Bobo would like to know g(k) which is the number of pairs (i,j) where f(i,j)=k.
Note that a sequence labeled with {i1,i2,…,ik} is an increasing subsequence of {a1,a2,…,an} only if:
1≤i1<i2<⋯<ik≤nai1<ai2<⋯<aik
Input
The first line contains 2 integers n,m (1≤n≤105,1≤m≤103).
The i-th of the following n lines contains 2 integers ai,bi (1≤ai,bi≤m).
Output
For each set, 4 integers g(1),g(2),g(3),g(4).
Sample Input
2 4
1 2
3 4
2 1
1 1
1 1
Sample Output
0 3 0 1
4 0 0 0
注意各种特判就好了。
有时间再更新题解吧……
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 const int maxn=100010; 7 const int maxm=1010; 8 int n,m; 9 long long a[10]; 10 long long b1[maxm],b2[maxm]; 11 long long b3[maxm],b4[maxm]; 12 13 struct Node{ 14 int a,b; 15 Node(int a_=0,int b_=0){ 16 a=a_;b=b_; 17 } 18 }p[maxn]; 19 20 bool cmp(Node x,Node y){ 21 if(x.a!=y.a) 22 return x.a<y.a; 23 return x.b<y.b; 24 } 25 26 void Bit_Add(long long *b,int x,int d){ 27 while(x<=m){ 28 b[x]+=d; 29 x+=x&(-x); 30 } 31 } 32 33 int Bit_Query(long long *b,int x){ 34 int ret=0; 35 while(x){ 36 ret+=b[x]; 37 x-=x&(-x); 38 } 39 return ret; 40 } 41 42 int rt[maxm],sum[maxn*20],ch[maxn*20][2],cnt; 43 void Insert(int pre,int &rt,int l,int r,int g,int d){ 44 rt=++cnt; 45 ch[rt][0]=ch[pre][0]; 46 ch[rt][1]=ch[pre][1]; 47 sum[rt]=sum[pre]+d; 48 if(l==r)return; 49 int mid=(l+r)>>1; 50 if(mid>=g)Insert(ch[pre][0],ch[rt][0],l,mid,g,d); 51 else Insert(ch[pre][1],ch[rt][1],mid+1,r,g,d); 52 } 53 54 int Query(int pre,int rt,int l,int r,int a,int b){ 55 if(a>b)return 0; 56 if(l>=a&&r<=b)return sum[rt]-sum[pre]; 57 int mid=(l+r)>>1,ret=0; 58 if(mid>=a)ret=Query(ch[pre][0],ch[rt][0],l,mid,a,b); 59 if(mid<b)ret+=Query(ch[pre][1],ch[rt][1],mid+1,r,a,b); 60 return ret; 61 } 62 63 void Init(){ 64 memset(a,0,sizeof(a));cnt=0; 65 memset(b1,0,sizeof(b1)); 66 memset(b2,0,sizeof(b2)); 67 memset(b3,0,sizeof(b3)); 68 memset(b4,0,sizeof(b4)); 69 } 70 71 int main(){ 72 #ifndef ONLINE_JUDGE 73 freopen("pair-pair.in","r",stdin); 74 freopen("pair-pair.out","w",stdout); 75 #endif 76 while(scanf("%d%d",&n,&m)!=EOF){ 77 Init(); 78 for(int i=1;i<=n;i++) 79 scanf("%d%d",&p[i].a,&p[i].b); 80 sort(p+1,p+n+1,cmp); 81 for(int i=1,last=0;i<=n;i++){ 82 long long tot=2*(i-1),tmp; 83 84 if(p[i].a<p[i].b){ 85 tmp=Bit_Query(b1,m)-Bit_Query(b1,p[i].b)+Bit_Query(b2,p[i].a-1); 86 a[4]+=tmp;tot-=tmp; 87 88 tmp=Bit_Query(b1,p[i].b)-Bit_Query(b1,p[i].a); 89 tmp+=Bit_Query(b2,p[i].b-1)-Bit_Query(b2,p[i].a-1); 90 91 tmp+=Bit_Query(b3,m)-Bit_Query(b3,p[i].b)+Bit_Query(b4,p[i].a-1); 92 tmp+=Bit_Query(b2,m)-Bit_Query(b2,p[i].b); 93 for(int j=last+1;j<p[i].a;j++)rt[j]=rt[last]; 94 95 tmp+=Query(rt[0],rt[p[i].a-1],1,m,p[i].b,m); 96 97 a[3]+=tmp;tot-=tmp; 98 99 Insert(rt[last],rt[p[i].a],1,m,p[i].b,1); 100 101 last=p[i].a;a[2]+=tot; 102 103 Bit_Add(b1,p[i].a,1);Bit_Add(b2,p[i].b,1); 104 } 105 else{ 106 tmp=Bit_Query(b3,p[i].b)+Bit_Query(b4,m)-Bit_Query(b4,p[i].a-1); 107 a[1]+=tmp;tot-=tmp; 108 109 tmp=Bit_Query(b1,m)-Bit_Query(b1,p[i].b)+Bit_Query(b2,p[i].a-1); 110 a[3]+=tmp;tot-=tmp; 111 112 a[2]+=tot; 113 Bit_Add(b3,p[i].a,1);Bit_Add(b4,p[i].b,1); 114 } 115 } 116 117 for(int i=1;i<=n;i++){ 118 if(p[i].a!=p[i].b)a[2]+=1; 119 else a[1]+=1; 120 } 121 printf("%lld %lld %lld %lld\n",a[1],a[2],a[3],a[4]); 122 } 123 return 0; 124 }