題目大意:給你個100*100的棋盤,有些點上有點權,會隨時間改變。設點權為x(x<=10),則在時間t他的點權為(t
+x)%
(c+1
) 。每次詢問給你時間t,和乙個矩陣範圍(x1,y1,x2,y2),問你矩陣覆蓋區域內的點權和是多少。因為棋盤範圍很小,權值種類也很少,所以我們預處理乙個陣列cnt[k][x][y],表示(1,1,x,y)矩陣內點權為k的點的個數。用容斥原理處理就好了。。o(
c∗1002
) 然後對於每次詢問,答案即為∑k
=0c(
k+t)
%(c+
1)∗n
um[k
][x1
][y1
][x2
][y2
] .num陣列表示(x1,y1,x2,y2)矩陣範圍內點權為k的點的個數,由cnt陣列利用容斥原理可以o(
1)的得到。所以每次詢問可以在o(
c)的時間內得到。
#include
#include
#define n 105
int n,q,c,cnt[11][n][n];
inline int
read()
while(ch>='0'&&ch<='9') x=x
*10+ch-'0',ch=getchar();
return
x*f;
}int main()
for(int
x=1;x
<=100;++x)
for(int
y=1;y
<=100;++y)
for(int k=0;k<=c;++k)
cnt[k][x][y]+=cnt[k][x-1][y]+cnt[k][x][y-1]-cnt[k][x-1][y-1];
while(q--)
printf("%d\n",ans);
}return
0;}
cf835 預處理 記憶化dp
題意 定義 k 度回文串為左半部分和右半部分為 k 1 度的回文串 給出乙個字串 s,問 1 s.size 度回文串的數目分別為多少 思路 預處理 記憶化dp 可以先花 o n 2 的時間預處理一下所有字串是否為回文串 注意預處理時不能直接列舉 l,r,不然會出現處理 l,r 時 l 1,r 1 並...
CF 392 2 C 暴力模擬
cf 392 2 c.unfair poll 題意 n行m列人,老師點k次名。點名次序,每一行都是從1到m,但行是按1,2.n 1 n,n 1 n 2 1,2,3.n 1 n.求點完k次名後被點的最多的次數和最少的次數,以及給定的 x,y 被點次數。總結 有點麻煩,但還是很好找規律,只是fst了,有...
CF1020B Badge 模擬鍊錶
n個點 n 1000 接下來n個整數表示ai 第i個數ai表示i到ai有一條邊 輸出 n個數 表示從第i個點出發,最先被訪問兩次的點 樣例1 從1 出發,先到達2,2會到達3,3又到達2.2被訪問第二次。輸出 2 從2 出發,先到達3,3到達2,2被訪問兩次,輸出 2 從3 出發,先到2 2 又到3...