洛谷 SDOI2009 虔誠的墓主人

2021-10-08 21:34:24 字數 1962 閱讀 8413

初見安~這裡是傳送門:洛谷p2154 [sdoi2009]虔誠的墓主人

題意很簡單:在n*m的網格上,求所有未標記點的權值和。乙個未標記點的權值為:設其上下左右有

首先資料範圍很夠,k很小,我們就預處理

暴力做法列舉每個格點的話,我們可以預處理出每行每列標記點的字首和然後離散化,這樣的話複雜度就是

我們考慮把這個二維問題的掃瞄線了。把所有關鍵點按x座標為第一關鍵字,y座標為第二關鍵字從小到大排序,從左往右依次加入每個點,每加入乙個點就可以發現:這個點和下乙個點的空隙中間的行的。也就是說我們可以把這些橫行的直接乘。也就是說我們可以維護豎列的情況,每加入乙個點就是單點修改,求和就是區間查詢,那不就是樹狀陣列可以幹的事兒嘛!【線段樹也可,畢竟掃瞄線大多用線段樹】

每次加入點後累加一次和,做一次修改,複雜度

好了上**——

#include#include#include#include#include#include#include#include#define maxn 100005

using namespace std;

typedef long long ll;

const ll mod = 2147483648;

int read()

while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();

return x * f;

}int n, m, w, k;

struct node a[maxn];

bool cmp(node a, node b)

vectortmp; mapmp;

int cntc[maxn], cntl[maxn], l[maxn];

ll c[maxn][20], t[maxn], num[maxn];

void change(int x, ll y) //樹狀陣列基礎操作

ll ask(int x)

signed main()

for(int i = 1; i <= w; i++) tmp.push_back(a[i].x);//很醜的橫行縱列離散化。

sort(tmp.begin(), tmp.end()); register int size = 0;

for(int i = 0; i < tmp.size(); i++) if(!mp[tmp[i]]) mp[tmp[i]] = ++size;

for(int i = 1; i <= w; i++) a[i].x = mp[a[i].x], cntc[a[i].x]++;

tmp.clear(); mp.clear();

for(int i = 1; i <= w; i++) tmp.push_back(a[i].y);

sort(tmp.begin(), tmp.end()); size = 0;

for(int i = 0; i < tmp.size(); i++) if(!mp[tmp[i]]) mp[tmp[i]] = ++size;

for(int i = 1; i <= w; i++) a[i].y = mp[a[i].y], cntl[a[i].y]++;

sort(a + 1, a + 1 + w, cmp);

register int tot = 0, now; a[0].x = -1;

ll ans = 0;

for(int i = 1; i <= w; i++)

printf("%lld\n", ans);

return 0;

}

迎評:)

——end——

SDOI2009 虔誠的墓主人

題目大意 n times m 的點陣,有的點是樹木,定義乙個空點的度數為正上,正左,正右,正下分別有 k 個點的選法 求點陣的總度數.挺好的一道題,排列組合和資料結構糅合在一塊 include include include define lowbit x x x 巨集定義樹狀陣列操作 using ...

LG2154 SDOI2009 虔誠的墓主人

洛谷 如果您沒有看懂題,請反覆閱讀題面及樣例 可以發現,對於某乙個點,它的答案就是上下左右幾個組合數乘起來。這樣直接做複雜度顯然 考慮怎麼優化這個東西。我們可以固定左右,在某兩個左右之間維護上下有多少個,這樣子的話左右的貢獻就是不變的,而且你最多隻會變化 o n 次左右邊界,複雜度 這樣的話,每次查...

洛谷 P2153 SDOI2009 晨跑

給出一幅有向無環圖,問從點1到點n有幾條互相沒有交點 除起點終點外不能有公共點 的路徑,保證路徑數量最多的情況下,路徑最大數量與最短的路徑長度之和是多少.與費用流裸題不同的是,不能有公共點,解決方法是將每乙個點拆為乙個入點和乙個出點,流量為1 起點終點不用拆或者流量為inf 建邊時,從乙個點的出點連...