有点意思,不需要什么懒标记之类的东西,因为一个数无论怎样开平方,最后取整的结果必然会是1,所以我们不妨用最大值来维护,若区间最大值不为1,就暴力修改,否则不用管. #include<bits/stdc++.h> using namespace std; ; struct node { int l; int r; unsigned long long sum; unsigned long long mx; }tree[maxn*]; int n,m; unsigned long long l,r…
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ; struct node { int l,r; long long sum,maxx; }tree[maxn]; long long n; long long num[maxn]; long long pushup(long long x) { tree[x].sum=tree[x<<].sum+tree[x&l…
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以维护区间被开方的次数,但我不会...QAQ) #include<cstdio> #include<iostream> #include<cmath> #define int long long #define R register int #define ls (tr<…
思路 每个数不会被开方超过log次,对每个数暴力开方即可 代码 #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #define int long long using namespace std; struct Node{ int max,sum; }Seg[100100<<2]; int a[100100],n,m; void pushup(i…