SUOI 37 清點更多船隻

2022-08-05 04:30:17 字數 1386 閱讀 8018

經典問題

正常解法是樹狀陣列或線段樹

但這題記憶體給的很小

分塊可以省記憶體

我們分析一下

樹狀陣列

線段樹分塊

時間$nlogn=20\times 10^6$

$nlogn=20\times 10^6$

$n\sqrt n=10^3\times 10^6$

記憶體$2\times n=2\times 8\times 10^6$

$4\times n=4\times 24\times 10^6$

$n+ \sqrt n=8024000$

然後發現都不可行

怎麼辦呢?

其實線段樹

沒必要開全

我們可以開到長度為16就不開了

時間乘10^616

記憶體可以做到\(1.75\times n\)

#include #include //#include using namespace std;

//ifstream inf("stp.in", ios_base::in);

//ofstream outf("stp.out", ios_base::out);

const int maxn=1111111;

const int len=15;

string com;

int l, r;

long long op;

int n, m;

long long num[maxn];

struct node t[maxn>>3];

int tcnt=0;

long long getsum(int l, int r)

void getup(int l, int r)

void pup(int at)

void buildtree(int l, int r, int at)

pup(at);

}void cop(int at)

void opr(int at)

void pdw(int at)

else

op=top;t[at].opt=0ll;

}long long ask(int at)

long long ret=0ll;

pdw(at);

if(t[at].r-t[at].l<=len)

else

return ret;

}void update(int at)

pdw(at);

if(t[at].r-t[at].l<=len)

else

pup(at);

}int main()

else }

return 0;

}