簡單計算題 離散化 樹狀陣列

2021-10-09 04:14:27 字數 1892 閱讀 1479

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 的個數 思路 列舉中間的數字,求排在它前面,小於它的有幾...