3>解題思路
首先我們要知道乙個樹狀陣列與逆序對的東西(所以為了防爆,得用離散化把s序列離散一下在加進樹狀陣列)
然後我們把符合(a,b)的方案數p,符合(c,d)的方案數q求出來(樹狀陣列求逆序對,具體得理解樹狀陣列太多了不想打了 ),ans=pq,
接著處理a≠b≠c≠d的情況,因為a已經小於b,c已經小於d,所以就只用在ans中減去a=c、a=d、b=c、b=d的情況,
預先求出lb[i],rb[i],ls[i],rs[i](分別為d為i時c的方案,a為i時b的方案,b為i時a的方案,c為i時d的方案)
四種情況(冒號後面aa=c:s[a]>s[b],s[a]a=d:s[a]>s[b]b=c:s[a]s[c] 方案數為ls[i]*rs[i]
b=d:s[a]>s[c],s[b]
(自己推推就很容易理解了)
最後在加個longlong,不然只有20分
>**
#include
#include
#include
#include
#define ll long long
using namespace std;
struct ooo
ss[100005];
ll n, t, s[
100005
], f[
200005
], p, q, ans;
ll lb[
100005
], rb[
100005
], ls[
100005
], rs[
100005];
bool bmp
(ooo aa, ooo bb)
void
add(ll x, ll y)
//樹狀陣列改值
ll ask
(ll x)
//樹狀陣列詢問
int main()
ans = p * q;
memset
(f,0
,sizeof
(f))
;for
(ll i = n; i >=
1; i--
)for
(ll i =
1; i <= n; i++
) ans -= rs[i]
* rb[i]
+ lb[i]
* rb[i]
+ ls[i]
* rs[i]
+ lb[i]
* ls[i]
;printf
("%lld"
, ans)
;return0;
}
ACM簡單計算題 填詞
輸入的第一行包括三個整數 n,m 和 p 2 m,n 10,0 p 100 接下來的 n 行,每行包括 m 個字元,來表示方格盤。接下來 p 行給出需要在方格盤中找到的單詞。輸入保證填詞遊戲至少有一組答案。輸入中給出的字母都是大寫字母。輸出 神秘單詞 注意 神秘單詞 中的字母要按照字典序給出。3 3...
SSL 1474 簡單計算題
給定長度為 n 的陣列 s 你需要統計有多少個四元組 a,b,c,d 滿足 1 leq as d 且 a,b,c,d 互不相等。利用容斥的思想,把所有 s as d 的情況全部求出來,但是有些情況是不合法的,如 a c,a d,b c,b d 將這些方法減去。關於如何把 s as d 的情況全部求出...
離散化 樹狀陣列
題目描述 erwin最近對一種叫 thair 的東西巨感興趣。在含有n個整數的序列a1,a2 an中,三個數被稱作 thair 當且僅當i求乙個序列中 thair 的個數。輸入格式 開始乙個正整數n,以後n個數a1 an。輸出格式 thair 的個數 思路 列舉中間的數字,求排在它前面,小於它的有幾...