Educational Codeforces Round 15 套题

这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题

A:求连续最长严格递增的的串,O(n)简单dp

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
typedef  long long LL;
const int N = 1e5+5;
const int INF = 0x3f3f3f3f;
int n,dp[N],a[N],cnt,mx;
int main(){
  scanf("%d",&n);a[0]=INF;
  for(int i=1;i<=n;++i){
    scanf("%d",&a[i]);
    dp[i]=1;
    if(a[i]>a[i-1])dp[i]=dp[i-1]+1;
    mx=max(mx,dp[i]);
  }
  printf("%d\n",mx);
  return 0;
}

B:水题,map乱搞

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef  long long LL;
const int N = 1e5+5;
const int INF = 2e9;
map<int,int>mp;
int a[40],cnt;
int main(){
  for(int i=0;;++i){
    if((1ll<<i)>INF)break;
    a[++cnt]=(1<<i);
  }
  LL ret=0;
  int x,n;scanf("%d",&n);
  for(int i=1;i<=n;++i){
    scanf("%d",&x);
    for(int j=cnt;j>0;--j){
      if(a[j]<=x)break;
      int tmp=a[j]-x;
      if(mp.find(tmp)!=mp.end())
        ret+=mp[tmp];
    }
    if(mp.find(x)==mp.end())mp[x]=0;
    ++mp[x];
  }
  printf("%I64d\n",ret);
  return 0;
}

C:一个典型的二分题,judge如何判断全被覆盖?只要用一下离线求和数组非0就好

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef  long long LL;
const int N = 1e5+5;
const int INF = 2e9;
LL a[N],b[N];
int n,m,c[N];
bool judge(LL r){
  memset(c,0,sizeof(c));
  for(int i=1;i<=m;++i){
    int x=lower_bound(a+1,a+1+n,b[i]-r)-a;
    int y=upper_bound(a+1,a+1+n,b[i]+r)-a;
    ++c[x];--c[y];
  }
  for(int i=1;i<=n;++i){
    c[i]+=c[i-1];
    if(!c[i])return false;
  }
  return true;
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;++i)
    scanf("%I64d",&a[i]);
  sort(a+1,a+1+n);
  n=unique(a+1,a+1+n)-a-1;
  for(int i=1;i<=m;++i)
    scanf("%I64d",&b[i]);
  sort(b+1,b+1+m);
  m=unique(b+1,b+1+m)-b-1;
  LL l=0,r=INF;
  while(l<r){
    LL mid=(l+r)>>1;
    if(judge(mid))r=mid;
    else l=mid+1;
  }
  printf("%I64d\n",(l+r)>>1);
  return 0;
}

D:一个简单的分类讨论,因为最多走k,以k为周期即可

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef  long long LL;
const int N = 1e5+5;
const int INF = 2e9;
LL d,k,a,b,t;
int main(){
  scanf("%I64d%I64d%I64d%I64d%I64d",&d,&k,&a,&b,&t);
  if(d<=k){
    printf("%I64d\n",d*a);
    return 0;
  }
  LL ret=k*a;d-=k;
  if(d<=k){
    ret+=min(d*a+t,d*b);
    printf("%I64d\n",ret);
    return 0;
  }
  LL t1=k*a+t,t2=k*b;
  if(t2<=t1){
    printf("%I64d\n",ret+d*b);
    return 0;
  }
  else {
    ret+=d/k*t1;
    d-=d/k*k;
    if(d==0){printf("%I64d\n",ret);return 0;}
    t1=t+d*a,t2=d*b;
    ret+=min(t1,t2);
    printf("%I64d\n",ret);
  }
  return 0;
}

E:求从每个点出发路径长度为k的边权和以及边权最小值,刚开始还以为是快速幂,结果发现发现这条路唯一确定,直接倍增即可

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef  long long LL;
const int N = 1e5+5;
const int INF = 2e9;
struct Node{
  int v,mn;
  LL sum;
}f[N][40];
LL retsum[N],k;
int n,retmin[N],cur[N];
void solve(){
  for(int j=0;(1ll<<j)<=k;++j)if(k&(1ll<<j)){
     for(int i=0;i<n;++i){
        retsum[i]+=f[cur[i]][j].sum;
        if(retmin[i]==-1)retmin[i]=f[cur[i]][j].mn;
        else retmin[i]=min(retmin[i],f[cur[i]][j].mn);
        cur[i]=f[cur[i]][j].v;
     }
  }
  for(int i=0;i<n;++i)
    printf("%I64d %d\n",retsum[i],retmin[i]);
}
int main(){
  scanf("%d%I64d",&n,&k);
  for(int i=0;i<n;++i)scanf("%d",&f[i][0].v),cur[i]=i,retmin[i]=-1;
  for(int i=0;i<n;++i)scanf("%d",&f[i][0].mn),f[i][0].sum=f[i][0].mn;
  for(int j=1;(1ll<<j)<=k;++j){
     for(int i=0;i<n;++i){
        f[i][j].v=f[f[i][j-1].v][j-1].v;
        f[i][j].sum=f[i][j-1].sum+f[f[i][j-1].v][j-1].sum;
        f[i][j].mn=min(f[i][j-1].mn,f[f[i][j-1].v][j-1].mn);
     }
  }
  solve();
  return 0;
}

F:不会,看了看别人的代码,并不能看懂,还是太弱

时间: 2024-10-20 14:33:23

Educational Codeforces Round 15 套题的相关文章

Educational Codeforces Round 79做题记录

这套题感觉出的不咋滴,第四题和第五题难度差了1000分!!! 前四题都还简单,第五题就31人做出……我算了…… 懒得写题解了,做个记录吧(这就是偷懒的理由???) 比赛传送门 A.New Year Garland 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #define re

Codeforces Educational Codeforces Round 15 C. Cellular Network

C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output You are given n points on the straight line — the positions (x-coordinates) of the cities and m points on the same line

Educational Codeforces Round 62 做题记录

A. 题解: 发现就是找前缀 max = i 的点的个数,暴力扫一遍 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pii pair<int,int> 4 #define mp(a,b) make_pair(a,b) 5 using namespace std; 6 #define maxn 10005 7 int n; 8 int a[maxn]; 9 int main() 10 { 11 scanf(&qu

Educational Codeforces Round 21 A-E题题解

A题      ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<cstdio> using namespace std; int n,m; int m

Educational Codeforces Round 23 补题小结

昨晚听说有教做人场,去补了下玩. 大概我的水平能做个5/6的样子? (不会二进制Trie啊,我真菜) A. 傻逼题.大概可以看成向量加法,判断下就好了. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int x1,x2,yy1,y2,x,y; int main(){ scanf("%d%d%d%d%d%d&qu

Educational Codeforces Round 15 - ABC

A. Maximum Increase 题意:找 最长的 连续的严格上升的子序列,输出它的长度. 解题: 因为要求连续,所以一边扫一遍统计就可以.事后觉得我写的麻烦了些o(╯□╰)o. #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> using namespace std; int a[100010]; int m

Educational Codeforces Round 74 (Rated for Div. 2)补题

慢慢来. 题目册 题目 A B C D E F G 状态 √ √ √ √ × ? ? //√,×,? 想法 A. Prime Subtraction res tp A 题意:给定\(x,y(x>y)\),问能否将\(x-y\)拆成任意多个质数之和 1.任意大于\(1\)的整数\(k\)都可以用\(2\)与\(3\)的线性表示 证: 若\(k\)是偶数,显然: 若\(k\)是奇数,则\(k\)可以表示成\(k = 3 + 2*k'\),显然: 毕. #include<bits/stdc++.h&

Educational Codeforces Round 21 F. Card Game(网络流之最大点权独立集)

题目链接:Educational Codeforces Round 21 F. Card Game 题意: 有n个卡片,每个卡片有三个值:p,c,l; 现在让你找一个最小的L,使得满足选出来的卡片l<=L,并且所有卡片的p的和不小于k. 选择卡片时有限制,任意两张卡片的c之和不能为质数. 题解: 和hdu 1565 方格取数(2)一样,都是求最大点权独立集. 不难看出来,这题再多一个二分. 注意的是在构造二部图的时候,按照c值的奇偶性构造. 当c==1时要单独处理,因为如果有多个c==1的卡片,

Educational Codeforces Round 36 (Rated for Div. 2) 题解

Educational Codeforces Round 36 (Rated for Div. 2) 题目的质量很不错(不看题解做不出来,笑 Codeforces 920C 题意 给定一个\(1\)到\(n\)组成的数组,只可以交换某些相邻的位置,问是否可以将数组调整为升序的 解题思路 首先如果每个数都能通过交换到它应该到的位置,那么就可以调整为升序的. 但实际上交换是对称的,如果应该在的位置在当前位置前方的数都交换完成,那么整体就是排好序的,因为不可能所有不在相应位置的数都在相应位置的后方.