第一场补题AK场(纪念一下下

A:给你N个数 求最多怎么分类使和为3的个数最多

水题直接分类讨论即可

#include <bits/stdc++.h>
#define N 200005
using namespace std;
int main(){int n;cin>>n;int cnt1=0;int cnt2=0;int t;for(int i=1;i<=n;i++) {cin>>t;if(t==1) cnt1++;else cnt2++;}int ans=0;if(cnt2>cnt1){cout<<cnt1<<endl;return 0;}else{ans+=(cnt2);cnt1-=cnt2;ans+=(cnt1/3);cout<<ans<<endl;return 0;}return 0;
} 

B:给你N个数字 问这些数字可不可能是一年中连续出现的月份(可能是闰年)

(from sb红) 由n<24可知,输入的的月份最多跨三个年份,由此可以构造出一个连续年中的月份天数表,只要将输入序列与表相比较,匹配则输出YES,反之NO。

关于表的构造:第一种是比赛的时候写的那种,分1无闰年,2第一年闰,3第二年闰,4第三年闰四种情况。第二种是构造一个长度为六年的表(如:闰平平平闰平)即可包括第一种的所有情况。
关于匹配:都是常数级别直接暴力匹配即可,闲的无聊可以用KMP优化匹配 
#include<bits/stdc++.h>
using namespace std;
int a[30];
int b[10][36]={{31,28,31,30,31,30,31,31,30,31,30,31,   31,28,31,30,31,30,31,31,30,31,30,31,   31,28,31,30,31,30,31,31,30,31,30,31,}
,{31,29,31,30,31,30,31,31,30,31,30,31,   31,28,31,30,31,30,31,31,30,31,30,31,   31,28,31,30,31,30,31,31,30,31,30,31,}
,{31,28,31,30,31,30,31,31,30,31,30,31,   31,29,31,30,31,30,31,31,30,31,30,31,   31,28,31,30,31,30,31,31,30,31,30,31,}
,{31,28,31,30,31,30,31,31,30,31,30,31,   31,28,31,30,31,30,31,31,30,31,30,31,   31,29,31,30,31,30,31,31,30,31,30,31,}};
int main()
{int n,k;bool ans=false;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);for(int i=0;i<4;i++)for(int j=0;j<36;j++){if(a[0]==b[i][j]){for(k=1;k<n;k++)if(a[k]!=b[i][k+j])break;if(k==n) ans=true;}}if(ans) printf("YES\n");else printf("NO\n");return 0;
}

C:给一个数字n 问如何对1-n这个数字进行分类 使两类和的绝对值之差最小 输出这个最小值 并输出任意一类的数字

题解:贪心题 从后往前 判断这个数加入哪一堆 只需要模拟这个过程最符合条件即可

#include <bits/stdc++.h>
using namespace std;
int ab(int a,int b){int t=a-b;if(t>0) return t;else return -1*t;
}
int main(){int n;cin>>n;int cnt1=0;int cnt2=0;vector<int>v1;vector<int>v2;for(int i=n;i>=1;i--){if(cnt1==cnt2){v1.push_back(i);cnt1+=i;}else if(ab(cnt1+i,cnt2)<ab(cnt2+i,cnt1)){v1.push_back(i);cnt1+=i;}else{v2.push_back(i);cnt2+=i;}}cout<<ab(cnt1,cnt2)<<endl;cout<<v1.size();for(int i=0;i<v1.size();i++){cout<<" "<<v1[i];}cout<<endl;return 0;
}

D:form(jlz)

思路就是先根据n+(n-1)找出满足条件的最大末尾连续9的个数,比如50就是99,最大就是两个9,只有99满足,而1到50中相加能等于99就只有50+49,即min(n-99/2,99/2)
可以看出当n+n-1={9,99,999,9999,99999,999999,9999999,99999999,999999999}时为1;
当n+n-1<9时为n*(n-1)/2;
其余情况则保持9的个数为最大,将首位从本来的数枚举到0,然后每次对枚举的那个数(假设为x&&x<n+n-1
)算出min(n-x/2,x/2),比如对于12来说,12+11=23,枚举首位从2到0
1.x=29,29>23,继续枚举,x=19,19<23,则ans+=min(12-19/2,19/2),继续枚举,x=9<23,则ans+=min(12-9/2,9/2);最后ans=3+4=7
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000010
ll n,s,weishu,ans,shouwei,tt;
ll qaq[]={9,99,999,9999,99999,999999,9999999,99999999,999999999};
void cal(){for(int i=0;i<9;i++){if(s==qaq[i]){cout<<1<<endl;exit(0);}} tt=upper_bound(qaq,qaq+9,s)-qaq;if(tt==0){cout<<n*(n-1)/2<<endl;exit(0);}elsett=qaq[tt-1];ll aa=s;while(aa){weishu++;if(aa<10)shouwei=aa;aa/=10;}
}
int main(){while(cin>>n){weishu=0,shouwei=0,tt=0,ans=0;s=2*n-1;cal();for(int i=shouwei;i>=0;i--){ll qq=i;for(int j=weishu;j>1;j--){qq*=10;}qq+=tt;if(qq>s){continue;}ans+=min(n-qq/2,qq/2);}cout<<ans<<endl;}return 0;
} 

E:题意:给你n个数 每次去掉连续次数最多的一串数(如果有多个 应优先删除靠左边的)

直接线段树合并维护最长连续区间 对于已经删除的区间不进行合并即可 细节挺多,对拍好久找出WA点

#include <iostream>
#include <algorithm>
#include <cstdio>
#define ll long long
#define N 200005
using namespace std;
typedef struct node{int l,r,l2,r2;ll l1;ll r1;int len1;int len2;int len;int id;int id1;int flag;
}node;
node d[N<<2];
ll a[N];
void push(int root){if(d[root].flag==1){d[root<<1].l1=0;d[root<<1].r1=0;d[root<<1].len1=0;d[root<<1].len2=0;d[root<<1].len=0;d[root<<1].id=d[root<<1].l;d[root<<1].id1=d[root<<1].r;d[root<<1|1].l1=0;d[root<<1|1].r1=0;d[root<<1|1].len1=0;d[root<<1|1].len2=0;d[root<<1|1].len=0;d[root<<1|1].id=d[root<<1|1].l;d[root<<1|1].id1=d[root<<1|1].r;d[root<<1].flag=1;d[root<<1|1].flag=1;d[root].flag=0;}
}
void up(int root){if(d[root<<1].l1==0&&d[root<<1|1].l1==0){d[root].l1=0;d[root].r1=0;d[root].len=0;d[root].len1=0;d[root].len2=0;d[root].id=d[root<<1].l;d[root].id1=d[root<<1|1].r;return ;}else if(d[root<<1].l1==0){d[root]=d[root<<1|1];return ;}else if(d[root<<1|1].r1==0){d[root]=d[root<<1];return ;}d[root].l1=d[root<<1].l1;d[root].r1=d[root<<1|1].r1;d[root].l=d[root<<1].l;d[root].r=d[root<<1|1].r;d[root].l2=d[root<<1].l2;d[root].r2=d[root<<1|1].r2;if(d[root<<1].len>=d[root<<1|1].len){d[root].len=d[root<<1].len;d[root].id=d[root<<1].id;d[root].id1=d[root<<1].id1;}else {d[root].len=d[root<<1|1].len;d[root].id=d[root<<1|1].id;d[root].id1=d[root<<1|1].id1;}//cout<<d[root<<1].r2<<"====="<<d[root<<1|1].l2<<endl;if(d[root<<1].r1==d[root<<1|1].l1){if(d[root<<1].len2+d[root<<1|1].len1>=d[root].len){if(d[root<<1].len2+d[root<<1|1].len1==d[root].len){d[root].id=min(d[root<<1].r2,d[root].id);d[root].id1=min(d[root<<1|1].l2,d[root].id1);}else{d[root].id=d[root<<1].r2;d[root].id1=d[root<<1|1].l2;}d[root].len=d[root<<1].len2+d[root<<1|1].len1;}if(d[root<<1].l2==d[root<<1].r) {d[root].l2=d[root<<1|1].l2;d[root].len1=d[root<<1].len1+d[root<<1|1].len1;}else d[root].len1=d[root<<1].len1;if(d[root<<1|1].r2==d[root<<1|1].l) {d[root].r2=d[root<<1].r2;d[root].len2=d[root<<1|1].len2+d[root<<1].len2;}else d[root].len2=d[root<<1|1].len2;}else{d[root].len1=d[root<<1].len1;d[root].len2=d[root<<1|1].len2;}//   cout<<d[root].l<<"=================="<<d[root].r<<" "<<d[root].r2<<endl;
}
void built(int root,int l,int r){if(l==r){d[root].l=l;d[root].r=r;d[root].l2=l;d[root].r2=r;d[root].l1=a[l];d[root].r1=a[l];d[root].len1=1;d[root].len2=1;d[root].len=1;d[root].id=l;d[root].flag=0;d[root].id1=l;return ;}int mid=(l+r)>>1;built(root<<1,l,mid);built(root<<1|1,mid+1,r);d[root].l=d[root<<1].l;d[root].r=d[root<<1|1].r;d[root].flag=0;up(root);
}
void update(int root,int l,int r,int t,int l1,int r1){if(l<=l1&&r1<=r){d[root].flag=1;d[root].l1=0;d[root].r1=0;d[root].len1=0;d[root].len2=0;d[root].len=0;d[root].id=d[root].l;d[root].id1=d[root].r;return ;}push(root);int mid=(l1+r1)>>1;if(l<=mid) update(root<<1,l,r,t,l1,mid);if(r>mid) update(root<<1|1,l,r,t,mid+1,r1);up(root);// cout<<d[root].l<<" "<<d[root].r<<" "<<d[root].id<<" "<<d[root].id1<<endl;//  cout<<d[root].l<<"======"<<d[root].r<<" "<<d[root<<1|1].len1<<" "<<d[root<<1].r2<<" "<<d[root<<1|1].l2<<endl;
}
int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);built(1,1,n);int ans=0;while(d[1].len!=0){ans++;// cout<<d[1].id<<" "<<d[1].id1<<" "<<d[1].len<<endl;      update(1,d[1].id,d[1].id1,1,1,n);}printf("%d\n",ans);return 0;
}

 F:给定n个字符 m次操作 每次删除l r区间内出现的字符ch

题解:线段树裸题维护

#include <bits/stdc++.h>
#define N 200005
using namespace std;
typedef struct node{int sum;int cnt[62];bool flag[62];
}node;
node d[N<<2];
int vis[N];
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f*x;
}
void up(int root){d[root].sum=d[root<<1].sum+d[root<<1|1].sum;for(int i=0;i<62;i++) d[root].cnt[i]=d[root<<1].cnt[i]+d[root<<1|1].cnt[i];
}
void built(int root,int l,int r){if(l==r){d[root].sum=1;d[root].cnt[vis[l]]=1;return ;}int mid=(l+r)>>1;built(root<<1,l,mid);built(root<<1|1,mid+1,r);up(root);
}
void push(int root){for(int i=0;i<62;i++){if(d[root].flag[i]){d[root<<1].sum-=d[root<<1].cnt[i];d[root<<1].cnt[i]=0;d[root<<1].flag[i]=1;d[root<<1|1].sum-=d[root<<1|1].cnt[i];d[root<<1|1].cnt[i]=0;d[root<<1|1].flag[i]=1;d[root].flag[i]=0;            }}
}
void update(int root,int l,int r,int l1,int r1,int t){if(d[root].cnt[t]==0) return ;if(l<=l1&&r1<=r){d[root].flag[t]=1;d[root].sum-=d[root].cnt[t];d[root].cnt[t]=0;return ;}int mid=(l1+r1)>>1;push(root);if(l<=mid) update(root<<1,l,r,l1,mid,t);if(r>mid) update(root<<1|1,l,r,mid+1,r1,t);up(root);
}
int ans1;
void querty1(int root,int l,int r,int e){if(l==r){ans1=l;return ;}int mid=(l+r)>>1;push(root);if(e<=d[root<<1].sum) querty1(root<<1,l,mid,e);else querty1(root<<1|1,mid+1,r,e-d[root<<1].sum);up(root);
}
void querty2(int root,int l,int r){if(d[root].sum==0)  return ;if(l==r){for(int i=0;i<62;i++){if(d[root].cnt[i]==1){ans1=i;break;}}if(ans1>=0&&ans1<=9) printf("%c",'0'+ans1);else if(ans1>=10&&ans1<=35) printf("%c",'A'+ans1-10);else printf("%c",'a'+ans1-36);    return ;}int mid=(l+r)>>1;push(root);querty2(root<<1,l,mid);querty2(root<<1|1,mid+1,r);up(root);
}
int main(){int n,m;n=read();m=read();char ch;for(int i=1;i<=n;i++){scanf(" %c",&ch);if(ch>='0'&&ch<='9') vis[i]=ch-'0';else if(ch>='A'&&ch<='Z') vis[i]=ch-'A'+10;else vis[i]=ch-'a'+36;}built(1,1,n);int l,r;for(int i=1;i<=m;i++){l=read();r=read();scanf("%c",&ch);int t;if(ch>='0'&&ch<='9') t=ch-'0';else if(ch>='A'&&ch<='Z') t=ch-'A'+10;else t=ch-'a'+36;querty1(1,1,n,l);l=ans1;querty1(1,1,n,r);r=ans1;update(1,l,r,1,n,t);}querty2(1,1,n);puts("");return 0;
}

转载于:https://www.cnblogs.com/wang9897/p/8066773.html

Codeforces Round #452 (Div. 2)相关推荐

  1. 【Codeforces Round #452 (Div. 2) C】 Dividing the numbers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] n为偶数. l = 1, r = n (l,r)放在一组 l++,r-- 新的l,r放在另外一组 直到l+1==r 这个时候,判断两 ...

  2. 【Codeforces Round #452 (Div. 2) B】Months and Years

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 闰,平,平 平,闰,平 平,平,闰 平,平,平 4种情况都考虑到就好. 可能有重复的情况. 但是没关系啦. [代码] #includ ...

  3. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  4. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  5. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  6. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  7. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  8. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  9. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

最新文章

  1. 客快物流大数据项目(六十二):主题及指标开发
  2. 多目标检测跟踪文献代码汇总
  3. iOS 消息推送原理及实现总结
  4. DB2锁表或超时解决方案
  5. 中国人工智能学会通讯——基于视频的行为识别技术 1.1 什么是行为
  6. 网站优化第一次网页加载的速度的办法与思路。
  7. (转) 微软项目管理培训笔记(一)
  8. 利用uiautomator2刷金币
  9. Sicily 1156. Binary tree 解题报告
  10. Handlebars 和 angularjs 之间的区别
  11. 【mybatis】学习笔记之conf.xml与mapper.xml配置
  12. IIS5.1安装设置-Sql Sever2008安装设置-移动端设置等必读
  13. 缓存穿透、缓存击穿、缓存雪崩概念及解决方案
  14. requests模块介绍
  15. 互动快报读报软件159份全国主流大报倾情奉献读者
  16. jk背带是什么意思_JK 制服和 LO 装 (科普向)
  17. Lync Server 2013 实战系列之七:标准版-测试内部登陆
  18. tinyint(1)和int(1)的区别
  19. 极客编程c语言,C语言教程
  20. 精准教学通为什么显示缓存服务器不可用,精准教学通学生端

热门文章

  1. 需求获取常见的方法是进行客户访谈,结合你的实践谈谈会遇到什么问题,你是怎么解决的?...
  2. 小游戏开发--Cocos引擎
  3. Xcode启动RN报错“`fsevents` unavailable“
  4. HTML+CSS制作Windows启动加载动画
  5. 利用国内镜像加快pip下载速度和成功率
  6. 力扣 填充每个节点的下一个右侧节点指针
  7. 让你每天抽出两小时陪小孩子读书,你能坚持吗?
  8. 搬家请搬家公司好还是请朋友帮忙好?
  9. 一个没有担当的领导,通常会有哪些表现?
  10. V商变现的逻辑和自媒体变现的逻辑