之前@Unique_Hanpi 提供了hack数据,但是这快半年了多头也没有来处理,所以发一下吧。是这样的,本题我用假做法通过了此题,并取得了非常优秀的时间。
思路就是很朴素的普通线段树,在修改过程中把一些不必要的修改转换为了区间 tag 来优化时间。这个做法会被没有区间所有数都相同的数据卡掉,退化到 Θ(nq) 的时间复杂度。
在这里提供数据生成器,然后用第一篇@BigSmall_En 题解的严格 Θ(nlogn) 写法完全可以通过。
#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("test.in","w",stdout);
int n=500000,q=500000;
cout<<n<<' '<<q<<"\n";
for(int i=1;i<=n;++i)
{
if(i&1) printf("500000 ");
else printf("1 ");
}
puts("");
for(int i=1;i<=100000;i++)
{
printf("1 1 500000 %d\n",1);
}
for(int i=1;i<=200000;i++)
{
printf("2 1 500000 %d\n", 500000-i);
}
for(int i=1;i<=100000;i++)
{
printf("3 1 500000 %d\n",500000-i);
}
for(int i=1;i<=100000;i++)
{
printf("4 1 500000\n");
}
return 0;
}