頹頹頹
題目大意:給你m個區間詢問,詢問區間內有多少個不相同的數以及存不存在一種數字組成的數列為等差間隔的數列。
解:離線詢問,不相同的數其實是老做法了,但是巧妙的是數字是否為等差間隔。我們把詢問按右區間排序,可知等差間隔必然是連續的一段,那麼從當前列舉點往左,合法數列必然是連續的一段,那麼我們用樹狀陣列+1-1維護區間延伸到**,然後詢問[l,i]當中和是否為零就知道有沒有符合的連續一段等差間隔數列了。
順便這題官解是莫隊,正好我也去研究一下莫隊吧,現在先貼乙個離線nlogn的做法,遞迴學會莫隊後再來補充。
1 #include 2 #includecf 351d3 #include 4 #include 5 #include 6 #include 7 #include 8 #include
9 #include 10 #include 11 #include 12 #include 13 #include 14
15using
namespace
std;
1617
const
double eps = 1e-8;18
19#define abs(x) ((x)<0?(-(x)):(x))
20#define sqr(x) ((x)*(x))
21#define min(a,b) ((a)
22#define max(a,b) ((a)>(b)?(a):(b))
2324
#define lson(x) ((x)<<1)
25#define rson(x) (((x)<<1)+1)
26#define lowbit(x) ((x)&(-(x)))
27#define maxs 1111
28#define maxn 222222
29#define voidpoint 0
30#define ll long long
31#define oo 214748364
32#define inf 0x3f3f3f3f
33#define mp(x,y) make_pair(x,y)
3435
struct
treearray
41void add(int x, int num = 1
) 47}48
intget(int
x) 54
return
res;55}
5657
} color, sl;
5859
struct
query
62bool
operator
< (const query &rhs) const
65} q[maxn];
6667
inta[maxn], n, m, ans[maxn];
68int
pre[maxn], f[maxn], last[maxn];
6970
intmain() else
88 f[i] =f[pre[i]];
89 } else
90 f[i] = -1
;91 last[a[i]] =i;92}
93 scanf("
%d", &m);
94for (int i = 0; i < m; ++i)
98 sort(q, q+m);
99100
101for (int i = 1, j = 0; i <= n; ++i) else
112 } else
115116
while (j < m && q[j].r ==i)
130}
131}
132133
for (int i = 0; i < m; ++i) printf("
%d\n
", ans[i]);
134135
return0;
136 }
CF301D(樹狀陣列,離線統計,區間求和)
cf 301d 題目大意 一段序列 只包含1 n 乙個數如果是另乙個數 包括本身 的因子則成為一對,求某個區間內的對數 大概思路 記錄每個數的位置 離線操作 i從左往右掃一遍,判斷a i j 1 j n a i 的位置p,如果p i,則在i位置上加一 如果p i,則在p位置上記錄i,當再次掃到p時在...
cf 1187D 逆序對(線段樹)
題意 給你兩個均有n個數的陣列,現在你可以對a陣列中的任意區間進行sort操作,問你在sort完之後能不能得到b陣列。做法 這個是真的想不到啊。想法2200分的題目,大概的意思就是,因為可以對其中的任意區間進行操作,等於是去找逆序對的樣子,for每個數,當前數字在原陣列位置前不能有更小的未被消去的值...
bzoj 3339 線段樹離線處理
題意 給定乙個n個數的序列,多次詢問,每次詢問區間 l,r 的mex 直接暴力顯然不可 區間 l,r 和區間 l r mex的情況 1 l,r 和 l r 的mex值不同 l,r 的mex值在 l r 中出現 或 原本在 l,r 中存在而不在 l r 中存在從而成為 l r 的mex值 反之同理 2...