首页 > 代码库 > 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 }
View Code

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 }
View Code

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 }
View Code

 

Codeforces#371 Div2