今天也是一條鹹魚orz
場上三題:e,j,k
e:everything is generated in equal probability
題解:乙個長度為n的排列的逆序期望為c(n, 2)/2 ,因為每一對下標的貢獻都是1/2.然後設dp[
i]
dp[i]
dp[i
]為長度為i
ii的隨機排列的culculate函式值,則由題可得
d p[
n]=c
(n,2
)2+σ
i=0n
c(n,
i)∗d
p[i]
dp[n]=\frac+\sigma_^nc(n,i)*dp[i]
dp[n]=
2c(n
,2)
+σi=
0nc
(n,i
)∗dp
[i]由此可以o(n
2)
o(n^2)
o(n2
)推出dp[
n]
dp[n]
dp[n
]。因為一開始從[1,
n]
[1,n]
[1,n
]隨機選取長度,所以最終答案為σdp
[i]n
\frac
nςdp[i
]。(聽說有大佬o(1
)o(1)
o(1)
直接算出答案,%%%)
**:
#include#define ll long long
using namespace std;
const ll mod = 998244353;
const int maxn = 3e3 + 50;
ll qm(ll a, ll b)
return res;
}ll dp[maxn];
ll p[maxn];
ll inv[maxn];
ll bin[maxn];
ll sum[maxn];
int main()
res = res*qm(bin[i]-1, mod-2) % mod;
dp[i] = res;
} sum[0] = 0;
for(int i = 1; i < maxn; ++i) sum[i] = (sum[i-1] + dp[i])%mod;
int n;
while(scanf("%d", &n)!=eof)
}
j: just skip the problem
題解:最好的選擇是每一位都問過去,所以答案是n!,因為對1e6+3取模,所以當n
>=1
e6+3
n>=1e6+3
n>=1
e6+3
的時候答案為0,遞推求階乘即可。
#include#define ll long long
using namespace std;
const ll mod = 1e6 + 3;
ll p[mod];
int main()
}
k:keen on everything but ********
題解:對於乙個陣列,從最大值開始判斷是否可以組成三角形。它的最大值n如果不能組成三角形,意味著陣列內值的範圍為[n2
,n
][\frac,n]
[2n,n
]除了它本身之外最多只有乙個,所以每檢查兩個數,當前數值一定減少了超過一半。離散化之後用主席樹查詢區間比pos小的最大的數來找第k大值。(有點繞,實際上只需要查詢區間第k大,**寫醜了。)
**:
#include#define ll long long
#define mid ((l+r)>>1)
using namespace std;
const int maxn = 1e5 + 50;
int sz[maxn*20], lc[maxn*20], rc[maxn*20];
int t[maxn];
int n, m;
ll cc[maxn];
int num;
ll a[maxn];
int tot;
void build(int pre, int &cur, int l, int r, int pos)
sz[cur] = sz[pre] + 1;
if(l == r) return;
if(pos <= mid)
else
return;
}int query(int pre, int cur, int l, int r, int pos, int &tt)
int ans = -1;
if(pos > mid) ans = query(rc[pre], rc[cur], mid+1, r, pos, tt);
if(ans == -1) return query(lc[pre], lc[cur], l, mid, pos, tt);
}void init()
sort(cc+1, cc+1+num);
num = unique(cc+1, cc+1+num) - cc - 1;
for(int i = 1; i <= n; ++i)
}void sol()
else if(t1 == 2)
else
else if(t2 >= 2)
else if(t3 > 0)
p1 = p2; p2 = p3;
t1 = t2; t2 = t3;
t3 = 0;
p3 = query(t[l-1], t[r], 1, num, p2-1, t3);
continue;}}
}if(!ok) printf("-1\n");
}}int main()}/*
10 1
1 4 4 4 4 8 15 1 1 1
1 10
*/
2019杭電多校第二場
給定乙個 n 從 1,n 中等概率取出乙個數,再等概率生成乙個 n 的全排列,再計算這個全排列的函式值,求這個函式值的期望。函式表達為輸入乙個全排列,計算其逆序數,再等概率取出乙個子串行 可以是空,可以是原序列 遞迴計算該子串行的函式值,累加返回。include using namespace st...
2019 杭電多校第二場 string
題意 找到所有的回文串滿足它的前一半也是回文串。思路 回文自動機 樹上倍增 我們要處理兩件事情,第一件是每種回文串出現了多少次。我們回想回文自動機的構造過程,發現fail指標只會由標號大的指向標號小的。這樣我們只需要標號從大到小遍歷即可處理出每種回文串出現的次數。第二件是倍增的寫法,倍增是不需要初始...
2018暑假杭電多校第二場
問了yxz後做的。這個是我一般寫線段樹的方法,才覺得感覺有點麻煩,還是yxz的寫法安逸些 include bits stdc h define out x cout x typedef long long ll const ll maxn 5e5 5 int n,m int b maxn struc...