數列分塊系列5

2021-09-20 10:30:50 字數 3364 閱讀 7584

五:

對於區間開方操作,維護區間最大值,若區間最小值小於等於1,那麼就不需要進行操作 用add【】陣列記錄

//第一行輸入乙個數字 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; i}void solve()

build();

for(1,n,i) else }}

int main()

}

6281 數列分塊入門 5

題目鏈結 用check來判斷整個塊是0是1,如果是0或者是1,就不用再對這個塊裡的元素開方了。對乙個數不斷開方一定會縮小到0或者1。第一行輸入乙個數字 n。第二行輸入 n 個數字,第 i 個數字為 ai,以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c,以空格隔開。若 opt...

數列分塊入門 5 總結

這題我得著重給一給資料範圍,嗯嗯 哈哈,我們發現a i 最大是231 1。好,我們開開方先 2147483647 46340 取整的 2151431 1 我們再試幾個數,發現最終會變成0或1,然後就不會在變了。所以,它最多會開方5次,然後便相當於不變了。這樣子,我們一開始全部暴力改。每當乙個塊的全部...

分塊系列 數列分塊入門7 解題報告

區間乘法,區間加法,單點詢問。寫過線段樹模板2的童鞋應該很清楚了吧qaq 由於 與markdown衝突,所以用 代替o o 我們把乙個數表示為 a i tg2 b i tg1 b i tg2表示乘法標記,tg1表示加法標記。對於不完整的塊,直接 a i a i tg2 b i tg1 b i 將這個...