Codeforces#371 Div2
这是一场非常需要总结的比赛,交了3题,最后终测的时候3题全部没过,一下掉到了绿名,2333
Problem A
题意:给定区间[l1,r1],[l2,r2],然后给定一个整数k,求区间当中相交的元素,k这个点不可算
分析:画图即可得出答案,注意两个l1和r2,以及r1和l2刚好重合的情况,赛场上就是漏电这种情况
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 else 41 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 else 59 cout<<"1"<<endl; 60 } 61 else{ 62 if(r2>=r1){ 63 if(k>=l1&&k<=r1) 64 cout<<r1-l1<<endl; 65 else 66 cout<<r1-l1+1<<endl; 67 }else{ 68 if(k>=l1&&k<=r2) 69 cout<<r2-l1<<endl; 70 else 71 cout<<r2-l1+1<<endl; 72 } 73 } 74 } 75 } 76 return 0; 77 }
Problem B
题意:给定一串数,问是否可以都加上或者减去同一个数1次或0次,让所有数最后都相等
分析:用set进行维护,统计其中不同元素的个数,若小于3个,肯定可以;若大于3个,肯定不行;若等于3个,判断一下是否中间一个是另外两个的平均数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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]的个数即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
Problem D
交互题,不会做
Problem E
题意:对一个序列里面的每个元素,可以加1或者减1,问怎么样才能经过最少操作使其变成严格上升的
分析:对于非严格上升的情况参看POJ3666,下面我来说说严格上升的的情况,因为a[i]<a[i+1],所以a[i]<=a[i+1]-1,故a[i]-i<=a[i+1]-(i+1),这样就又回到了非严格上升,直接做即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=3020; 15 long long a[maxn],b[maxn]; 16 long long dp1[maxn][maxn]; 17 int n; 18 bool cmp(int x,int y) 19 { 20 return x>y; 21 } 22 int main() 23 { 24 while(cin>>n) 25 { 26 for(int i=0;i<n;i++) 27 cin>>a[i]; 28 for(int i=0;i<n;i++){ 29 a[i]-=i; 30 b[i]=a[i]; 31 } 32 sort(b,b+n); //求上升的情况 33 memset(dp1,0,sizeof(dp1)); 34 for(int i=0;i<n;i++){ 35 long long minx=dp1[i][0]; 36 for(int j=0;j<n;j++){ 37 minx=min(minx,dp1[i][j]); 38 dp1[i+1][j]=minx+abs(a[i]-b[j]); 39 } 40 } 41 long long min_up=dp1[n][0]; 42 for(int i=1;i<n;i++){ 43 min_up=min(min_up,dp1[n][i]); 44 } 45 cout<<min_up<<endl; 46 } 47 return 0; 48 }