分析:考慮記錄每個座標上每個顏色出現了幾次,並由此算出每個顏色
在這個座標上的貢獻。答案肯定是原圖的答案扣去矩形的答案,再加
上那個矩形同種顏色的貢獻,這裡的答案指的是σdis.我們先要記錄每個顏色在各個位置出現的次數,因為每一次都是區間操作嘛,所以我們用二維差分可以很好地維護,字首和求出出現的次數. 然後求出每個位置原本圖的和副本的差距,求一下字首和就得到原本圖整體的答案.
最後再用乙個字首和陣列求出每個位置覆蓋為顏色x後的貢獻,就可以了.
#include #include#include
#include
#include
#define s(u,i,j,k,l) (u[k][l] - u[i-1][l] - u[k][j-1] + u[i - 1][j-1])
using
namespace
std;
const
int maxn = 1010,maxm = 300010
;int n, m, kk, rubbish,a[maxn][maxn],sum[30
][maxn][maxn],col[maxm];
intx3[maxm], y3[maxm], x4[maxm], y4[maxm];
long
long ans[maxn][maxn],b[30][maxn][maxn],ret = 1ll << 60
,pi;
char
s[maxn];
long
long s1(int x, int y, int x2, int
y2)long
long s2(int cur, int x, int y, int x2, int
y2)int
main()
for (int i = 1; i <= kk; i++)
for (int k = 0; k < 26; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
sum[k][i][j] += sum[k][i - 1][j] + sum[k][i][j - 1] - sum[k][i - 1][j - 1
];//統計每個點每種顏色出現的次數
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
s1 = s2 = 0
;
for (int k = 25; k >= 0; k--)//相當於計算ans,倒著計算一次
for (int k = 0; k < 26; k++)
b[k][i][j] += b[k][i - 1][j] + b[k][i][j - 1] - b[k][i - 1][j - 1
]; }
for (int i = 1; i <= kk; i++)
}printf(
"%lld %d\n
", ret, pi);
return0;
}
常州模擬賽d7t2 陣列
hjz 的陣列初始時有 n 個元素。他可以把乙個位置上的數加上或減去乙個固定的 數 x。一天 ljz 和 hzy 來 hjz 家玩。ljz 突發奇想,提出了乙個問題 如何在給定的 操作步數內最小化陣列所有元素的乘積呢?hjz 百思不得其解,但是他想博得 hzy 的好感,就把這個問題交給你啦 由於最小...
常州模擬賽d5t1 journalist
分析 出題人喪心病狂卡spfa.只能用dijkstar 堆優化.主要的難點是字典序的處理上,乙個想法是在做最短路的時候處理,邊鬆弛邊記錄,比個大小記錄最佳答案.具體的思路大概和最短路計數差不多,當遇到d u w i d v 是,說明到d v 有兩條最短路了,更新一下答案。但是這樣效率太低了,每一次鬆...
常州模擬賽d2t3 小X的佛光
平日裡最喜歡做的事就是蒸發學水。題目描述 小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是一 個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n 1 條邊,使得城市的各個地點能夠相互到達。小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a ...