題意: 給你n個數, q次詢問, 每次詢問 有
題解:如果這題不帶修改,很多人都會想到,直接用主席樹維護乙個最大值最小值, 然後查詢區間不同數的個數, 如果不同數的個數等於maxn - minn + 1 那麼這個區間一定合法。
主席樹比較麻煩?
那就用線段樹維護乙個最大乙個最小值, 乙個這個數第一出現的位置的最小值。
如果 maxn - minn == r - l 且 min_pos > r那麼一定是個合法的區間。
但是這題帶修改怎麼辦呢?
有一種非常的巧妙的想法, 類似有hash
可以線段樹維護乙個區間和, 區間異或和, 區間乘積, 區間最大值, 區間最小值。
如果maxn - minn == r - l
在判斷區間和, 區間異或和, 區間乘積是否都和連續的值相等, 如果相等這個區間大概率符合。
維護的東西越多, 錯誤率就越低。
但是這題卡空間, 因為修改操作都是小於n的所有 沒用修改的直接用上面的線段樹方法查詢答案, 之前修改過了
在用這個hash的方法解決這個問題。
#includeusing namespace std;
typedef long long ll;
const int n = 5e5 + 7;
const ll mod = 1e9 + 7;
struct segment
}tree[4 * n];
#define m (l + r) / 2
#define lson 2 * node
#define rson 2 * node + 1
int a[n];
void build(int l, int r, int node)
build(l, m, lson);
build(m + 1, r, rson);
tree[node] = tree[lson] + tree[rson];
}segment query(int ql, int qr, int l, int r, int node)
segment ans;
ans.maxn = 0, ans.minn = int_max, ans.mul = 1, ans.o = 0, ans.sum = 0;
ans.min_pos = 1000000000, ans.ok = 0;
if (ql <= m)
if (qr > m)
return ans;
}void update(int v, int pos, int l, int r, int node)
if (pos <= m) update(v, pos, l, m, lson);
else update(v, pos ,m + 1, r, rson);
tree[node].min_pos = min(tree[lson].min_pos, tree[rson].min_pos);
}void up(int v, int pos, int l, int r, int node)
if (pos <= m) up(v, pos, l, m, lson);
else up(v, pos, m + 1, r, rson);
tree[node] = tree[lson] + tree[rson];
}int vis[25000007];
long long sum[2 * n], cnt[2 * n], mul[2 * n];
ll ksm(ll x, ll y)
x = x * x % mod;
y = y / 2;
}return base;
}inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int main()
mul[0] = 1;
for (int i = 1; i < 2 * n; i++)
build(1, n, 1);
for (int i = n; i; i--) else
vis[a[i]] = i;
}while (q--) else else
} else
} else else }}
}}
P3792 由乃與大母神原型和偶像崇拜
給你乙個序列a 每次兩個操作 1.修改x位置的值為y 2.查詢區間l,r是否可以重排為值域上連續的一段 輸入格式 第一行兩個數n,m 第二行n個數表示a i 後面m行每行三個數opt x y,或者opt l r,代表操作 輸出格式 如果可以,輸出 damushen 否則輸出 yuanxing 輸入樣...
luogu P3792 由乃與大母神原型和偶像崇拜
無 n nn個數,若干組詢問,每一次詢問 l,r l,r l,r 中是否經過排序可以形成值域嚴格上公升的序列。顯然用分塊的思想 記錄上乙個和當前相等的數是否在當前塊外 很容易實現,參見hh的項鍊 有些類似,好像不是一回事,但我找不到之前做的這樣的題了 但時間複雜度卻承受不了。於是想到了線段樹來維護,...
luogu P3792 由乃與大母神原型和偶像崇拜
題面傳送門 可以算一道線段樹維護hash的模板題了吧。hash要滿足兩個條件 相同的數hash值一定一樣與hash衝突盡量少。這道題hash序列可以用冪次方來hash 然後用線段樹隨便維護一下就好了。實現 include include define max a,b a b a b define m...