【MX-S1】梦熊周赛 · 提高组 1(同步赛)
【MX-S1】梦熊周赛 · 提高组 1(同步赛)
\(T1\) luogu P10672 【MX-S1-T1】壁垒 \(100pts\)
-
一个简单的结论:随着前缀长度的增长,出现的数字种类数每次只能增加 \(0\) 或 \(2\)。考虑构造时可以从这里下手。
-
一种构造方案是这样的:优先让数字种类数增加 \(2\),即先将原先没有出现过的数往前放;接着让数字种类数增加 \(0\),即后将原先出现过的数往后放。
- 同时,也解释了当 \(1 \sim n\) 中出现的数字种类数是奇数时不存在这样的重排方式。
-
找重复元素时可以借助
unique
函数,但需要注意的是unique
函数对于重复的元素并不是将其删除,而是将其移动赋值,可能会覆盖先前的数,可参考 C++ 手册,故可以使用一个桶来进行手动统计。点击查看代码
int a[100010],vis[100010]; int main() { int n,m,i,j; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; vis[a[i]]++; } sort(a+1,a+1+n); m=unique(a+1,a+1+n)-(a+1); if(m%2==0) { for(i=1;i<=m;i++) { vis[a[i]]--; cout<<a[i]<<" "; } for(i=1;i<=n;i++) { for(j=1;j<=vis[i];j++) { cout<<i<<" "; } } } else { cout<<"-1"<<endl; } return 0; }
\(T2\) luogu P10673 【MX-S1-T2】催化剂 \(100pts\)
-
从贪心的角度分析,当小 K 有 \(x(x \ge k)\) 个同种糖果时,将其分给 \(k\) 个小朋友时尽可能平均发是最优情况,此时产生的愤怒值为 \(x-k\)。
-
那么,设出现次数 \(\ge k\) 的糖果分别为 \(b_{1},b_{2},b_{3}, \dots ,b_{m}\),其出现次数分别为 \(c_{1},c_{2},c_{3}, \dots ,c_{m}\),最终有 \(\sum\limits_{i=1}^{m}c_{i}-mk\) 即为所求。其中,\(\sum\limits_{i=1}^{m}c_{i}\) 和 \(m\) 均可通过权值树状数组维护。
-
注意及时删除因修改造成的影响及树状数组中下标为 \(0\) 对操作中的影响。
点击查看代码
ll c[2][3000010],vis[3000010]; ll lowbit(ll x) { return x&(-x); } void add(ll n,ll x,ll key,ll c[]) { for(ll i=x;i<=n;i+=lowbit(i)) { c[i]+=key; } } ll getsum(ll x,ll c[]) { ll ans=0; for(ll i=x;i>=1;i-=lowbit(i)) { ans+=c[i]; } return ans; } int main() { ll n,q,pd,x,i; scanf("%lld%lld",&n,&q); for(i=1;i<=n;i++) { scanf("%lld",&x); if(vis[x]!=0) { add(3000000,vis[x],-1,c[0]); add(3000000,vis[x],-vis[x],c[1]); } vis[x]++; if(vis[x]!=0) { add(3000000,vis[x],1,c[0]); add(3000000,vis[x],vis[x],c[1]); } } for(i=1;i<=q;i++) { scanf("%lld%lld",&pd,&x); if(pd==1) { if(vis[x]!=0) { add(3000000,vis[x],-1,c[0]); add(3000000,vis[x],-vis[x],c[1]); } vis[x]++; if(vis[x]!=0) { add(3000000,vis[x],1,c[0]); add(3000000,vis[x],vis[x],c[1]); } } if(pd==2) { if(vis[x]!=0) { add(3000000,vis[x],-1,c[0]); add(3000000,vis[x],-vis[x],c[1]); } vis[x]--; if(vis[x]!=0) { add(3000000,vis[x],1,c[0]); add(3000000,vis[x],vis[x],c[1]); } } if(pd==3) { printf("%lld\n",getsum(3000000,c[1])-getsum(x-1,c[1])-(getsum(3000000,c[0])-getsum(x-1,c[0]))*x); } } return 0; }
\(T3\) luogu P10674 【MX-S1-T3】电动力学
- 不会,暂时咕了。
\(T4\) luogu P10675 【MX-S1-T4】先见之明
- 不会,暂时咕了。
总结
- \(T1\)
- 慎用 STL 。
- \(T2\)
- 注意动态插入需要的空间,同平衡树相关应用。
- 注意大量输入、输出对时间损耗的影响。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18275660,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。