国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

[SD2014集訓(xùn)]查詢(分塊+數(shù)學(xué)相關(guān))

2019-11-14 10:14:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

題目描述

這里寫圖片描述 這里寫圖片描述 這里寫圖片描述 這里寫圖片描述

題解

看模數(shù)那么奇怪找一下規(guī)律看看有沒(méi)有奇怪的性質(zhì) 發(fā)現(xiàn)每一個(gè)數(shù)立方48次后回到原數(shù) 線段樹(shù)不如分塊好寫 維護(hù)每個(gè)數(shù)立方k次后得到的數(shù),每一個(gè)塊所有的數(shù)分別立方k次后的和 修改時(shí),對(duì)于整塊記錄立方的次數(shù),其余的暴力重構(gòu) 重構(gòu)即把塊內(nèi)的點(diǎn)維護(hù)的立方旋轉(zhuǎn)t次,然后重新計(jì)算和 查詢時(shí),整塊直接查詢,其余暴力 時(shí)間復(fù)雜度O(m(block+n?szblock)),可以發(fā)現(xiàn)當(dāng)block=n?sz?????√時(shí)有最小值,O(mn?sz?????√)≈2.19s

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define LL long long#define Mod 329701061#define sz 48#define N 100005char opt;int n,m,x,y,block,tot;int t[N],num[N],l[N],r[N];LL a[N],cub[N][sz],Cub[N][sz],s[sz];void init(){ for (int i=1;i<=n;++i) { cub[i][0]=a[i]; for (int j=1;j<sz;++j) cub[i][j]=cub[i][j-1]*cub[i][j-1]%Mod*cub[i][j-1]%Mod; } for (int i=1;i<=tot;++i) for (int j=0;j<sz;++j) for (int k=l[i];k<=r[i];++k) { Cub[i][j]+=cub[k][j]; if (Cub[i][j]>=Mod) Cub[i][j]-=Mod; }}void move(int id,int rad){ if (!rad) return; for (int i=0;i<rad;++i) s[i]=cub[id][i]; for (int i=rad;i<sz;++i) cub[id][i-rad]=cub[id][i]; for (int i=0;i<rad;++i) cub[id][i+sz-rad]=s[i];}void calc(int id){ for (int i=0;i<sz;++i) { Cub[id][i]=0; for (int j=l[id];j<=r[id];++j) { Cub[id][i]+=cub[j][i]; if (Cub[id][i]>=Mod) Cub[id][i]-=Mod; } }}void change(int x,int y){ if (num[x]==num[y]) { for (int i=l[num[x]];i<x;++i) move(i,t[num[x]]); for (int i=y+1;i<=r[num[y]];++i) move(i,t[num[x]]); ++t[num[x]];if (t[num[x]]==sz) t[num[x]]=0; for (int i=x;i<=y;++i) move(i,t[num[x]]); t[num[x]]=0; calc(num[x]); return; } if (x==l[num[x]]) x=num[x]; else { for (int i=l[num[x]];i<x;++i) move(i,t[num[x]]); ++t[num[x]];if (t[num[x]]==sz) t[num[x]]=0; for (int i=x;i<=r[num[x]];++i) move(i,t[num[x]]); t[num[x]]=0; calc(num[x]); x=num[x]+1; } if (y==r[num[y]]) y=num[y]; else { for (int i=y+1;i<=r[num[y]];++i) move(i,t[num[y]]); ++t[num[y]];if (t[num[y]]==sz) t[num[y]]=0; for (int i=l[num[y]];i<=y;++i) move(i,t[num[y]]); t[num[y]]=0; calc(num[y]); y=num[y]-1; } for (int i=x;i<=y;++i) { ++t[i]; if (t[i]==sz) t[i]=0; }}LL query(int x,int y){ LL ans=0; if (num[x]==num[y]) { for (int i=x;i<=y;++i) { ans+=cub[i][t[num[x]]]; if (ans>=Mod) ans-=Mod; } return ans; } if (x==l[num[x]]) x=num[x]; else { for (int i=x;i<=r[num[x]];++i) { ans+=cub[i][t[num[x]]]; if (ans>=Mod) ans-=Mod; } x=num[x]+1; } if (y==r[num[y]]) y=num[y]; else { for (int i=l[num[y]];i<=y;++i) { ans+=cub[i][t[num[y]]]; if (ans>=Mod) ans-=Mod; } y=num[y]-1; } for (int i=x;i<=y;++i) { ans+=Cub[i][t[i]]; if (ans>=Mod) ans-=Mod; } return ans;}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%I64d",&a[i]); block=n/floor(sqrt(n*sz)); if (!block) ++block; tot=(n-1)/block+1; for (int i=1;i<=n;++i) { num[i]=(i-1)/block+1; if (num[i]!=num[i-1]) r[num[i-1]]=i-1,l[num[i]]=i; } r[tot]=n; init(); scanf("%d",&m); for (int i=1;i<=m;++i) { opt=getchar(); while (opt!='C'&&opt!='Q') opt=getchar(); scanf("%d%d",&x,&y); if (x>y) swap(x,y); if (opt=='C') change(x,y); else printf("%I64d/n",query(x,y)); }}

總結(jié)

卡常數(shù)技巧 ①分塊大小nn?sz√ ②加法的取模改成加減 ③盡量不用乘法用加減


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天峨县| 麻城市| 寿阳县| 清流县| 龙州县| 普陀区| 家居| 酒泉市| 嫩江县| 广元市| 易门县| 安塞县| 呈贡县| 隆昌县| 田东县| 大悟县| 察哈| 余庆县| 南乐县| 巴林左旗| 北辰区| 彭泽县| 黄大仙区| 东乡县| 甘洛县| 高平市| 玛纳斯县| 重庆市| 静乐县| 龙口市| 敦化市| 舒城县| 柳林县| 海口市| 阜新市| 新和县| 莫力| 子洲县| 昌图县| 宝坻区| 比如县|