zoukankan      html  css  js  c++  java
  • 1207D Number Of Permutations

    题目大意

    给你n个二元组

    问你有几种排列是的按两个关键字中的任意一个都不是不降排列的

    分析

    不妨容斥

    我们先加上总的方案数$n!$

    之后我们按第一个关键字排序

    因为值相同的情况下不影响答案

    所以让总方案数减去$prod sum_{ai}!$即可

    对于第二关键字的情况同上

    我们再使序列同时按照第一关键字和第二关键字排序

    然后总方案数加上$prod sum_{(ai,bi)}!$即可

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    #define int long long
    const int mod = 998244353;
    int p[300100],n,m,Ans;
    struct node {
        int x,y;
    };
    node d[300100];
    inline void init(){
        int i,j,k;
        p[0]=1;
        for(i=1;i<=n;i++)p[i]=p[i-1]*i%mod;
    }
    inline bool cmp1(const node a,const node b){
        if(a.x==b.x)return a.y<b.y;
        return a.x<b.x;
    } 
    inline bool cmp2(const node a,const node b){
        return a.y<b.y;
    } 
    signed main(){
        int i,j,k;
        scanf("%lld",&n);
        init();
        for(i=1;i<=n;i++)scanf("%lld%lld",&d[i].x,&d[i].y);
        Ans=p[n];
        sort(d+1,d+n+1,cmp1);
        int res=1; 
        for(i=1;i<=n;i++){
          j=i;
          while(j+1<=n&&d[j+1].x==d[j].x)j++;
          res=res*p[j-i+1]%mod;
          i=j;
        }
        Ans=(Ans-res+mod)%mod;
        sort(d+1,d+n+1,cmp2);
        res=1; 
        for(i=1;i<=n;i++){
          j=i;
          while(j+1<=n&&d[j+1].y==d[j].y)j++;
          res=res*p[j-i+1]%mod;
          i=j;
        }
        Ans=(Ans-res+mod)%mod;
        sort(d+1,d+n+1,cmp1);
        int ok=1;
        for(i=2;i<=n;i++)
          if(d[i].y<d[i-1].y){
              ok=0;
              break;
          }
        res=1;
        if(ok){
          for(i=1;i<=n;i++){
            j=i;
            while(j+1<=n&&d[j+1].y==d[j].y&&d[j+1].x==d[j].x)j++;
            res=res*p[j-i+1]%mod;
            i=j;
          }
          Ans=(Ans+res)%mod;
        } 
        cout<<Ans<<"
    ";
        return 0;
    }
  • 相关阅读:
    FastJson---高性能JSON开发包
    mybatis中大于等于小于等于的写法
    MarkDown 使用说明示例
    Get和Post的参数传值
    规则引擎 资料收集
    ORA-01033错误解决方案
    mybatis 参数为String,用_parameter 取值
    php中实现记住密码下次自动登录的例子
    php 应用 bootstrap-fileinput 上传文件 插件 操作的方法
    AJAX 跨域请求
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/11415216.html
Copyright © 2011-2022 走看看