6281 數列分塊入門 5

2021-08-28 04:18:46 字數 3307 閱讀 9353

題目鏈結

用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...