甘肃建投建设有限公司网站,私人网官网,家具网站素材,万网云服务器网站上线P3203 [HNOI2010]弹飞绵羊
题目描述
详见#xff1a;P3203 [HNOI2010]弹飞绵羊
solution
这是一道LCT的裸题。
但是我并不想用LCT解决此题#xff08;In fact 是不会LCT ~QAQ#xff09;
于是我们开始大力分块。
考虑把弹跳装置分块#xff0c;我们每次需要知道在一…P3203 [HNOI2010]弹飞绵羊
题目描述
详见P3203 [HNOI2010]弹飞绵羊
solution
这是一道LCT的裸题。
但是我并不想用LCT解决此题In fact 是不会LCT ~QAQ
于是我们开始大力分块。
考虑把弹跳装置分块我们每次需要知道在一个块内需要跳几次以及跳出这个块后到达哪一个节点这样保证了每一个块的信息不会对其他块的信息产生影响且我们可以用DP在 的时间内预处理出上述信息。
查询时每次跳转到一个之后的块中沿途统计答案。
修改时由于块与块之间独立因此直接暴力修改需要修改的一块信息即可。
时间复杂度
Code
#includebits/stdc.h
using namespace std;
const int MAXN2e550;
int a[MAXN],color[MAXN],n,Size;
struct fnode{int x,y; } f[MAXN];
inline int read()
{int f1,x0; char cgetchar();while (c0||c9) { if (c-) f-1; cgetchar(); }while (c0c9) { x(x3)(x1)(c^48); cgetchar(); }return x*f;
}
void change(int i) //求出i位置的信息
{if (ia[i]n){if (color[i]color[ia[i]]) f[i](fnode){f[ia[i]].x,f[ia[i]].y1};else f[i](fnode){ia[i],1};}else f[i](fnode){-1,1};
}
int main()
{nread(),Sizetrunc(sqrt(n));for (int i1;in;i) a[i]read(),color[i](i-1)/Size1;for (int in;i1;i--) change(i); //预处理 //for (int i1;in;i) couti:f[i].x f[i].yendl;int Caseread();while (Case--){int optread(),xread()1; //标号从0开始 if (opt1){int ans0;while (x!-1) ansf[x].y,xf[x].x; //统计答案 printf(%d\n,ans);}else{int yread(); a[x]y;for (int icolor[x]*Size;i(color[x]-1)*Size1;i--) change(i); //用与预处理相同的方法暴力修改 //for (int i1;in;i) couti:f[i].x f[i].yendl;}}return 0;
}