• 2019HPU-ICPC-Training-1


    byl太强了,学弟们太强了~全程被吊打,嘤嘤嘤~

    A题  Connecting Vertices

    http://codeforces.com/problemset/problem/888/F

    不会

    B题 Local Extrema

    http://codeforces.com/problemset/problem/888/A

    给一列数字,判断一个数它的左右是否同时比它大,或者同时比它小,若满足的话那么count++,得到最后的count值,那么很明显,直接暴力的遍历一遍就可以了。

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 int a[maxn];
    12 int main(int argc, char const *argv[])
    13 {
    14     #ifndef ONLINE_JUDGE
    15         freopen("in.txt", "r", stdin);
    16         freopen("out.txt", "w", stdout);
    17         srand((unsigned int)time(NULL));
    18     #endif
    19     ios::sync_with_stdio(false);
    20     cin.tie(0);
    21     int n;
    22     cin>>n;
    23     for(int i=1;i<=n;i++)
    24         cin>>a[i];
    25     int ans=0;
    26     for(int i=2;i<n;i++)
    27     {
    28         if(a[i]<a[i-1]&&a[i]<a[i+1])
    29             ans++;
    30         if(a[i]>a[i-1]&&a[i]>a[i+1])
    31             ans++;
    32     }
    33     cout<<ans<<endl;
    34     #ifndef ONLINE_JUDGE
    35         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    36     #endif
    37     return 0;
    38 }
    View Code

    C题 Xor-MST

    http://codeforces.com/problemset/problem/888/G

    不会

    D题 Buggy Robot

    http://codeforces.com/problemset/problem/888/B

    机器人有四种指令,找出在给出的一大串指令中,最多有多少指令是正确的

    找到LR和UD有多少对,乘以2就行了

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 int main(int argc, char const *argv[])
    12 {
    13     #ifndef ONLINE_JUDGE
    14         freopen("in.txt", "r", stdin);
    15         freopen("out.txt", "w", stdout);
    16         srand((unsigned int)time(NULL));
    17     #endif
    18     ios::sync_with_stdio(false);
    19     cin.tie(0);
    20     int n;
    21     cin>>n;
    22     string s;
    23     cin>>s;
    24     map<char,int>mp;
    25     for(int i=0;i<n;i++)
    26         mp[s[i]]++;
    27     int ans=0;
    28     ans+=min(mp['L'],mp['R']);
    29     ans+=min(mp['U'],mp['D']);
    30     cout<<ans*2<<endl;
    31     #ifndef ONLINE_JUDGE
    32         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    33     #endif
    34     return 0;
    35 }
    View Code

    E题 K-Dominant Character

    http://codeforces.com/problemset/problem/888/C

    给出一个字符串,找出一个最小的长度k,使得每个长度为k的子串中都包含一个相同的字符记录下来每个字符的位置,找两个相同字符的最大距离,对这个最大距离取最小值

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 int main(int argc, char const *argv[])
    12 {
    13     #ifndef ONLINE_JUDGE
    14         freopen("in.txt", "r", stdin);
    15         freopen("out.txt", "w", stdout);
    16         srand((unsigned int)time(NULL));
    17     #endif
    18     ios::sync_with_stdio(false);
    19     cin.tie(0);
    20     string s;
    21     cin>>s;
    22     int l=s.length();
    23     vector<int>ve[30];
    24     for(int i=0;i<26;i++)
    25         ve[i].push_back(-1);
    26     for(int i=0;i<l;i++)
    27         ve[s[i]-'a'].push_back(i);
    28     for(int i=0;i<26;i++)
    29         ve[i].push_back(l);
    30     int ans=inf;
    31     for(int i=0;i<26;i++)
    32     {
    33         int res=0;
    34         int sz=ve[i].size();
    35         for(int j=1;j<sz-1;j++)
    36             res=max(res,max(ve[i][j]-ve[i][j-1],ve[i][j+1]-ve[i][j]));
    37         if(res==0)
    38             continue;
    39         ans=min(ans,res);
    40     }
    41     cout<<ans<<endl;
    42     #ifndef ONLINE_JUDGE
    43         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    44     #endif
    45     return 0;
    46 }
    View Code

    F题 Maximum Subsequence

    http://codeforces.com/problemset/problem/888/E

    给出n个数,从这n个数中选出几个数(可以不选),使得这些数的和对m取余后的值最大

    题解链接:https://www.cnblogs.com/Friends-A/p/11569017.html

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 int a[maxn];
    12 int Left[maxn];
    13 int Right[maxn];
    14 int cntl,cntr;
    15 int n,m;
    16 int main(int argc, char const *argv[])
    17 {
    18     #ifndef ONLINE_JUDGE
    19         freopen("in.txt", "r", stdin);
    20         freopen("out.txt", "w", stdout);
    21         srand((unsigned int)time(NULL));
    22     #endif
    23     ios::sync_with_stdio(false);
    24     cin.tie(0);
    25     cin>>n>>m;
    26     for(int i=0;i<n;i++)
    27         cin>>a[i],a[i]%=m;
    28     int res=0;
    29     int l,r;
    30     l=r=n/2;
    31     for(int i=0;i<(1<<r);i++)
    32     {
    33         res=0;
    34         for(int j=0;j<r;j++)
    35             if(i>>j&1)
    36                 res+=a[j],res%=m;
    37         Left[cntl++]=res;
    38     }
    39     res=0;
    40     r=n;
    41     int num=r-l+1;
    42     for(int i=0;i<(1<<num);i++)
    43     {
    44         res=0;
    45         for(int j=0;j<num;j++)
    46             if(i>>j&1)
    47                 res+=a[l+j],res%=m;
    48         Right[cntr++]=res;
    49     }
    50     Left[cntl++]=0;
    51     Right[cntr++]=0;
    52     sort(Left,Left+cntl);
    53     sort(Right,Right+cntr);
    54     cntl=unique(Left,Left+cntl)-Left;
    55     cntr=unique(Right,Right+cntr)-Right;
    56     int ans=0;
    57     for(int i=0;i<cntl;i++)
    58     {
    59         int res=m-Left[i]-1;
    60         int pos=upper_bound(Right,Right+cntr,res)-Right;
    61         int num=Right[pos-1];
    62         ans=max(ans%m,(num+Left[i])%m);
    63     }
    64     cout<<ans<<endl;
    65     #ifndef ONLINE_JUDGE
    66         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    67     #endif
    68     return 0;
    69 }
    View Code

    G题 Almost Identity Permutations

    http://codeforces.com/problemset/problem/888/D

    给出n的全排列,求有多少种排列,满足至少n−k个位置上的数和下标相同(下标从1开始)

    错排公式+组合数

    题解链接:https://www.cnblogs.com/Friends-A/p/11569153.html

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 ll C(int n,int m)
    12 {
    13     ll fenmu=1LL;
    14     ll fenzi=1LL;
    15     for(int i=1;i<=m;i++)
    16     {
    17         fenmu=1LL*fenmu*(n-i+1);
    18         fenzi=1LL*fenzi*i;
    19     }
    20     return fenmu/fenzi;
    21 }
    22 int main(int argc, char const *argv[])
    23 {
    24     #ifndef ONLINE_JUDGE
    25         freopen("in.txt", "r", stdin);
    26         freopen("out.txt", "w", stdout);
    27         srand((unsigned int)time(NULL));
    28     #endif
    29     ios::sync_with_stdio(false);
    30     cin.tie(0);
    31     int n,k;
    32     cin>>n>>k;
    33     ll ans=0;
    34     if(k>=1)
    35         ans+=1;
    36     if(k>=2)
    37         ans+=(n*(n-1)/2);
    38     if(k>=3)
    39         ans+=2*C(n,3);
    40     if(k>=4)
    41         ans+=9*C(n,4);
    42     cout<<ans<<endl;
    43     #ifndef ONLINE_JUDGE
    44         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    45     #endif
    46     return 0;
    47 }
    View Code

    H题 Alyona and Spreadsheet

    http://codeforces.com/problemset/problem/777/C

    给出一个n×m的矩阵,判断第l行~第r行中是否有一列是非递减的

    预处理每一行能往上延伸到的位置,注意矩阵的存法

    题解链接:https://www.cnblogs.com/Friends-A/p/11569247.html

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 vector<int>ve[maxn];
    12 // 当前行能往上延伸的最高位置
    13 int can[maxn];
    14 // 当前列能往上的最高位置
    15 int line[maxn];
    16 int main(int argc, char const *argv[])
    17 {
    18     #ifndef ONLINE_JUDGE
    19         freopen("in.txt", "r", stdin);
    20         freopen("out.txt", "w", stdout);
    21         srand((unsigned int)time(NULL));
    22     #endif
    23     ios::sync_with_stdio(false);
    24     cin.tie(0);
    25     int n,m;
    26     cin>>n>>m;
    27     int x;
    28     for(int i=0;i<m;i++)
    29         ve[0].push_back(0);
    30     for(int i=1;i<=n;i++)
    31         for(int j=0;j<m;j++)
    32             cin>>x,ve[i].push_back(x);
    33     for(int i=1;i<=n;i++)
    34     {
    35         can[i]=i;
    36         for(int j=0;j<m;j++)
    37         {
    38             int now_num=ve[i][j];
    39             int up_num=ve[i-1][j];
    40             if(now_num<up_num)
    41                 line[j]=i;
    42             can[i]=min(can[i],line[j]);
    43         }
    44     }
    45     int t;
    46     cin>>t;
    47     while(t--)
    48     {
    49         int l,r;
    50         cin>>l>>r;
    51         if(can[r]>l)
    52             cout<<"No
    ";
    53         else
    54             cout<<"Yes
    ";
    55     }
    56     #ifndef ONLINE_JUDGE
    57         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    58     #endif
    59     return 0;
    60 }
    View Code

    I题 Shell Game

    http://codeforces.com/problemset/problem/777/A

    现在一共有三个小盒子,其中有一个盒子中有小球.一共进行了n次操作,操作规律有:

    ①奇数次操作,交换第一个和中间的盒子。

    ②偶数次操作,交换第三个和中间的盒子。

    现在已知操作了n次之后小球在x号盒子中(0,1,2),问初始的时候小球在哪里

    循环节,每六个数字一个循环

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 int main(int argc, char const *argv[])
    12 {
    13     #ifndef ONLINE_JUDGE
    14         freopen("in.txt", "r", stdin);
    15         freopen("out.txt", "w", stdout);
    16         srand((unsigned int)time(NULL));
    17     #endif
    18     ios::sync_with_stdio(false);
    19     cin.tie(0);
    20     int a[6][3]={{0,1,2},{1,0,2},{1,2,0},{2,1,0},{2,0,1},{0,2,1}};
    21     int n,x;
    22     cin>>n>>x;
    23     n%=6;
    24     cout<<a[n][x]<<endl;
    25     #ifndef ONLINE_JUDGE
    26         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    27     #endif
    28     return 0;
    29 }
    View Code

    J题 Hanoi Factory

    http://codeforces.com/problemset/problem/777/E

    有n个空心圆柱体,第i个圆柱体的内径、外径、高分别为:ai,bi,hi。将这些圆柱体堆起来,要求:从上到下,外径非递减,并且上面的外径小于下面的内径。问最高能堆多高

    贪心,用栈维护

    题解链接:https://www.cnblogs.com/Friends-A/p/11571769.html

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 struct wzy
    12 {
    13     int a,b,h;
    14 }p[maxn];
    15 bool cmp(wzy u,wzy v)
    16 {
    17     if(u.b==v.b)
    18     {
    19         if(u.a==v.a)
    20             return u.h>v.h;
    21         return u.a>v.a;
    22     }
    23     return u.b>v.b;
    24 }
    25 int main(int argc, char const *argv[])
    26 {
    27     #ifndef ONLINE_JUDGE
    28         freopen("/home/wzy/in.txt", "r", stdin);
    29         freopen("/home/wzy/out.txt", "w", stdout);
    30         srand((unsigned int)time(NULL));
    31     #endif
    32     ios::sync_with_stdio(false);
    33     cin.tie(0);
    34     int n;
    35     cin>>n;
    36     for(int i=1;i<=n;i++)
    37         cin>>p[i].a>>p[i].b>>p[i].h;
    38     sort(p+1,p+1+n,cmp);
    39     ll ans=1LL*p[1].h;
    40     ll sum=1LL*p[1].h;
    41     stack<wzy>st;
    42     st.push(p[1]);
    43     for(int i=2;i<=n;i++)    
    44     {
    45         while(!st.empty()&&(st.top().a>=p[i].b||st.top().b<p[i].b))
    46         {
    47             sum-=1LL*st.top().h;
    48             st.pop();
    49         }
    50         sum+=1LL*p[i].h;
    51         st.push(p[i]);
    52         ans=max(ans,sum);
    53     }
    54     cout<<ans<<endl;
    55     #ifndef ONLINE_JUDGE
    56         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    57     #endif
    58     return 0;
    59 }
    View Code

    K题 Cloud of Hashtags

     http://codeforces.com/contest/777/problem/D

    n个字符串,要求不改变位置,删除最少的字符串的后缀,使这些字符串按照字典序非递减的顺序排列

    暴力即可

    题解链接:https://www.cnblogs.com/Friends-A/p/11569328.html

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 vector<string>ve;
    12 vector<string>ans;
    13 int get_place(string s1,string s2)
    14 {
    15     int l1=s1.length();
    16     int l2=s2.length();
    17     int i;
    18     for(i=0;i<min(l2,l1);i++)
    19     {
    20         if(s1[i]<s2[i])
    21             return l1;
    22         if(s1[i]==s2[i])
    23             continue;
    24         if(s1[i]>s2[i])
    25             return i;
    26     }
    27     if(i==l2)
    28     {
    29         if(l1>l2)
    30         {
    31             if(s1[i-1]==s2[i-1])
    32                 return l2;
    33             else
    34                 return l1;
    35         }
    36     }
    37     return l1;
    38 }
    39 int main(int argc, char const *argv[])
    40 {
    41     #ifndef ONLINE_JUDGE
    42         freopen("in.txt", "r", stdin);
    43         freopen("out.txt", "w", stdout);
    44         srand((unsigned int)time(NULL));
    45     #endif
    46     ios::sync_with_stdio(false);
    47     cin.tie(0);
    48     int n;
    49     cin>>n;
    50     string s;
    51     for(int i=0;i<n;i++)
    52     {
    53         cin>>s;
    54         ve.push_back(s);
    55     }
    56     string s1,s2;
    57     ans.push_back(ve[n-1]);
    58     for(int i=n-2;i>=0;i--)
    59     {
    60         s1=ve[i];
    61         s2=ans[n-(i+2)];
    62         int pos=get_place(s1,s2);
    63         string ss;
    64         ss=s1.substr(0,pos);
    65         ans.push_back(ss);
    66     }
    67     for(int i=n-1;i>0;i--)
    68         cout<<ans[i]<<endl;
    69     cout<<ve[n-1]<<endl;
    70     #ifndef ONLINE_JUDGE
    71         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    72     #endif
    73     return 0;
    74 }
    View Code

    L题 Game of Credit Cards

    http://codeforces.com/contest/777/problem/B 

    Sherlock和Moriarty有n张卡片,每个卡片上有一个数字,现在有Sherlock和Moriarty 两个人在比较这些卡片上的数字大小,小的数字需要接受惩罚,Sherlock的卡片顺序是固定的,Moriarty的卡片顺序可以随意变动,求Moriarty的最小接受惩罚次数是多少,Sherlock最大惩罚对方的次数是多少

    排序比较即可

    题解链接:https://www.cnblogs.com/Friends-A/p/11569436.html

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define ms(a,b) memset(a,b,sizeof(a))
     5 const int inf=0x3f3f3f3f;
     6 const ll INF=0x3f3f3f3f3f3f3f3f;
     7 const int maxn=1e6+10;
     8 const int mod=1e9+7;
     9 const int maxm=1e3+10;
    10 using namespace std;
    11 int s[maxn],m[maxn];
    12 int nums[100],numm[100];
    13 int main(int argc, char const *argv[])
    14 {
    15     #ifndef ONLINE_JUDGE
    16         freopen("in.txt", "r", stdin);
    17         freopen("out.txt", "w", stdout);
    18         srand((unsigned int)time(NULL));
    19     #endif
    20     ios::sync_with_stdio(false);
    21     cin.tie(0);
    22     int n;
    23     string s1,s2;
    24     cin>>n;
    25     cin>>s1>>s2;
    26     for(int i=0;i<n;i++)
    27         s[i]=s1[i]-'0',m[i]=s2[i]-'0';
    28     sort(s,s+n);
    29     sort(m,m+n);
    30     int pos1=0;
    31     int pos2=0;
    32     int res1=0;
    33     int res2=0;
    34     for(int i=0;i<n;i++)
    35     {
    36         if(pos1>=n&&pos2>=n)
    37             break;
    38         while(pos1<n&&m[pos1]<s[i])
    39             pos1++;
    40         while(pos2<n&&m[pos2]<=s[i])
    41             pos2++;
    42         if(pos1<n)
    43             res1++,pos1++;
    44         if(pos2<n)
    45             res2++,pos2++;
    46     }
    47     cout<<n-res1<<endl;
    48     cout<<res2<<endl;
    49     #ifndef ONLINE_JUDGE
    50         cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s."<<endl;
    51     #endif
    52     return 0;
    53 }
    View Code

     

  • 相关阅读:
    附近地点搜索 ,地图
    网站访问量
    后台全选功能以及数据的提交方法
    首页banner特效
    等待加载提示
    缩略图轮播
    遍历input。select option 选中的值
    django1补充
    pythonweb框架django框架1
    图书馆管理系统的页面设计
  • 原文地址:https://www.cnblogs.com/Friends-A/p/11569559.html
Copyright © 2020-2023  润新知