HDU 4467 Graph(莫隊思想)

2021-09-08 02:17:27 字數 1275 閱讀 8028

題意:給你n個點,m條邊,每條邊有乙個權值,有兩個操作,乙個是修改單點的顏色(顏色只有0,1兩種),乙個是詢問邊的兩個端點都為指定顏色的權值和。

思路:由於每個點的顏色只有0,1兩種,那麼答案只有3種情況(00,01,11),用乙個陣列維護即可。即ans[0]統計邊的兩端都是0的權值和,ans[1]統計邊的兩端為1和0的權值總和,ans[2]統計邊的兩端都是1的權值和​​。根據莫隊的思想,我們根據度數將點分為輕重點,這樣我們對輕點進行暴力維護,重點就維護周圍的權值。注意重邊的處理。

#include#define ll long long

using namespace std;

const int maxn = 1e5+7;

struct node

p[maxn];

struct edge

e[maxn],ed;

int color[maxn],deg[maxn];

ll ans[3];

bool cmp(edge x,edge y)

int main()

] += w;

}m = 0;

for(auto it: r)

e[++m].u = it.first.first, e[m].v = it.first.second, e[m].w = it.second;

ans[0] = ans[1] = ans[2] = 0;

for (i = 1; i <= m; i++)

for (i = 1; i <= m; i++)

sort(e+1, e+m+1, cmp); //使u的度數小於v的度數,並排序,這樣可以直接逐邊處理

memset(p,0,sizeof(p));

for (i = 1; i <= m; i++)

int q;

scanf("%d",&q);

printf("case %d:\n",case++);

while (q--)

else

else

color[x] = 1 - color[x];

int st = p[x].st;

while (st <= m && e[st].u == x)

else

if (color[x] == 0)

else

st++;}}

}}

return 0;

}

​​​​​

hdu 4467 Graph 莫隊演算法思想

題目連線 hdu 4467 graph 題意 給你n個點,m條邊,每條邊有乙個權值,有兩個操作,乙個是修改單點的顏色,乙個是詢問邊的兩個端點都為指定顏色的權值和 題解 這題如果暴力的話,就是維護3個ans,乙個是兩個端點都為0的,乙個是乙個為1乙個為0的,最後還有個兩個端點都為1的,對於每個詢問,可...

HDU4467 Graph 點的度數分塊

給出一張n個點m條邊的無向圖,點的顏色為0 1,每次有兩種操作 1.asksum x y,查詢兩點顏色為x和y的邊的權值之和 2.change x,將x顏色取反 最直接的做法是每次改變點的顏色豆漿與該點所連的邊更新,o q m 超時 那麼我們考慮將點根據度數分類,將度數 的點稱為普通點,否則為超級點...

HDU6333 莫隊演算法

給你n,m求 i 0mcn i 1 09 7 sum m 10 9 7 i 0m cni 10 9 7 t組資料t 1 05,1 m,n 105 t leq 10 5,1 leq m,n leq 10 5 t 105,1 m,n 10 5。這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的...