如此顯然的線段樹,我又瞎了眼了
事實上跟以前的奇襲很像.......
只要滿足公式maxn-minn(權值)==r-l即可
所以可以考慮建兩顆樹,一棵節點維護位置,一棵權值,
每次從一棵樹樹上查詢資訊,如果滿足公式就停止,不然兩顆樹不斷擴充套件區間
當然也可以用st啦(查詢o(1)優於線段樹)
1 #include2 #include3 #include4 #include5 #include80 超時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 }
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...