Educational Codeforces Round 6

620A - Professor GukiZ‘s Robot    20171122

\(ans=max(\left | x2-x1 \right |,\left | y2-y1 \right |)\)

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int X[2],Y[2],x,y;
int main()
{
    scanf("%d%d%d%d",&X[0],&Y[0],&X[1],&Y[1]);
    x=abs(X[1]-X[0]),y=abs(Y[1]-Y[0]);
    printf("%d\n",max(x,y));
    return 0;
}

620B - Grandfather Dovlet’s calculator    20171122

预处理每个字符的花费,按照题意模拟即可

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int ans,a,b,f[10];
int cal(int k)
{
    int _=0;
    while(k)
      _+=f[k%10],k/=10;
    return _;
}
int main()
{
    scanf("%d%d",&a,&b);
    f[0]=6,f[1]=2,f[2]=5,f[3]=5,f[4]=4;
    f[5]=5,f[6]=6,f[7]=3,f[8]=7,f[9]=6;
    for(int i=a;i<=b;i++)
      ans+=cal(i);
    printf("%d\n",ans);
    return 0;
}

620C - Pearls in a Row    20171122

开个set记录当前已在区间类的珍珠种类,O(n)扫一遍即可

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<set>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
vector<int>l,r;
int n,x,t=1;
set<int>s;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      {
      if(t==i)s.clear();
      scanf("%d",&x);
      if(s.count(x))
        l.push_back(t),r.push_back(i),t=i+1;
      else s.insert(x);
      }
    if(!l.size())return printf("-1\n"),0;
    r[r.size()-1]=n;
    printf("%d\n",l.size());
    for(int i=0;i<l.size();i++)
      printf("%d %d\n",l[i],r[i]);
    return 0;
}

620D - Professor GukiZ and Two Arrays    20171122

暴力分类讨论\(k=0,1,2\)的所有情况就好了

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define N 2001
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
struct rua
{
    LL i,j,v;
}f[N*N];
LL n,m,d,sa,sb,a[N],b[N],ans[3],v[N*N],_,a1,b1,b2;
bool cmp(rua x,rua y){return x.v<y.v;}
void cdx(LL i,LL _)
{
    if(!_)return;
    if(f[_].i==f[i].i || f[_].j==f[i].j)return;
    if(ans[2]>abs(d+v[_]))
      ans[2]=abs(d+v[_]),b1=i,b2=_;
}
int main()
{
    ans[2]=(1ll<<62);
    scanf("%I64d",&n);
    for(LL i=1;i<=n;i++)
      scanf("%I64d",&a[i]),sa+=a[i];
    scanf("%I64d",&m);
    for(LL i=1;i<=m;i++)
      scanf("%I64d",&b[i]),sb+=b[i];
    d=sa-sb;
    for(LL i=1;i<=n;i++)
      for(LL j=1;j<=m;j++)
        {
        f[i*m-m+j].v=2*(b[j]-a[i]);
        f[i*m-m+j].i=i;
        f[i*m-m+j].j=j;
        }
    ans[0]=abs(d);
    sort(f+1,f+n*m+1,cmp);
    for(LL i=1;i<=n;i++)
      for(LL j=1;j<=m;j++)
        v[i*m-m+j]=f[i*m-m+j].v;
    _=lower_bound(v+1,v+n*m+1,-d)-v;
    if(_==n*m+1)ans[1]=abs(d+v[_-1]),a1=_-1;else
    if(_==1)ans[1]=abs(d+v[1]),a1=_;else
    if(abs(d+v[_])<abs(d+v[_-1]))ans[1]=abs(d+v[_]),a1=_;
    else ans[1]=abs(d+v[_-1]),a1=_-1;
    for(int i=1;i<n*m;i++)
      {
      d+=v[i];
      _=lower_bound(v+1,v+n*m+1,-d)-v;
      if(_==n*m+1)cdx(i,_-1);
      else if(_==1)cdx(i,1-(i==1));else
      cdx(i,_+(i==_)),cdx(i,_-1-(i==_-1));
      d-=v[i];
      }
    if(ans[0]<=ans[1] && ans[0]<=ans[2])
      return printf("%I64d\n0\n",ans[0]),0;
    if(ans[1]<=ans[0] && ans[1]<=ans[2])
      return printf("%I64d\n1\n%I64d %I64d\n",ans[1],f[a1].i,f[a1].j),0;
    printf("%I64d\n2\n",ans[2]);
    printf("%I64d %I64d\n",f[b1].i,f[b1].j);
    printf("%I64d %I64d\n",f[b2].i,f[b2].j);
    return 0;
}

620E - New Year Tree    20180919

预处理每个点的DFS序,可以得出每棵子树对应的DFS序的范围。由于\(c_i\)不超过60,故可将修改操作转换为:把子树内所有点的价值改为\(2^{c}\),将询问操作转换为:询问子树内所有点价值进行或运算的结果在二进制中1的个数,用线段树做就好了

#include<bits/stdc++.h>
using namespace std;
#define N 400001
#define LL long long
vector<int>d[N];
int n,m,t,x,y,c[N],l[N],r[N];
struct rua{int l,r;LL f,w;}tr[N<<2];
LL a[N];
void update(int x)
{
    int lson=x*2,rson=x*2+1;
    tr[x].w=tr[lson].w|tr[rson].w;
}
void down(int x)
{
    LL c=tr[x].w;tr[x].f=0;
    int lson=x*2,rson=x*2+1;
    tr[lson].f=tr[lson].w=c;
    tr[rson].f=tr[rson].w=c;
}
void Build(int l,int r,int x)
{
    tr[x]={l,r,0,0};
    if(l==r){tr[x].w=a[l];return;}
    int mid=l+r>>1;
    Build(l,mid,x*2);
    Build(mid+1,r,x*2+1);
    update(x);
}
void Change(int L,int R,LL c,int x)
{
    int l=tr[x].l,r=tr[x].r;
    int mid=l+r>>1;
    if(L<=l && r<=R){tr[x].f=tr[x].w=c;return;}
    if(tr[x].f)down(x);
    if(L<=mid)Change(L,R,c,x*2);
    if(R>mid)Change(L,R,c,x*2+1);
    update(x);
}
LL Query(int L,int R,int x)
{
    int l=tr[x].l,r=tr[x].r;
    int mid=l+r>>1;
    LL res=0;
    if(L<=l && r<=R)return tr[x].w;
    if(tr[x].f)down(x);
    if(L<=mid)res|=Query(L,R,x*2);
    if(R>mid)res|=Query(L,R,x*2+1);
    update(x);
    return res;
}
void dfs(int cur,int pre)
{
    l[cur]=++x;
    a[x]=1ll<<c[cur];
    for(auto nxt:d[cur])if(nxt!=pre)dfs(nxt,cur);
    r[cur]=x;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&c[i]);
    for(int i=2;i<=n;i++)
      scanf("%d%d",&x,&y),
      d[x].push_back(y),
      d[y].push_back(x);
    x=0,dfs(1,0);
    Build(1,n,1);
    for(int i=1;i<=m;i++)
      {
      scanf("%d",&t);
      if(t==1)
        scanf("%d%d",&x,&y),
        Change(l[x],r[x],1ll<<y,1);
      else
        scanf("%d",&x),
        printf("%d\n",(int)__builtin_popcountll(Query(l[x],r[x],1)));
      }
}

620F - Xors on Segments    20171122

这题...预处理从1异或到n的值(即前缀异或和),\(O(n^{2})\)莽一下就过了...CF的评测机是跑得真快

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define N 50001
#define M 1000001
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,a[N],l[N],r[N],t[N],ans[N],f[M];
int main()
{
    for(int i=1;i<M;i++)
      f[i]=f[i-1]^i;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
      scanf("%d%d",&l[i],&r[i]);
    for(int i=1;i<=n;i++)
      {
      int _=0;t[i-1]=0;
      for(int j=i;j<=n;j++)
        _=max(_,f[a[i]]^f[a[j]]^min(a[i],a[j])),t[j]=_;
      for(int j=1;j<=m;j++)
        if(l[j]<=i && r[j]>=i)
          ans[j]=max(ans[j],t[r[j]]);
      }
    for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

原文地址:https://www.cnblogs.com/DeaphetS/p/9673982.html

时间: 2024-10-10 16:37:38

Educational Codeforces Round 6的相关文章

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Educational Codeforces Round 26 D. Round Subset(dp)

题目链接:Educational Codeforces Round 26 D. Round Subset 题意: 给你n个数,让你选其中的k个数,使得这k个数的乘积的末尾的0的个数最大. 题解: 显然,末尾乘积0的个数和因子2和因子5的个数有关. 然后考虑dp[i][j]表示选i个数,当前因子5的个数为j时,能得到因子2最多的为多少. 那么对于每个数,记录一下因子2和5的个数,做一些01背包就行了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) me

CodeForces 837F - Prefix Sums | Educational Codeforces Round 26

按tutorial打的我血崩,死活挂第四组- - 思路来自FXXL /* CodeForces 837F - Prefix Sums [ 二分,组合数 ] | Educational Codeforces Round 26 题意: 设定数组 y = f(x) 使得 y[i] = sum(x[j]) (0 <= j < i) 求初始数组 A0 经过多少次 f(x) 后 会有一个元素 大于 k 分析: 考虑 A0 = {1, 0, 0, 0} A1 = {1, 1, 1, 1} -> {C(

Educational Codeforces Round 26 D dp,思维

Educational Codeforces Round 26 D. Round Subset 题意:有 n 个数,从中选出 k 个数,要使这 k 个数的乘积末尾的 0 的数量最多. tags:dp好题 dp[i][j][l] 表示前 i 个数,选取了其中 j 个数,分解因子后有 l 个 5时,最多有多少个 2 .i 这一维明显可以省略. 这题一开始有个地方写挫了..选取 j 个数时,应该反着来,即 for( j, k, 1) ,不是 for( j, 1, k) ,不然会多算. #include

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

Educational Codeforces Round 25 F. String Compression(kmp+dp)

题目链接:Educational Codeforces Round 25 F. String Compression 题意: 给你一个字符串,让你压缩,问压缩后最小的长度是多少. 压缩的形式为x(...)x(...)  x表示(...)这个出现的次数. 题解: 考虑dp[i]表示前i个字符压缩后的最小长度. 转移方程解释看代码,这里要用到kmp来找最小的循环节. 当然还有一种找循环节的方式就是预处理lcp,然后通过枚举循环节的方式. 这里我用的kmp找的循环节.复杂度严格n2. 1 #inclu

Educational Codeforces Round 23 E. Choosing The Commander (trie)

题目链接: Educational Codeforces Round 23 E. Choosing The Commander 题意: 一共有n个操作. 1.  插入一个数p 2.  删除一个数p 3.  询问有多少个数 使得 x^p<l 题解: 对于前两种操作用01trie就能解决. 对于对三个操作,我们考虑在trie上搜索. 1.  当l的bit位是1时,那边bit位是p的字数全部的数都会小于l,(因为p^p=0) 2.  当l的bit为是0时,那边只能向bit位是p的子树中搜. 这样算下来

CodeForces - 837E - Vasya&#39;s Function | Educational Codeforces Round 26

/* CodeForces - 837E - Vasya's Function [ 数论 ] | Educational Codeforces Round 26 题意: f(a, 0) = 0; f(a, b) = 1 + f(a, b-gcd(a, b)); 求 f(a, b) , a,b <= 1e12 分析: b 每次减 gcd(a, b) 等价于 b/gcd(a,b) 每次减 1 减到什么时候呢,就是 b/gcd(a,b)-k 后 不与 a 互质 可先将 a 质因数分解,b能除就除,不能

Educational Codeforces Round 22 E. Army Creation(主席树)

题目链接:Educational Codeforces Round 22 E. Army Creation 题意: 给你n个数和一个数k,然后有q个询问. 每个询问 有一个区间[l,r],问你这个区间内在满足每一种数不超过k的情况下,最大能选多少个数出来. 强制在线. 题解: 一看就要用到主席树,和主席数求区间内有多少不同的数的个数处理方法相同. 依次将每个数插入,当这个数出现的个数等于k了,就把最前面的那个数删掉. 然后询问就访问root[r]就行了. 第一次写完数据结构没有调试一遍过样例,一