此题不难,可以转化为求解区间内的个数和,树状数组比较便捷,结果大,用long long
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; const int maxn=1000; int road[maxn+10][maxn+10]; int temp[maxn+10]; int n,m,k; long long num=0; int sumx[maxn+10]; int lowbit(int x) { return x&(-x); } void update(int x) { int i; for(i=x;i<=maxn;i+=lowbit(i)) sumx[i]+=1; } int query(int x) { int i; int sum=0; for(i=x;i>0;i-=lowbit(i)) sum+=sumx[i]; return sum; } int main() { freopen("h.txt","r",stdin); freopen("ho.txt","w",stdout); int t,cas=0; cin>>t; while(t--) { cas++; num=0; scanf("%d%d%d",&n,&m,&k); memset(temp,0,sizeof(temp)); memset(sumx,0,sizeof(sumx)); int i,j; int u,v; for(i=0;i<k;i++) { scanf("%d%d",&u,&v); road[u][temp[u]++]=v; } for(i=1;i<=n;i++) { for(j=0;j<temp[i];j++) num+=(query(maxn)-query(road[i][j])); for(j=0;j<temp[i];j++) update(road[i][j]); } printf("Test case %d: %I64d\n",cas,num); } return 0; }