• Codeforces Round #500 (Div. 2) [based on EJOI]


    Codeforces Round #500 (Div. 2) [based on EJOI]

    https://codeforces.com/contest/1013

    A

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<node>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 200005
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=1e9+7;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 
    24 int n,ans1,ans2;
    25 
    26 int main(){
    27     std::ios::sync_with_stdio(false);
    28     cin>>n;
    29     int x;
    30     for(int i=1;i<=n;i++){
    31         cin>>x;
    32         ans1+=x;
    33     }
    34     for(int i=1;i<=n;i++){
    35         cin>>x;
    36         ans2+=x;
    37     }
    38     if(ans1>=ans2) puts("YES");
    39     else puts("NO");
    40 }
    View Code

    B

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<node>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 200005
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=1e9+7;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 
    24 int n,x;
    25 int a[100005];
    26 int b[100005];
    27 set<int>se1,se2,se3;
    28 
    29 int main(){
    30     std::ios::sync_with_stdio(false);
    31     cin>>n>>x;
    32     for(int i=1;i<=n;i++){
    33         cin>>a[i];
    34         b[i]=a[i]&x;
    35         se1.insert(a[i]);
    36         se2.insert(b[i]);
    37     }
    38     if(se1.size()!=n){
    39         cout<<0<<endl;
    40         return 0;
    41     }
    42     for(int i=1;i<=n;i++){
    43         se1.erase(a[i]);
    44         se1.insert(b[i]);
    45         if(se1.size()!=n){
    46             cout<<1<<endl;
    47             return 0;
    48         }
    49         se1.erase(b[i]);
    50         se1.insert(a[i]);
    51     }
    52     if(se2.size()!=n){
    53         cout<<2<<endl;
    54         return 0;
    55     }
    56     cout<<-1<<endl;
    57 }
    View Code

    C

    题意:给你2*n个值,组成n个点,问能覆盖这n个点的最小矩形面积

    思路:枚举长度为n的区间,这段区间作为x坐标的范围,然后将这段区间的差值与剩下部分的差值相乘取最小值

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<node>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 200005
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=1e9+7;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 
    24 int n;
    25 ll a[maxn];
    26 
    27 int main(){
    28     std::ios::sync_with_stdio(false);
    29     cin>>n;
    30     n*=2;
    31     for(int i=1;i<=n;i++) cin>>a[i];
    32     sort(a+1,a+n+1);
    33     ll ans=(a[n/2]-a[1])*(a[n]-a[n/2+1]);
    34     for(int i=2;i<=n/2+1;i++){
    35         ans=min(ans,(a[n]-a[1])*(a[i+n/2-1]-a[i]));
    36     }
    37     cout<<ans<<endl;
    38 }
    View Code

    D

    题意:有一个n*m的矩形,一开始有q个格子上被标记。对于任意两行两列,如果交汇的四个格子中有三个被标记,那么第4个也会被标记。求至少需要手动标记几个格子,才能让整个矩形内的格子都被标记。

    题意:当(x1,y1),(x1,y2),(x2,y1)被标记时,(x2,y2)也会被标记,所以用并查集维护,判断有多少个点是没有被标记的

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<node>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 200005
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=1e9+7;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 
    24 int n,m,q;
    25 int fa[maxn*2];
    26 
    27 int Find(int x){
    28     int r=x,y;
    29     while(x!=fa[x]){
    30         x=fa[x];
    31     }
    32     while(r!=x){
    33         y=fa[r];
    34         fa[r]=x;
    35         r=y;
    36     }
    37     return x;
    38 }
    39 
    40 void join(int x,int y){
    41     int xx=Find(x);
    42     int yy=Find(y);
    43     if(xx!=yy){
    44         fa[xx]=yy;
    45     }
    46 }
    47 
    48 int main(){
    49     std::ios::sync_with_stdio(false);
    50     cin>>n>>m>>q;
    51     int x,y;
    52     for(int i=1;i<=n+m;i++) fa[i]=i;
    53     for(int i=1;i<=q;i++){
    54         cin>>x>>y;
    55         join(x,y+n);
    56     }
    57     int ans=0;
    58     for(int i=1;i<=n+m;i++){
    59         if(fa[i]==i){
    60             ans++;
    61         }
    62     }
    63     cout<<ans-1<<endl;
    64 }
    View Code

    E

    题意:给你n个数,你一次操作可以把某一个数减一,使任意k个数严格大于它旁边的两个数,问最少需要几次操作。输出1<=k<=(n+1)/2时的答案。

    思路: dp[i][j][0]表示表示前i个数有j个满足条件,i、i-1都不满足条件的最少操作数

        dp[i][j][1]表示表示前i个数有j个满足条件,i满足条件的最少操作数

        dp[i][j][2]表示表示前i个数有j个满足条件,i-1满足条件的最少操作数

    然后进行状态转移:

      dp[i][j][2]=dp[i-1][j][1]+max(0,a[i]-a[i-1]+1);
      dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][2]);
      dp[i][j][1]=min(dp[i-1][j-1][0]+max(0,a[i-1]-a[i]+1),dp[i-1][j-1][2]+max(0,min(a[i-1],a[i-2]-1)-a[i]+1));

            dp[i][j][1]分为两种情况:

             1、前两个都不满足条件,那么i-1就是原来的数,即没有被操作过,需要的操作数就是max(0,a[i-1]-a[i]+1)

             2、i-2满足条件,那么i-1已经变成了min(a[i-1],a[i-2]-1),还需要的操作数就是max(0,min(a[i-1],a[i-2]-1)-a[i]+1)

     因为转移只用到了dp[i-1][j],dp[i-1][j-1],所以可以用滚动数组优化

    参考博客:https://ouuan.blog.luogu.org/solution-cf1012c

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<node>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 200005
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=1e9+7;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 
    24 int n;
    25 int dp[2505][3];
    26 int a[5005];
    27 
    28 int main(){
    29     std::ios::sync_with_stdio(false);
    30     cin>>n;
    31     for(int i=1;i<=n;i++) cin>>a[i];
    32     for(int i=0;i<=2;i++){
    33         for(int j=0;j<=(n+1)/2;j++){
    34             dp[j][i]=0x3f3f3f3f;
    35         }
    36     }
    37     dp[0][0]=dp[1][1]=0;
    38     for(int i=2;i<=n;i++){
    39         for(int j=(i+1)/2;j>=1;j--){
    40             dp[j][2]=dp[j][1]+max(0,a[i]-a[i-1]+1);
    41             dp[j][0]=min(dp[j][0],dp[j][2]);
    42             dp[j][1]=min(dp[j-1][0]+max(0,a[i-1]-a[i]+1),dp[j-1][2]+max(0,min(a[i-1],a[i-2]-1)-a[i]+1));
    43         }
    44     }
    45     for(int i=1;i<=(n+1)/2;i++){
    46         cout<<min(dp[i][0],min(dp[i][1],dp[i][2]))<<" ";
    47     }
    48 }
    View Code
  • 相关阅读:
    Codeforces Round #299 (Div. 2) B. Tavas and SaDDas 水题
    Codeforces Round #299 (Div. 2) A. Tavas and Nafas 水题
    Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力
    2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
    hdu 3340 Rain in ACStar 线段树区间等差数列更新
    hust 1385 islands 并查集+搜索
    2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集
    2015 UESTC 数据结构专题G题 秋实大哥去打工 单调栈
    2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
    2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/10595566.html
Copyright © 2020-2023  润新知