題目鏈結
用check來判斷整個塊是0是1,如果是0或者是1,就不用再對這個塊裡的元素開方了。
對乙個數不斷開方一定會縮小到0或者1。
//第一行輸入乙個數字 n。
////第二行輸入 n 個數字,第 i 個數字為 ai,以空格隔開。
////接下來輸入 n 行詢問,每行輸入四個數字 opt l r c,以空格隔開。
////若 opt=0,表示將位於 [l,r] 的之間的數字都開方
////若 opt=1,表示詢問 [l,r] 的所有數字的和
#pragma gcc optimize("ofast")
#pragma comment(linker, "/stack:102400000,102400000")
#pragma gcc target(sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define pi acos(-1)
#define s_1(x) scanf("%d",&x)
#define s_2(x,y) scanf("%d%d",&x,&y)
#define s_3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define s_4(x,y,z,x) scanf("%d%d%d%d",&x,&y,&z,&x)
#define s_1(x) scan_d(x)
#define s_2(x,y) scan_d(x),scan_d(y)
#define s_3(x,y,z) scan_d(x),scan_d(y),scan_d(z)
#define pi acos(-1)
#define endl '\n'
#define srand() srand(time(0));
#define me(x,y) memset(x,y,sizeof(x));
#define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++)
#define close() ios::sync_with_stdio(0); cin.tie(0);
#define for(x,n,i) for(int i=x;i<=n;i++)
#define for(x,n,i) for(int i=x;i=x;i--)
#define for(n,x,i) for(int i=n;i>x;i--)
#define w while
#define sgn(x) ((x) < 0 ? -1 : (x) > 0)
#define bug printf("***********\n");
#define db double
#define ll long long
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair ii;
const int inf=(1<<31);
const ll linf=0x3f3f3f3f3f3f3f3fll;
const int dx=;
const int dy=;
const int maxn=1e6+10;
const int maxx=1e3+10;
const double eps=1e-8;
const double eps=1e-8;
const int mod=1e9+7;
templateinline t min(t a,t b,t c)
templateinline t max(t a,t b,t c)
templateinline t min(t a,t b,t c,t d)
templateinline t max(t a,t b,t c,t d)
template inline bool scan_d(t &ret)
while (c != '-' && (c < '0' || c > '9'))sgn = (c == '-') ? -1 : 1;ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0' && c <= '9')ret *= sgn;return 1;}
inline bool scan_lf(double &num)else if(in=='.')
else num=in-'0';if(!isd)}
if(in!='.')else}
if(isn) num=-num;return true;}
void out(ll a)if(a >= 10) out(a / 10);putchar(a % 10 + '0');}
void print(ll a)
//freopen( "in.txt" , "r" , stdin );
//freopen( "data.txt" , "w" , stdout );
//cerr << "run time is " << clock() << endl;
int n,block,l[maxn],r[maxn],num,belong[maxn];
ll a[maxn],add[maxn],sum[maxn];
//vectorseg[1005];
bool check(int i)
void build()
for(int i=1;i<=num;i++)
for(int j=l[i];j<=r[i];j++)
for(int i=1;i<=belong[n];i++)
if(check(i)) add[i]=1;
}ll query(int x,int y)
for(int i=belong[x]+1;ireturn ans;
}void update(int x,int y)
for(int i=belong[x]+1;ivoid solve()
build();
for(1,n,i)
else }}
int main()
}
LOJ 6281 數列分塊入門 5
原題位址 題意 給出乙個長為 n 的數列 a,以及 n 個操作,操作涉及區間開方,區間求和。思路 對於整塊的開方操作不像加法一樣可以疊加,開方必須要對每乙個數進行操作,這樣才能進行區間加法運算,但是這樣的話就等於暴力計算每乙個數字,複雜度是n2 n 2,這樣無疑是超時的。於是我們考慮開方的性質,可以...
數列分塊入門5 LibreOJ 6281
題意 有 n nn 個數,n nn 次操作,每次操作為區間開方或者區間求和。解法分塊。a i 232 a i 2 a i 23 2 而 232 216 2 8 24 22 21 1 2 to 2 to 2 to 2 to 2 to 2 to 1 232 21 6 28 24 22 2 1 1 所以 ...
Loj 6281 數列分塊入門 5
思路 因為是向下取整開方,那麼其實每個數最多被開個個幾次就會變成0或者1了,更新的時候我們可以將中間的塊標記下是否全部變成了0或者1,如果全變了就不處理 實現 includeusing namespace std define ll long long const int m 1e5 10 vect...