在那遙遠的西南有一所學校
/*被和諧部分*/
然後去參加該省省選虐場
然後某蒟蒻不會做,所以也出了乙個字串題:
給你乙個字串a,每次詢問一段區間的貢獻
貢獻定義:
每次從這個區間中隨機拿出乙個字元x,然後把x從這個區間中刪除,你要維護乙個集合s
如果s為空,你rp減1
如果s中有乙個元素不小於x,則你rp減1,清空s
之後將x插入s
由於你是大爺,平時做過的題考試都會考到,所以每次詢問你搞完這段區間的字元之後最多還有多少rp?rp初始為0
詢問之間不互相影響~
輸入格式:
第一行兩個數n,m,表示字串長度與詢問次數
之後一行n個數,表示字串
由於你是大爺,所以字符集1e9
之後m行每行兩個數,表示詢問的左右區間
輸出格式:
m行,每行乙個數表示答案
輸入樣例#1:
3 33 3 3
3 33 3
3 3
輸出樣例#1:
-1-1-1
前4個點1s,後面的點4s
對於10%的資料,是樣例
對於另外10%的資料,n,m <= 100
對於另外10%的資料,n,m <= 1000
對於另外10%的資料,n,m <= 10000
對於另外10%的資料,n,m <= 100000
對於100%的資料,n,m <= 200000
保證資料向某省省選day1t2一樣sb,大家盡情用暴力水過題吧!
沒事,你只要在乙個好學校,就算這題只能拿到10分,也可以進隊了
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8#define hh 10
9using
namespace
std;
10const
int maxn=2000001;11
void read(int &n)
1216
while(c>='
0'&&c<='9'
)17
18 flag==1?n=-x:n=x;19}
20int
n,m;
21int
pos[maxn];
22int
base;23
int rp=0;24
struct
node
25q[maxn];
28struct
dr29
a[maxn];
32int comp(const node & a,const node &b)
3339
int cop(const dr &a,const dr &b)
4043
記錄i出現了多少次
44int cnt[maxn];//
記錄出現次數為j的有多少
45int
out[maxn];
46void dele(int
p)47
54void add(int
p)55
62int
ls[maxn];
63void
modui()
6478
for(int i=1;i<=m;i++)
79 printf("
%d\n
",out
[i]);80}
81int
main()
8294
//for(int i=1;i<=n;i++)
95//
pos[i]=(i-1)/base+1;
96int sqt=0;97
for ( sqt=1; sqt*sqt<=n; sqt++);
9899
for (int i=1; i<=n; i++) pos[i]=i/sqt;
100101 cnt[0]=j;
102for(int i=1;i<=m;i++)
103108 sort(q+1,q+m+1
,comp);
109modui();
110return0;
111 }
P3709 大爺的字串題
p3709 傳送門 lxl出的語文題 其實轉化一下就是求將當前區間最少拆分成多少個嚴格單調上公升序列 可不連續 再轉化一下就是求區間內的眾數個數 本來求眾數的套路是主席樹 二分 這樣在刪除時僅當 sum cnt dat pos 1 時才減少 cur include using namespace s...
P3709 大爺的字串題 腦子 莫隊
簡化題意 區間眾數出現次數?為什麼?原因是,貪心的想,我們要劃分成盡量少的嚴格遞增序列,這樣rp掉的最少。設區間眾數出現次數為 x 那我們至少要分成 x 段嚴格上公升序列。include include include include include define r register int us...
P3709 大爺的字串題 莫隊 結論
p3709 大爺的字串題 有乙個顯然的結論 一段區間裡最小答案為眾數的個數 用莫隊來離線求眾數 tmp i 表示出現 i 次的數的個數,num i 表示 i 出現的次數 縮小區間 答案可能減小,看答案所在的 tmp 是否不唯一 擴大區間 答案增大 includetypedef int ll cons...