《法一》二維莫隊,對n和m分別分塊後,對塊從上到下從左到右依次編號,詢問以左上角所在塊編號為第一關鍵字,以右下角標號為第二關鍵字排序,轉移時非常厲害。
o(q*n*sqrt(n))。
#include#include#includeusing namespace std;#define n 201
#define m 100001
struct lisant[n*n];
bool operator < (const lisan &a,const lisan &b)
sort(q+1,q+1+q);
for(int i=q[1].x1;i<=q[1].x2;++i)
for(int j=q[1].y1;j<=q[1].y2;++j)
insert(i,j);
anss[q[1].p]=ans;
for(int i=2;i<=q;++i)
for(int i=1;i<=q;++i)
printf("%d\n",anss[i]);
return 0;
}
《法二》二維分塊,分塊在矩陣中的擴充套件,預處理字首矩陣每個數出現的次數,以及所有「子矩塊」的答案。詢問的時候整塊的部分直接獲取,零散的部分暴力轉移。tle。
複雜度o(n^2+q)*n*sqrt(n),常數較大。
#include#include#include#include#includeusing namespace std;int f,c;
inline void r(int &x)
inline void p(int x)
}#define n 202
#define bn 17
int n,m,nm;
struct pointnum[n][n];
inline bool operator == (const point &a,const point &b)
struct lisant[n*n];
inline bool operator < (const lisan &a,const lisan &b)
void init_ans()
for(int o=j;o<=l;++o)
for(int p=ln[k];p<=rn[k];++p)
for(int q=lm[o];q<=rm[o];++q)
--t[a[p][q]];
}}int q;
int main()
; point yx=(point);
int ans=0;
if(!(yx.x>=zs.x && yx.y>=zs.y))
for(int i=x1;i<=x2;++i)
for(int j=y1;j<=y2;++j)
--t[a[i][j]];
}else
int tx2=rn[yx.x];
int ty2=rm[yx.y]+1;
for(int i=x1;i<=tx2;++i)
for(int j=ty2;j<=y2;++j)
int tx3=rn[yx.x]+1;
int ty3=lm[zs.y];
for(int i=tx3;i<=x2;++i)
for(int j=ty3;j<=y2;++j)
int tx4=ln[zs.x];
int ty4=lm[zs.y]-1;
for(int i=tx4;i<=x2;++i)
for(int j=y1;j<=ty4;++j)
for(int i=x1;i<=tx;++i)
for(int j=y1;j<=ty;++j)
--t[a[i][j]];
for(int i=x1;i<=tx2;++i)
for(int j=ty2;j<=y2;++j)
--t[a[i][j]];
for(int i=tx3;i<=x2;++i)
for(int j=ty3;j<=y2;++j)
--t[a[i][j]];
for(int i=tx4;i<=x2;++i)
for(int j=y1;j<=ty4;++j)
--t[a[i][j]];
}p(ans),puts("");
}return 0;
}
二維莫隊解題報告
我寫的莫隊教程 其實這是一道bzoj上的題 bzoj2639,貌似是許可權題,反正我看不了 在yali做模擬賽的時候遇到了.然後在網上查到了幾篇關於這道題的部落格,都和我的做法略有不同.給你乙個 r c 的矩陣,每個點有乙個顏色,m 個詢問,每次詢問乙個子矩陣內,每種顏色出現次數的平方和。r,c l...
二維陣列與二維指標
1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...
二維指標和二維陣列
二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...