P5367 【模板】康托展开【树状数组优化】
2019-08-06 19:43
197 查看
题目链接
[code]#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045 #define INF 0x3f3f3f3f #define HalF (l + r)>>1 #define lsn rt<<1 #define rsn rt<<1|1 #define Lson lsn, l, mid #define Rson rsn, mid+1, r #define QL Lson, ql, qr #define QR Rson, ql, qr #define myself rt, l, r using namespace std; typedef unsigned long long ull; typedef long long ll; const ll mod = 998244353; const int maxN = 1e6 + 7; int trie[maxN], N; inline void add(int i) { while(i <= N) { trie[i]++; i += lowbit(i); } } inline ll query(int x) { ll ans = 0; while(x) { ans += trie[x]; x -= lowbit(x); } return ans; } ll jc[maxN]; ll Cantor(int len, int *a) { ll tmp, ans = 0; for(int i=len-1; i>=0; i--) { tmp = query(a[i]); ans += tmp * jc[len - i - 1]%mod; ans %= mod; add(a[i]); } return (ans + 1) % mod; } int s[maxN]; int main() { jc[0] = jc[1] = 1; for(ll i=2; i<maxN; i++) jc[i] = jc[i-1] * i % mod; scanf("%d", &N); for(int i=0; i<N; i++) scanf("%d", &s[i]); printf("%lld\n", Cantor(N, s)); return 0; }
相关文章推荐
- 修改序列【树状数组区修单查模板】
- 树状数组【模板】
- hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板
- lightoj 1085 - All Possible Increasing Subsequences 【树状数组优化dp】
- 树状数组模板区间更新 区间询问大全
- 树状数组模板
- HDU 1166【模板】敌兵布阵(树状数组)
- 树状数组模板
- [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp
- P3374 【模板】树状数组 1
- HDU 2642 Stars(二维树状数组 模板题)
- P3374 【模板】树状数组 1
- (动态可修改主席树模板:树状数组套静态主席树)洛谷P2617 Dynamic Rankings
- 【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3372线段树1)
- POJ2155【二维树状数组模板】
- 【树状数组】树状数组一维二维模板
- 树状数组-模板
- 树状数组模板
- hdu1166及树状数组模板
- 【二维树状数组】【模板】poj1195Mobile phones