• 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                     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 }
    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

     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),这样就又回到了非严格上升,直接做即可

     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 }
    View Code
  • 相关阅读:
    Codeforces Round #579 (Div. 3)
    2019牛客暑期多校训练营(第一场)ABBA
    Comet OJ
    Codeforces Round #562 (Div. 2)
    Codeforces Round #569 (Div. 2)
    寒假集训总结
    线段树做题总结
    Git学习
    unity开发vuforia血的教训
    (学习13)最短圆排列问题
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5878034.html
Copyright © 2020-2023  润新知