掉分经过##

难得这次时间比较好,下午17:35开始。

本来还很高兴,心想这回肯定不会犯困,没准排名能再上升一些呢,,可惜事与愿违……

上来a题,光看懂题就花了一些时间。

然后开始写,结果第一遍CE,第二遍WA……

出师不利啊!气急败坏,暂时放弃。

然后看b题。

惊喜地发现这类似的题我做过,大概是个bfs?嗯dp也行?

结果发现\(n \leq 10^9\)...真不妙。

这时来了个有关a题的通知,于是又回去看a题。

终于找到之前代码中的问题了,过了pretest

接着c和d题做的还算顺利,1个小时时都过了pretest

剩一个小时,3道题。

e和f看完都没什么好的想法,e想用区间dp,f想用线段树,但好像都不太行……

我又开始慌了……呜哇哇哇啊呀呀呀……

于是又回去看b题

发现居然有约1700人过了b的pretest,我猜这肯定不是道难题。

可能是个鬼畜的贪心?

嗯,想啊想啊想才终于想出来。

交了一发,TLE...又一发,WA...第三发,过了。

此时离比赛结束还有6分钟……

好了,安心下楼吃晚饭吧。

于是,就这样,比了最颓的一场cf...

终测4道题都过了,但由于太慢了,所以排名哗哗向下掉啊…QwQ


题解##

A. Points on the line###

定义一个集合diameter为该集合中的 最大数-最小数

给定一个n元素的集合与 d,求最少去掉原集合中多少个数后该集合的diameter不超过d

输入的所有数据皆\(\leq100\)

想法###

枚举集合中最后剩下的最大值

用这个最大值-d得到集合中可剩下的最小值

找出要去掉的数最少的即可。

代码###

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N = 105;
  6. int cnt[N],a[N];
  7. int n,k;
  8. int main()
  9. {
  10. scanf("%d%d",&n,&k);
  11. for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  12. sort(a+1,a+1+n);
  13. cnt[0]=0;
  14. for(int i=1;i<=n;i++) cnt[a[i]]++;
  15. for(int i=1;i<=100;i++) cnt[i]+=cnt[i-1];
  16. if(n==1) { printf("0\n"); return 0;}
  17. int ans=n,f;
  18. for(int i=n;i>0;i--){
  19. if(a[i]>k) ans=min(ans,n-cnt[a[i]]+cnt[a[i]-k-1]);
  20. else ans=min(ans,n-cnt[a[i]]);
  21. }
  22. printf("%d\n",ans);
  23. return 0;
  24. }

B. Our Tanya is Crying Out Loud###

给定n,k,A,B

设x一开始等于n

x每减1的代价为A,x每/k(前提为x是k的倍数)的代价为B

求将x变为1所需的最小代价

所有输入数据\(\leq 10^9\)

想法一###

dp[i]表示从n变到i的最小代价

dp[i]=min{dp[i+1]+A,dp[i \(\dots\) k]+B}

但n太大了,时间空间都不行。

想法二###

贪心。

先把x不断减1直到x为k的倍数

我们发现,若要x变成x/k,直接/k的代价比一点点减还大的话,直接减,一直减到1就行了,否则直接/k

循环这个过程

代码###

贪心

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = 1000000005;
  7. int n,k,A,B;
  8. int main()
  9. {
  10. scanf("%d%d%d%d",&n,&k,&A,&B);
  11. ll ans=0;
  12. int x=n,y;
  13. while(x>1){
  14. if(x%k==0) {
  15. if((ll)B>=((ll)x-x/k)*A) {
  16. ans+=(ll)A*(x-1);
  17. x=1;
  18. }
  19. else {
  20. ans+=B;
  21. x=x/k;
  22. }
  23. }
  24. else {
  25. y=max(((x-1)/k)*k,1);
  26. ans+=((ll)x-y)*A;
  27. x=y;
  28. }
  29. }
  30. printf("%lld\n",ans);
  31. return 0;
  32. }

C. Phone Numbers###

给定n,k及一个长度为n的字符串s

求一个长度为k的字符串t,t由出现在s中的字母组成,且t为满足条件的字典序比s大的第一个字符串。

想法###

贪心。

若k>n,则直接在字符串s后面补上k-n个s中的最小字符即可

否则从后面的位往前考虑,看是否能变为一个更大的字符。若可以,便变成比它大的第一个字符,后面位都变成s中的最小字符。

代码###

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int N = 100005;
  7. char s[N];
  8. int n,k,t;
  9. int cnt[30],num[30];
  10. int ans[N];
  11. int main()
  12. {
  13. char ch;
  14. scanf("%d%d",&n,&k);
  15. scanf("%s",s);
  16. for(int i=0;i<n;i++) cnt[s[i]-'a'+1]=1;
  17. for(int i=1;i<=26;i++) cnt[i]+=cnt[i-1];
  18. t=cnt[26];
  19. for(int i=0;i<n;i++) num[cnt[s[i]-'a'+1]]=s[i]-'a'+1;
  20. if(k<=n){
  21. for(int i=0;i<k;i++) ans[i]=cnt[s[i]-'a'+1];
  22. for(int i=k-1;i>=0;i--){
  23. if(ans[i]+1<=t){
  24. ans[i]++;
  25. break;
  26. }
  27. ans[i]=1;
  28. }
  29. for(int i=0;i<k;i++){
  30. ch=num[ans[i]]-1+'a';
  31. cout<<ch;
  32. }
  33. }
  34. else{
  35. for(int i=0;i<n;i++) ans[i]=cnt[s[i]-'a'+1];
  36. for(int i=n;i<k;i++) ans[i]=1;
  37. for(int i=0;i<k;i++){
  38. ch=num[ans[i]]-1+'a';
  39. cout<<ch;
  40. }
  41. }
  42. return 0;
  43. }

D. Alena And The Heater###

有两个长度为n的数组a[]和b[],其中b[]由01组成

b[1]=b[2]=b[3]=b[4]=0

有l与r

对于所有 5 ≤ i ≤ n

当 a[i], a[i - 1], a[i - 2], a[i - 3], a[i - 4] > r 且 b[i - 1] = b[i - 2] = b[i - 3] = b[i - 4] = 1时 b[i]=0

当 a[i], a[i - 1], a[i - 2], a[i - 3], a[i - 4] < l 且 b[i - 1] = b[i - 2] = b[i - 3] = b[i - 4] = 0时 b[i]=1

否则b[i]=b[i-1]

给定a[]与b[],求一组合法的l,r

想法###

从左到右扫b数组

一开始令 l=-INF,r=INF

若存在“00001”的情况,则 l > max{a[i], a[i - 1], a[i - 2], a[i - 3], a[i - 4] }

若存在“11110”的情况,则 r < min{a[i], a[i - 1], a[i - 2], a[i - 3], a[i - 4] }

不断更新l,r即可

代码###

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int N = 100005;
  7. int a[N];
  8. char b[N];
  9. int n;
  10. int maxn(int x){
  11. int ret=-1000000000;
  12. for(int i=0;i<5;i++)
  13. ret=max(ret,a[x-i]);
  14. return ret;
  15. }
  16. int minn(int x){
  17. return min(a[x],min(a[x-1],min(a[x-2],min(a[x-3],a[x-4]))));
  18. }
  19. int main(
  20. {
  21. scanf("%d",&n);
  22. for(int i=0;i<n;i++) scanf("%d",&a[i]);
  23. scanf("%s",b);
  24. int l=-1000000000,r=1000000000,f=0;
  25. for(int i=0;i<n;i++){
  26. if(f<4) f++;
  27. else{
  28. if(b[i]=='1' && b[i-1]=='0'){
  29. l=max(l,maxn(i)+1);
  30. f=1;
  31. }
  32. else if(b[i]=='0' && b[i-1]=='1'){
  33. r=min(r,minn(i)-1);
  34. f=1;
  35. }
  36. }
  37. }
  38. printf("%d %d\n",l,r);
  39. return 0;
  40. }

E. Cashback###

给定一个n元素的数组a[],给定一个数c

规定对于一个k元素的数组b[],其价值为b[]中所有元素的和 - 其中前\(\lfloor \frac{k}{c} \rfloor\)小的元素的和

将a数组分为若干个连续的子数组,求这些子数组的价值和的最小值

\(n \leq 10^5\)

想法###

贪心。

价值和最小,即去掉的前\(\lfloor \frac{k}{c} \rfloor\)小的元素的和最大

我们可以发现,若有一个长度为2c的子数组,那么考虑这个子数组前2小的两个元素i与j

若i与j同在这个子数组的前一半或后一半,那么将这个子数组分为两个长度为c的子子数组价值和会更小

若它们一个在前一半,一个在后一半,那么可以直接将这个子数组分为前后两部分。

故将a数组划分成的子数组长度为1或c

dp+单调队列优化即可

代码###

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = 100005;
  7. int a[N];
  8. ll sum[N],f[N];
  9. int que[N],head,tail;
  10. int n,c;
  11. int main()
  12. {
  13. scanf("%d%d",&n,&c);
  14. for(int i=1;i<=n;i++){
  15. scanf("%d",&a[i]);
  16. sum[i]=sum[i-1]+a[i];
  17. }
  18. for(int i=1;i<=n;i++){
  19. f[i]=f[i-1]+a[i];
  20. while(head<tail && que[head]<=i-c) head++;
  21. while(head<tail && a[que[tail-1]]>=a[i]) tail--;
  22. que[tail++]=i;
  23. if(i>=c) f[i]=min(f[i],f[i-c]+sum[i]-sum[i-c]-a[que[head]]);
  24. }
  25. printf("%lld\n",f[n]);
  26. return 0;
  27. }

F. Machine Learning###

给定一个数组a[],维护下面两种操作:

1.求一段区间[l,r]的mex

2.将a[p]的值改为x

假设在某区间中每个数出现的次数为cnt[i]

这个区间mex为cnt[]中不存在的最小的正整数

想法###

当时比赛的时候还不知道莫队算法

后来才发现原来这就是个带修改莫队的模板题

代码###

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<map>
  6. using namespace std;
  7. const int N = 200005;
  8. int read(){
  9. char ch=getchar();
  10. int x=0;
  11. if(!isdigit(ch)) ch=getchar();
  12. while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
  13. return x;
  14. }
  15. int block;
  16. inline int bl(int x) { return (x-1)/block+1; }
  17. struct que{
  18. int l,r,tim,id;
  19. bool operator < (const que &b) const{
  20. return bl(l)<bl(b.l) || (bl(l)==bl(b.l) && bl(r)<bl(b.r)) || (bl(l)==bl(b.l) && bl(r)==bl(b.r) && tim<b.tim);
  21. }
  22. }q[N];
  23. struct cg{
  24. int id,fr,to;
  25. }d[N];
  26. int n,m,cnt1,cnt2;
  27. int a[N];
  28. map<int,int> num;
  29. int nn;
  30. int size[N],cnt[N],L,R;
  31. void add(int x){
  32. size[cnt[x]]--;
  33. size[++cnt[x]]++;
  34. }
  35. void del(int x){
  36. size[cnt[x]]--;
  37. size[--cnt[x]]++;
  38. }
  39. void cg_add(cg w){
  40. if(L<=w.id && w.id<=R){
  41. del(w.fr);
  42. add(w.to);
  43. }
  44. a[w.id]=w.to;
  45. }
  46. void cg_del(cg w){
  47. if(L<=w.id && w.id<=R){
  48. del(w.to);
  49. add(w.fr);
  50. }
  51. a[w.id]=w.fr;
  52. }
  53. int ans[N];
  54. inline int query(){
  55. for(int i=1;i<=n;i++)
  56. if(size[i]==0) return i;
  57. }
  58. int main()
  59. {
  60. int opt,x,y;
  61. n=read(); m=read();
  62. for(int i=1;i<=n;i++) {
  63. a[i]=read();
  64. if(!num[a[i]]) num[a[i]]=++nn;
  65. a[i]=num[a[i]];
  66. }
  67. for(int i=1;i<=m;i++){
  68. opt=read(); x=read(); y=read();
  69. if(opt==1) q[++cnt1]=(que){x,y,cnt2,cnt1};
  70. else{
  71. if(!num[y]) num[y]=++nn;
  72. y=num[y];
  73. d[++cnt2]=(cg){x,a[x],y};
  74. a[x]=y;
  75. }
  76. }
  77. block=pow(n,0.666);
  78. sort(q+1,q+1+cnt1);
  79. L=1; R=0;
  80. int t=cnt2;
  81. for(int i=1;i<=cnt1;i++){
  82. while(R<q[i].r) add(a[++R]);
  83. while(L>q[i].l) add(a[--L]);
  84. while(R>q[i].r) del(a[R--]);
  85. while(L<q[i].l) del(a[L++]);
  86. while(t>q[i].tim) cg_del(d[t--]);
  87. while(t<q[i].tim) cg_add(d[++t]);
  88. ans[q[i].id]=query();
  89. }
  90. for(int i=1;i<=cnt1;i++) printf("%d\n",ans[i]);
  91. return 0;
  92. }

终于……

Codeforces940掉分记的更多相关文章

  1. CF480Div2掉分记

    rating 1900+参加只有Div2的比赛也记rating了.还以为yyc报名没打会惨惨,原来不交题好像就不算参加.. 本来太晚了不想打,不过有Sinogi大佬带我还是打一打吧,apio之前练练手 ...

  2. cf掉分记——Avito Code Challenge 2018

    再次作死的打了一次cf的修仙比赛感觉有点迷.. 还好掉的分不多(原本就太低没法掉了QAQ) 把会做的前三道水题记录在这.. A: Antipalindrome emmmm...直接暴力枚举 code: ...

  3. Codeforces Round#402(Div.1)掉分记+题解

    哎,今天第一次打div1 感觉头脑很不清醒... 看到第一题就蒙了,想了好久,怎么乱dp,倒过来插之类的...突然发现不就是一道sb二分吗.....sb二分看了二十分钟........ 然后第二题看了 ...

  4. Codeforces Round 480 Div 2 光荣掉分记

    痛 痛苦 痛苦啊. 越接近黄名想的越多了啊…… 都说了不要在意rating这破玩意了…… 没出E就算了,策略问题. 居然还FST了: FST个D就算了: FST个A算个**啊. 紧张的时候总会写出一些 ...

  5. CODEFORCES掉RATING记 #1

    时间:2017.7.16晚 比赛:Educational Codeforces Round 25 比赛开始前去睡觉了...开始后5min才起来 一进去就点开AB,B先加载好,就先做了B.读完题后发现是 ...

  6. CSP-J&S 2020挂分记

    应该是退役记 OI 是一门玄学--考后有感 Day -inf 找各科老师请假备考,看着我倒一倒二的好成绩分纷劝我放弃竞赛,成功请到了假. Day -1 怎么莫名其妙大家都在学些奇怪的东西? 跟风写了一 ...

  7. CSP-S2021 挂分记

    赛前 数了数,这是我第五次来南航,不知道以后还有机会了(2018 NOIP, 2019CSP, 2020CSP, 2020NOIP). 上午一觉睡到 10 点,学了一下感觉很有用的 BIT 倍增,顺手 ...

  8. CODEFORCES掉RATING记 #5

    ​ 比赛:Codeforces Round #429 (Div. 2) ​ 时间:2017.8.1晚 这次感觉状态不好,就去打div2了 ​ A:有\(26\)种颜色的气球,每种的数量不一样,你要把这 ...

  9. CODEFORCES掉RATING记 #4

    比赛:Codeforces Round #427 (Div. 2) 时间:2017.7.31晚 开场发现有6道题,都是水题(可能我只会做水题) A:比较\(2t_1+sv_1\)与\(2t_2+sv_ ...

随机推荐

  1. linux 在 open 时复制设备

    管理存取控制的另一个技术是创建设备的不同的私有拷贝, 根据打开它的进程. 明显地, 这只当设备没有绑定到一个硬件实体时有可能; scull 是一个这样的"软件"设备 的例子. /d ...

  2. MV*模式

    MV*模式 MVC框架最早出现在Java领域,然后慢慢在前端开发中也被提到,后来又出现了MVP,以及现在最成熟的MVVM. MVC model 数据模型 view 视图 controller 控制器 ...

  3. 洛谷4139 bzoj 3884 上帝与集合的正确用法

    传送门 •题意 求$2^{2^{2^{2^{2^{2^{...^{2}}}}}}}$ (无穷个2) 对p取模的值 •思路 设答案为f(p) $2^{2^{2^{2^{2^{2^{...^{2}}}}} ...

  4. koa2实现简单的验证码

    //首先引入svg-captcha,https://www.npmjs.com/package/svg-captcha const svgCaptcha = require('svg-captcha) ...

  5. flutter 安装环境 Mac

    1.这是我第二次mac 安装 flutter环境了,但是这种东西记不住.打开写一下 有用的东西 一. ls vi 等命令 command not found原因是因为环境变量的问题,编辑profile ...

  6. vue动态组件-根据数据展示特定组件

    vue中有个内置组件component,利用它可以实现动态组件,在某些业务场景下可以替换路由 假设有以下三个组件: com1.com2.com3 有一个外层路/coms中代码如下 <templa ...

  7. 使用Miniconda安装Scrapy遇到的坑

    最近在看小甲鱼的书,学习学习爬虫,其中有一块是通过Miniconda3安装Scrapy,结果却遇到了下面的错误:fatal error in launcher:unable to create pro ...

  8. apium环境搭建(mac)

    appium 环境搭建 安装homebrew(Mac OSX上的软件包管理工具) $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuse ...

  9. ELK学习实验009:安装kibana的仪表盘

    一 metricbeat仪表盘 1.1 安装metricbeat仪表盘 可以将metricbeat数据在kibana中展示 [root@node4 ~]# cd /usr/local/metricbe ...

  10. QT信号和槽函数学习笔记

    //connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...