2020.5.19
昨天學完莫隊之後重寫了一遍mcpc19的那一道區間眾數的,發現了幾個可以改進的點。乙個是離散化,港真我不知道原題是怎麼回事兒,上了離散化,後來無論是d-query還是路邊的蒲公英好像完全沒必要上離散化,畢竟是1e5個數字,開個陣列記錄下就行了,所以這部分刪掉,然後模擬一下我們查詢區間眾數出現次數的方法,首先考慮加入座標位置為x,數字為a[x],對於當前區間維護的答案的影響,首先要消除對於上一次a[x]出現的影響,那就是sum[cnt[a[x]]] -1, 然後將出現次數cnt[a[x]]加一,比較其與目前出現次數的的大小,然後將sum[cnt[a[x]]] 加一,就完成了一次維護,縮排的del函式同理,就是看sum[cnt[a[x]]] 是不是為0,如果cnt[a[x]]是目前最大次數,(因為sum[cnt[a[x]]] 是0所以是唯一最大次數),那麼就對答案進行-1,修正後的區間就是我們所需要的答案。
**如下:
#include
using
namespace std;
#define limit (10000 + 5)
//防止溢位
#define inf 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)
//一步兩步
#define eps 1e-6
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%lld\n",a );
#define pi(a,b) pair
#define rep(i, a, b) for(int i = a ; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define mod 998244353
#define fopen freopen("c:\\users\\administrator01\\clionprojects\\untitled24\\data.txt", "rt", stdin)
typedef
long
long ll;
typedef
unsigned
long
long ull;
ll read()
while
(s >=
'0'&& s <=
'9')
return x * sign;
}//快讀
void
write
(ll x)
int n, m;
struct node
bool
operator
<
(const node &rhs)
const
}query[limit]
;int cnt[limit]
,a[limit]
,sum[limit]
;int res;
void
add(
int x)
void
del(
int x)
map<
double
,int
>mp;
int tot, vis[limit]
;int
main()
else
}int block =
int(
sqrt
(n >=
3? n *
(2.0/3
): n));
//分塊
rep(i,
1, m)
sort
(query +
1, query +
1+ m)
;int l =
0, r =0;
res =0;
rep(i ,
1, m)
rep(i ,
1, m)
return0;
}
傳智杯 眾數出現的次數
題目 2315 傳智杯 眾數出現的次數 時間限制 5sec 記憶體限制 512mb 提交 318 解決 120 題目描述 傳智專修學員的課堂上,為了活躍氣氛,並鞏固位運算的知識,同學們玩起了乙個遊戲。班級裡有 n n 10 6 名同學,每位同學都獲得了兩張卡,紅卡或者黑卡。每張卡上都有乙個不超過 1...
P6365 眾數出現的次數(水)
思路 利用map,將每個同學的第乙個數字和兩個數字的異或值標記加一。但是有乙個地方需要注意一下,就是如果x x y 的話,就只加1一次就可以了,因為這個同學只能出一次牌。如下 include define ll long long define inf 0x3f3f3f3f using namesp...
詢問區間內出現次數最多的數出現的次數
poj 3368 frequent values rmq 題意 給出乙個非降序排列的整數陣列a1,a2,an,你的任務是對於一系列詢問 i,j 回答ai,ai 1,aj中出現最多次數的值所出現的次數?分析 劉汝佳 訓練指南p198 1.本題主要思想是把輸入序列分成一段段由相同值構成的序列,然後對於每...