zoukankan      html  css  js  c++  java
  • Wannafly Camp 2020 Day 1A 期望逆序对

    分类讨论即可

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 5005;
    const int mod = 998244353;
    int i2;
    int qpow(int p,int q) {
        int b=p,r=1;
        while(q>0) {
            if(q&1) r*=b;
            b*=b;
            r%=mod;
            b%=mod;
            q>>=1;
        }
        return r;
    }
    int inv(int x) {
        return qpow(x,mod-2);
    }
    
    struct seg {
        int l,r,inv;
        int len() {
            return r-l+1;
        }
        seg operator + (const seg &b) {
            seg c;
            c.l = min(l,b.l);
            c.r = max(r,b.r);
            return c;
        }
        seg operator * (const seg &b) {
            seg c;
            c.l = max(l,b.l);
            c.r = min(r,b.r);
            return c;
        }
        bool operator < (const seg &b) {
            return (l+r) < (b.l+b.r);
        }
    } a[N];
    
    
    struct num {
        int x;
        num() {
            x=0;
        }
        num(int t) {
            x=t;
        }
        num operator + (const num &b) {
            num c;
            c.x = x + b.x;
            c.x %= mod;
            return c;
        }
        num operator - (const num &b) {
            num c;
            c.x = x - b.x;
            c.x %= mod;
            c.x += mod;
            c.x %= mod;
            return c;
        }
        num operator * (const num &b) {
            num c;
            c.x = x * b.x;
            c.x %= mod;
            return c;
        }
        num operator / (const num &b) {
            num c;
            if(b.x==2)
                c.x = x * i2;
            else
                c.x = x * inv(b.x);
            c.x %= mod;
            return c;
        }
        num operator / (const seg &b) {
            num c;
            c.x = x * b.inv;
            c.x %= mod;
            return c;
        }
        void operator = (const int &b) {
            x = b;
        }
        void operator = (const num &b) {
            x = b.x;
        }
        num operator + (const int &b) {
            num c;
            c.x = x + b;
            c.x %= mod;
            return c;
        }
        num operator - (const int &b) {
            num c;
            c.x = x - b;
            c.x %= mod;
            return c;
        }
        num operator * (const int &b) {
            num c;
            c.x = x * b;
            c.x %= mod;
            return c;
        }
        num operator / (const int &b) {
            num c;
            c.x = x * inv(b);
            c.x %= mod;
            return c;
        }
        int get() {
            return x;
        }
    };
    
    
    int n;
    
    num calc(seg a,seg b) {
        if(a.r<b.l) return num(0);
        if(b.r<a.l) return num(1);
        if(a.l>=b.l && a.r<=b.r) { //cout<<"A";
            return (num(a.l-b.l)+num(a.r-a.l)/num(2))/b;
        }
        if(b.l>=a.l && b.r<=a.r) { //cout<<"B";
            return (num(a.r-b.r)+num(b.r-b.l)/num(2))/a;
        }
        if(a.l>=b.l && b.r<=a.r) { //cout<<"C";
            return num(1)-num(b.r-a.l+1)*num(b.r-a.l+2)/num(2)/b/a;
        }
        if(b.l>=a.l && a.r<=b.r) { //cout<<"D";
            return num(a.r-b.l)*num(a.r-b.l+1)/num(2)/b/a;
        }
    }
    
    num check(seg a,seg b) {
        num x;
        for(int i=a.l;i<=a.r;i++) {
            for(int j=b.l;j<=b.r;j++) {
                if(j<i) x=x+1;
            }
        }
        x=x/((a.r-a.l+1)*(b.r-b.l+1));
        return x;
    }
    
    signed main() {
        i2=inv(2);
        scanf("%lld",&n);
        //for(int i=1;i<=n;i++) arrinv[i]=__inv(i);
        for(int i=1;i<=n;i++) {
            int t1,t2;
            scanf("%lld%lld",&t1,&t2);
            a[i].l=t1;
            a[i].r=t2;
            a[i].inv=inv(a[i].r-a[i].l+1);
        }
        sort(a+1,a+n+1);
        num ans = 0;
        /*for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                cout<<(calc(a[i],a[j])).get()<<" ";
            }
            cout<<endl;
        }
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                cout<<(check(a[i],a[j])).get()<<" ";
            }
            cout<<endl;
        }*/
    
        for(int i=2;i<=n;i++) {
            for(int j=1;j<i;j++) {
                ans = ans + calc(a[j],a[i]);
            }
        }
        cout<<ans.get()<<endl;
    }
    
  • 相关阅读:
    springboot—spring aop 实现系统操作日志记录存储到数据库
    排名前16的Java工具类
    SpringBoot集成JWT实现token验证
    使用jQuery实现图片懒加载原理
    Spring主从数据库的配置和动态数据源切换原理
    使用Nginx过滤网络爬虫
    Java io.netty.util.ReferenceCountUtil 代码实例
    Netty系列之Netty百万级推送服务设计要点
    Java给图片和PDF文件添加水印(图片水印和文字水印)
    【TortoiseSVN】windows中连接SVN服务器的工具
  • 原文地址:https://www.cnblogs.com/mollnn/p/12254263.html
Copyright © 2011-2022 走看看