首页 > 代码库 > Codeforces#371 Div2
Codeforces#371 Div2
这是一场非常需要总结的比赛,交了3题,最后终测的时候3题全部没过,一下掉到了绿名,2333
Problem A
题意:给定区间[l1,r1],[l2,r2],然后给定一个整数k,求区间当中相交的元素,k这个点不可算
分析:画图即可得出答案,注意两个l1和r2,以及r1和l2刚好重合的情况,赛场上就是漏电这种情况
1 // 2 // main.cpp 3 // Codeforces 4 // 5 // Created by wanghan on 16/9/14. 6 // Copyright © 2016年 wanghan. All rights reserved. 7 // 8 9 #include<iostream>10 #include<cstdio>11 #include<cstring>12 #include<string>13 #include<cmath>14 #include<vector>15 #include<algorithm>16 #include<map>17 #include<set>18 #include<deque>19 #include<queue>20 #include<stack>21 #include<cctype>22 using namespace std;23 long long l1,r1,l2,r2,k;24 int main(int argc, const char * argv[]) {25 // insert code here...26 while(cin>>l1>>r1>>l2>>r2>>k)27 {28 if(l1<=l2){29 if(l2>r1){30 cout<<"0"<<endl;31 }else if(l2==r1){32 if(l2==k)33 cout<<"0"<<endl;34 else cout<<"1"<<endl;35 }36 else{37 if(r1>=r2){38 if(k>=l2&&k<=r2)39 cout<<r2-l2<<endl;40 else41 cout<<r2-l2+1<<endl;42 }else{43 if(k>=l2&&k<=r1){44 cout<<r1-l2<<endl;45 }else{46 cout<<r1-l2+1<<endl;47 }48 }49 }50 }51 else {52 if(l1>r2){53 cout<<"0"<<endl;54 }else if(l1==r2)55 {56 if(k==l1)57 cout<<"0"<<endl;58 else59 cout<<"1"<<endl;60 }61 else{62 if(r2>=r1){63 if(k>=l1&&k<=r1)64 cout<<r1-l1<<endl;65 else66 cout<<r1-l1+1<<endl;67 }else{68 if(k>=l1&&k<=r2)69 cout<<r2-l1<<endl;70 else71 cout<<r2-l1+1<<endl;72 }73 }74 }75 }76 return 0;77 }
Problem B
题意:给定一串数,问是否可以都加上或者减去同一个数1次或0次,让所有数最后都相等
分析:用set进行维护,统计其中不同元素的个数,若小于3个,肯定可以;若大于3个,肯定不行;若等于3个,判断一下是否中间一个是另外两个的平均数
1 // 2 // main.cpp 3 // CodeforcesB 4 // 5 // Created by wanghan on 16/9/14. 6 // Copyright © 2016年 wanghan. All rights reserved. 7 // 8 9 #include<iostream>10 #include<cstdio>11 #include<cstring>12 #include<string>13 #include<cmath>14 #include<vector>15 #include<algorithm>16 #include<map>17 #include<set>18 #include<deque>19 #include<queue>20 #include<stack>21 #include<cctype>22 using namespace std;23 const int maxn=100010;24 int a[maxn];25 int n;26 int main()27 {28 while(cin>>n)29 {30 set<int> s;31 set<int>::iterator iter;32 for(int i=1;i<=n;i++){33 cin>>a[i];34 int x=a[i];35 s.insert(x);36 }37 if(s.size()<3){38 cout<<"YES"<<endl;39 }else if(s.size()>3){40 cout<<"NO"<<endl;41 }else{42 int b[5];43 int cnt=0;44 for(iter=s.begin();iter!=s.end();iter++){45 b[cnt]=*iter;46 cnt++;47 }48 int num=b[0]+b[2];49 if(b[1]*2==num)50 cout<<"YES"<<endl;51 else cout<<"NO"<<endl;52 }53 }54 }
Problem C
题意:+代表往集合里面加一个元素,-代表删除集合里面的这个元素,每个元素按位%2得到一个,?表示统计集合当中有多少个数按位%2等于要求的值
分析:用map来进行维护,+时p[num]++,-时p[num]--,?求出p[num]的个数即可
1 // 2 // main.cpp 3 // Codeforces 4 // 5 // Created by wanghan on 16/9/17. 6 // Copyright © 2016年 wanghan. All rights reserved. 7 // 8 9 #include<iostream>10 #include<cstdio>11 #include<cstring>12 #include<string>13 #include<cmath>14 #include<stack>15 #include<queue>16 #include<vector>17 #include<set>18 #include<algorithm>19 #include<map>20 using namespace std;21 map<long long,int> p;22 int t;23 int main()24 {25 cin>>t;26 while(t--)27 {28 char ch[10];29 char s[20];30 scanf("%s %s",ch,s);31 int len;32 if(ch[0]==‘+‘||ch[0]==‘-‘){33 long long ans=0;34 len=strlen(s);35 for(int i=0;i<len-1;i++){36 long long t=(s[i]-‘0‘);37 ans=ans+t%2;38 ans*=10;39 }40 ans+=(s[len-1]-‘0‘)%2;41 //cout<<ans<<endl;42 if(ch[0]==‘+‘) p[ans]++;43 else p[ans]--;44 }else{45 long long ans1=0;46 len=strlen(s);47 for(int i=0;i<len-1;i++){48 long long t1=(s[i]-‘0‘);49 ans1=ans1+t1;50 ans1*=10;51 }52 ans1+=(s[len-1]-‘0‘)%2;53 cout<<p[ans1]<<endl;54 }55 }56 }
Codeforces#371 Div2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。