ak
【問題描述】
noipoipoip考場上 ,馬里奧 順利地切掉了前兩題,他只要再最後一就可以 ak 了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和了。最後一題是這樣的:給你個數字序列, 每次查詢段區間和並且把它們都變成原來的平方。馬里奧瞬間就切掉了這道題,但他覺得對 並且把它們都變成原來的平方。馬里奧瞬間就切掉了這道題,但他覺得對 並且把它們都變成原來的平方。馬里奧瞬間就切掉了這道題,但他覺得對 於別人來說太難了。出題在和馬里奧商量後,決定詢問時只要求返回模 於別人來說太難了。出題在和馬里奧商量後,決定詢問時只要求返回模 於別人來說太難了。出題在和馬里奧商量後,決定詢問時只要求返回模 乙個 數 c = 2305843008676823040 的結果。作為另一名noip選手的你也已經切掉了 選手的你也已經切掉了 前兩題,你能夠解決這個修改後的問順利 ak 嗎?
【輸入格式】
第一行 兩個整數 n,m ,表示 數字 個數 和詢問個數 。
接下來 一行 n個數字 ai ,表示 序列的 初始值。
接下 來 m行,每兩個整數 l,r 表示詢問區間 。
【輸出格式】
對於每次詢問,你需要輸出乙個整數表示應的結果。
這題線段樹啊分塊都行
主要是模數上做了手腳,就是說當乙個數平方六十次左右的時候就會開始迴圈了(1000000以內只要28次),所以……又是優化暴力。
線段樹
#include
#define lson(x) (x<<1)
#define rson(x) ((x<<1)|1)
using
namespace std;
typedef
unsigned
long
long ll;
const ll mod =
2305843008676823040ull
;const
int maxn=
100500
;int n,m;
ll ans,val[maxn]
;struct treetree[maxn<<2]
;inline ll mul
(ll x,ll y)
return res;
}inline
void
build
(int left,
int right,
int cur)
int mid=
(left+right)
>>1;
build
(left,mid,
(cur<<1)
);build
(mid+
1,right,
(cur<<1)
|1);
tree[cur]
.val=tree[
(cur<<1)
].val+tree[
((cur<<1)
|1)]
.val;
}inline
void
query
(int a,
int b,
int cur)
if(left==right)
tree[cur]
.val=tmp;
return;}
int mid=
(left+right)
>>1;
if(b<=mid)
query
(a,b,
(cur<<1)
);else
if(a>mid)
query
(a,b,
((cur<<1)
|1))
;else
tree[cur]
.val=
(tree[
(cur<<1)
].val+tree[
((cur<<1)
|1)]
.val)
%mod;
if(tree[cur<<1]
.flag && tree[
(cur<<1)
|1].flag ) tree[cur]
.flag=1;
}int
main()
return0;
}
分塊
# include
# define int long long
# define rint register long long
using
namespace std;
const
int mo=
2305843008676823040
,e=30
,maxn=(2
<<16)
+1;int n,m,bl;
int f[maxn]
,l[maxn]
,r[maxn]
,sum[maxn]
,cnt[maxn]
;struct reca[maxn]
;inline
intread()
while
(c>=
'0'&&c<=
'9') x=
(x<<3)
+(x<<1)
+(c^48)
,c=getchar()
;return w?
-x:x;
}inline
void
print
(rint x)
inline
intfather
(rint x)
inline
intmul
(rint a,rint b)
return res%mo;
}inline
intsolve
(rint l,rint r)
for(rint i=l;i<=r[lb]
;i++
) ans=
(ans+a[i]
.val)
%mo;
for(rint i=r;i>=l[rb]
;i--
) ans=
(ans+a[i]
.val)
%mo;
for(rint i=lb+
1;i<=rb-
1;i++
) ans=
(ans+sum[i]
)%mo;
return ans%mo;
}inline
void
update
(rint l,rint r)
}signed
main()
a[i]
.val=
read()
; a[i]
.bl=bl;
sum[bl]
=(sum[bl]
+a[i]
.val)
%mo;
} r[bl]
=n; rint l,r;
while
(m--
)return0;
}
分塊 線段樹模板
線段樹的一些操作其實用分塊也可以很方便就做掉,至於時間效率也不會慢很多,主要是好寫 對於區間加法一樣用lazy陣列標記,如果區間覆蓋整塊,則把塊給標記上,否則暴力加減,維護sum和lazy陣列 include cmath include cstdio include cstdlib include ...
模擬8 05 優美序列 線段樹 分塊 ST演算法
如此顯然的線段樹,我又瞎了眼了 事實上跟以前的奇襲很像.只要滿足公式maxn minn 權值 r l即可 所以可以考慮建兩顆樹,一棵節點維護位置,一棵權值,每次從一棵樹樹上查詢資訊,如果滿足公式就停止,不然兩顆樹不斷擴充套件區間 當然也可以用st啦 查詢o 1 優於線段樹 1 include2 in...
CDOJ 1292 卿學姐種花 暴力 分塊 線段樹
眾所周知,在喵哈哈村,有乙個溫柔善良的卿學姐。卿學姐喜歡和她一樣美麗的花。所以卿學姐家的後院有很多的花壇。卿學姐有 n 個花壇,一開始第 i 個花壇裡有 a i 朵花。每過一段時間,卿學姐都會在花壇裡種上新的花。作為乙個聰明的學姐,卿學姐的種花方式也是與眾不同 每一次,卿學姐會在第 x 個花壇種上 ...