經典問題
正常解法是樹狀陣列或線段樹
但這題記憶體給的很小
分塊可以省記憶體
我們分析一下
樹狀陣列
線段樹分塊
時間$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;
}