牛客多校第5场 I vcd

题面根本看不懂,这种因为题读的不完全对然后差一点点就很气。

题解:观察一下,看看题解,然后树状数组算一算就结束了。然后这个东西换成正确思路想想也挺毒的,尤其同x坐标时。

#include
#define mp make_pair
#define pb push_back
#define ll long long
#define lc no[x].ch[0]
#define rc no[x].ch[1]
#define pa no[x].fa
#define db double
#define ls x<<1
#define rs x<<1|1
#define FORU(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+7;
const int maxs=3e5+5;
const int inf=1e9;
const int mod=998244353;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
    return x*f;
}

struct node
{
	ll v1,v2;
}nodes[maxn];
int vv[maxn],c[maxn],bq[maxn],n;
bool cmp(node a,node b)
{
	return a.v1>b.v1;
}
void add(int x,int y)
{
    while(x<=n){
        c[x]+=y;
        x+=x&(-x);
    }
    return ;
}
ll sum(int x)
{
    ll tmp=0;
    while(x>0)
    {
        tmp+=c[x];
        x-=x&(-x);
    }
    return tmp;
}

int main()
{
     ll tmp,p,q;
     scanf("%d",&n);
     int cnt=1;
     q=n;
     while(q--)
     {
     	scanf("%lld%lld",&nodes[cnt].v1,&nodes[cnt].v2);
     	bq[cnt]=nodes[cnt].v2;
     	cnt++;
     }
     sort(bq+1,bq+cnt+1);
     for(int i=1;i<=cnt;i++)
     {
         nodes[i].v2=lower_bound(bq+1,bq+cnt+1,nodes[i].v2)-bq;
         int k=nodes[i].v2;
         vv[k]++;
     }
     sort(nodes+1,nodes+1+cnt,cmp);
     ll ans=0;
     int st=1;
     ans=(ans+n+1ll*n*(n-1)/2+mod)%mod;
     for(int i=1;i<=n;i++)ans=(ans-1ll*vv[i]*(vv[i]-1)/2+mod)%mod;
     for(int i=1;i<=n;i++)
     {
         int t1=sum(nodes[i].v2);
         int t2=sum(nodes[i].v2-1);
         int t3=sum(n);
         ans=(ans+1ll*(t3-t1)*t2%mod)%mod;
         if(nodes[i].v1!=nodes[i+1].v1)
         {
             for(;st<=i;st++)add(nodes[st].v2,1);
         }
     }
     cout<

 

你可能感兴趣的:(树状数组)