提出 #47373650


ソースコード 拡げる

//vanitas vanitatum et omnia vanitas
#include<bits/stdc++.h>
#define fi first
#define se second
#define eb emplace_back
#define mp make_pair
using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
template<typename T,typename U>
T ceil(T x, U y) {return (x>0?(x+y-1)/y:x/y);}
template<typename T,typename U>
T floor(T x, U y) {return (x>0?x/y:(x-y+1)/y);}
template<class T,class S>
bool chmax(T &a,const S b) {return (a<b?a=b,1:0);}
template<class T,class S>
bool chmin(T &a,const S b) {return (a>b?a=b,1:0);}
int popcnt(int x) {return __builtin_popcount(x);}
int popcnt(ll x)  {return __builtin_popcountll(x);}
int topbit(int x) {return (x==0?-1:31-__builtin_clz(x));}
int topbit(ll x)  {return (x==0?-1:63-__builtin_clzll(x));}
int lowbit(int x) {return (x==0?-1:__builtin_ctz(x));}
int lowbit(ll x)  {return (x==0?-1:__builtin_ctzll(x));}

#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
typedef tuple<int,int,int> tiii;
int read() {
  int x=0,w=1; char c=getchar(); 
  while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
  while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();}
  return x*w;
}

const int N=3005,mod=1e9+7,inv2=(mod+1)/2;
int n,m,x[N],y[N],f[N][N],g[N][N],p[N];

signed main() {
  n=read(), m=read();
  rep(i,1,n) p[i]=read();
  rep(i,1,m) x[i]=read(), y[i]=read();
  rep(i,1,n) rep(j,1,i-1) f[i][j]=1;
  per(i,m,1) {
    int a=x[i], b=y[i];
    rep(i,1,n) g[i][a]=g[a][i]=g[i][b]=g[b][i]=0;
    rep(i,1,n) if(i!=a&&i!=b) {
      g[a][i]=(g[a][i]+f[b][i])%mod;
      g[b][i]=(g[b][i]+f[a][i])%mod;
      g[i][a]=(g[i][a]+f[i][b])%mod;
      g[i][b]=(g[i][b]+f[i][a])%mod;
    }
    g[a][b]=(g[a][b]+f[b][a])%mod;
    g[b][a]=(g[b][a]+f[a][b])%mod;
    rep(i,1,n) if(i!=a&&i!=b) {
      f[a][i]=(f[a][i]+g[a][i])*inv2%mod;
      f[b][i]=(f[b][i]+g[b][i])*inv2%mod;
      f[i][a]=(f[i][a]+g[i][a])*inv2%mod;
      f[i][b]=(f[i][b]+g[i][b])*inv2%mod;
    }
    f[a][b]=(f[a][b]+g[a][b])*inv2%mod;
    f[b][a]=(f[b][a]+g[b][a])*inv2%mod;
  }
  int ans=0;
  rep(i,1,n) rep(j,1,n) if(p[i]<p[j]) ans=(ans+f[i][j])%mod;
  rep(i,1,m) ans=ans*2%mod;
  printf("%lld\n",ans);
  return 0;
}

提出情報

提出日時
問題 D - Inversion Sum
ユーザ lgdmeow
言語 C++ 20 (gcc 12.2)
得点 1000
コード長 2368 Byte
結果 AC
実行時間 954 ms
メモリ 144748 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 3
AC × 39
セット名 テストケース
Sample s1.txt, s2.txt, s3.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, s1.txt, s2.txt, s3.txt
ケース名 結果 実行時間 メモリ
01.txt AC 909 ms 144744 KiB
02.txt AC 909 ms 144664 KiB
03.txt AC 760 ms 144436 KiB
04.txt AC 758 ms 144748 KiB
05.txt AC 903 ms 144740 KiB
06.txt AC 753 ms 144516 KiB
07.txt AC 916 ms 144396 KiB
08.txt AC 918 ms 144704 KiB
09.txt AC 763 ms 144704 KiB
10.txt AC 914 ms 144652 KiB
11.txt AC 764 ms 144392 KiB
12.txt AC 771 ms 144748 KiB
13.txt AC 696 ms 144572 KiB
14.txt AC 692 ms 144596 KiB
15.txt AC 712 ms 144544 KiB
16.txt AC 930 ms 144608 KiB
17.txt AC 714 ms 144496 KiB
18.txt AC 954 ms 144492 KiB
19.txt AC 730 ms 144492 KiB
20.txt AC 908 ms 144688 KiB
21.txt AC 919 ms 144600 KiB
22.txt AC 761 ms 144700 KiB
23.txt AC 689 ms 144500 KiB
24.txt AC 917 ms 144544 KiB
25.txt AC 926 ms 144496 KiB
26.txt AC 746 ms 144444 KiB
27.txt AC 918 ms 144472 KiB
28.txt AC 921 ms 144612 KiB
29.txt AC 742 ms 144492 KiB
30.txt AC 745 ms 144524 KiB
31.txt AC 751 ms 144496 KiB
32.txt AC 690 ms 144552 KiB
33.txt AC 911 ms 144708 KiB
34.txt AC 889 ms 144524 KiB
35.txt AC 1 ms 3700 KiB
36.txt AC 1 ms 3728 KiB
s1.txt AC 1 ms 3904 KiB
s2.txt AC 1 ms 3724 KiB
s3.txt AC 1 ms 3764 KiB