模擬8 05 優美序列 線段樹 分塊 ST演算法

2022-05-06 22:48:08 字數 3458 閱讀 6370

如此顯然的線段樹,我又瞎了眼了

事實上跟以前的奇襲很像.......

只要滿足公式maxn-minn(權值)==r-l即可

所以可以考慮建兩顆樹,一棵節點維護位置,一棵權值,

每次從一棵樹樹上查詢資訊,如果滿足公式就停止,不然兩顆樹不斷擴充套件區間

當然也可以用st啦(查詢o(1)優於線段樹)

1 #include2 #include3 #include4 #include5 #include

6 #include

7 #include8 #include9 #include10

#define int long long

11#define maxn 100101

12using

namespace

std;

13char buffer[1

<<20|1],*s,*t;

14#define getchar() ((s==t&&(t=(s=buffer)+fread(buffer,1,1<<20|1,stdin),s==t))?eof:*s++)

15int

read()

1624

return

x;25}26

inta[maxn];

27int

maxn,minn;

28int n,m;int

binn[maxn];

29int f[21][maxn];int f_min[21][maxn];//

區間極值的最小位置,最大位置

30int wei[21][maxn];int wei_min[21

][maxn];

31void

work()

3243}44

} 45

intmaxn_wei,minn_wei;

46void rmb(int l,int

r)47

5354

void rmb_wei(int l,int

r)55

61signed main()

6270 binn[0]=1;71

for(int i=1;i<=20;++i)binn[i]=(binn[i-1]<<1

);72

work();

73 m=read();

74for(int i=1;i<=m;++i)

7584 printf("

%lld %lld\n

",minn_wei,maxn_wei);85}

86 }

80 超時

100分:

%%%%%skyh 分塊思想碾爆tarjan正解

因為每次區間不斷擴充套件可能會擴充套件好多邊,

那麼我們把區間分塊,這樣預處理出塊與塊的答案

在實際查詢中如果發現當前查詢區間大於塊的區間,那就可以判斷是否用塊跳躍

1 #include2 #include3 #include4 #include5 #include

6 #include

7 #include8 #include9 #include10

#define int long long

11#define maxn 100101

12using

namespace

std;

13int kuan[maxn];int

belong[maxn];

14char buffer[1

<<20|1],*s,*t;

15#define getchar() ((s==t&&(t=(s=buffer)+fread(buffer,1,1<<20|1,stdin),s==t))?eof:*s++)

16 inline void read(int &x)

21int

a[maxn];

22int maxn,minn;int

maxn_wei,minn_wei;

23int n,m;int

binn[maxn];

24int f[21][maxn];int f_min[21][maxn];//

區間極值的最小位置,最大位置

25int wei[21][maxn];int wei_min[21

][maxn];

26int ans_l[1000][1000

];27

int ans_r[1000][1000

];28

int tt,base;int

log[maxn];

29void rmb(int l,int r)//

通過權值查位置

3036

void rmb_wei(int l,int r)//

通過位置察權值

3743

void

work()

4455}56

for(int i=1;i

57

67 ans_l[i][j]=minn_wei;ans_r[i][j]=maxn_wei;

68//

printf("ansl[%lld][%lld] i=%lld j=%lld\n",minn_wei,maxn_wei,i,j);69}

70}71}

7273

signed main()

7486

else

87 kuan[i]=i*tt;88}

89for(int i=1;i<=n;++i)

9096 binn[0]=1;97

for(int i=1;i<=20;++i)binn[i]=(binn[i-1]<<1

);98

work();

99read(m);

100for(int i=1;i<=m;++i)

101121

}122

//printf("maxn=%lld minn=%lld maxn_wei=%lld minwei=%lld\n",maxn,minn,maxn_wei,minn_wei);

123rmb_wei(minn_wei,maxn_wei);

124if(maxn-minn==maxn_wei-minn_wei)break

;125

}126 printf("

%lld %lld\n

",minn_wei,maxn_wei);

127}

128 }

%%%天皇

WC模擬 優美的樹

眾所周知,樹是n 個節點n 1 條邊的結構,而所謂的優美的樹需要滿足如下條件 1.這是一棵有根二叉樹 2.非葉節點需有兩個兒子 3.不可以變換為k 左偏樹。所謂的k 左偏樹是指一棵有k 個葉子的樹,每個非葉節點的右兒子均為葉子且均有左兒子。所謂的變換指的是經過若干次如下兩種變換 1.刪去乙個節點的兩...

序列 線段樹

使用線段樹維護 b bb,初值為 bi b i bi 每次修改時,若乙個位置上的值變為了 0 00,則說明其會對答案產生新的貢獻,在外部使用樹狀陣列將貢獻計入答案,然後將該位置的值 重置為 bi b i bi 重置的時間複雜度是 o log n o log n o logn 考慮最壞情況,每次操作 ...

優美三角剖分 字元 模擬

description 這是一些由無窮無盡三角形組成的極為優美的圖形。由於好心的出題人,資料範圍n 10。具體圖形詳見樣例,每一階圖形都是由3個上一階圖形拼成的 input 只有一行,輸入乙個整數為n,表示要求出n階的圖形。output 輸出相應的圖形。sample input32 1 sample...