多校 2009 4

A dp

吃了 (x,y)的豆子 就不能吃x-1 x+1 行 还有 (x,y-1),(x,y+1) 的豆子

求最大 果然是菜菜   第1  先想怎么求得一行的最大的   ->>>>>    就是求最大不连续的和dp[i]=max(dp[i-1],dp[i-2]+w[i]);

那么整个矩阵呢  把上面处理出来每一行最大的 求一个最大不连续的和

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>

using namespace std;

#define MAXN 200010
#define inf  1000000007
#define ll long long

int z[MAXN];
int dp[MAXN];
int sum[MAXN];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&z[j]);
            dp[0]=0;
            dp[1]=z[1];
            int mx=dp[1];
            for(int j=2;j<=m;j++)
            {
                dp[j]=max(dp[j-2]+z[j],dp[j-1]);
                mx=max(mx,dp[j]);
            }
            sum[i]=mx;
        }
        int mx=0;
        dp[0]=0;
        dp[1]=sum[1];
        mx=dp[1];
        for(int j=2;j<=n;j++)
        {
            dp[j]=max(dp[j-2]+sum[j],dp[j-1]);
            mx=max(mx,dp[j]);
        }
        printf("%d\n",mx);
    }
    return 0;
}

H

n 然后n个操作 操作有3种

0  a   插入 a

1  a   删除 a  如果a存在的话  不存在输出  No Elment!

2  a k 查询比a大的 第k个   不存在输出     Not Find!

0   1 
只是线段树的单点更新  不多说

那么 查询比a大第k个   我是  先查了a在第x个  然后只要在树上查第 x+k  有没有就可以了

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>

using namespace std;

#define MAXN 100010
#define inf  1000000007
#define ll long long

struct node
{
    int l,r,w;
}tree[MAXN<<2];

int ok;
void Build(int l,int r,int a)
{
    tree[a].l=l;
    tree[a].r=r;
    tree[a].w=0;
    if(l==r)
        return ;
    int mid=(l+r)>>1;
    Build(l,mid,a<<1);
    Build(mid+1,r,a<<1|1);
}
void Update(int l,int r,int a1,int a)
{
    if(l==r)
    {
        tree[a].w=tree[a].w+1;
        return ;
    }
    int mid=(l+r)>>1;
    if(a1<=mid)
        Update(l,mid,a1,a<<1);
    else
        Update(mid+1,r,a1,a<<1|1);
    tree[a].w=tree[a<<1].w+tree[a<<1|1].w;
}
void Delete(int l,int r,int a1,int a)
{
    if(l==r)
    {
        if(tree[a].w==0)
            ok=1;
        else
            tree[a].w=tree[a].w-1;
        return ;
    }
    int mid=(l+r)>>1;
    if(a1<=mid)
        Delete(l,mid,a1,a<<1);
    else
        Delete(mid+1,r,a1,a<<1|1);
    tree[a].w=tree[a<<1].w+tree[a<<1|1].w;
}
int Ques(int l,int r,int k,int a)
{
    if(l==r)
        return l;
    int mid=(l+r)>>1;
    if(k>tree[a<<1].w)
    {
        return Ques(mid+1,r,k-tree[a<<1].w,a<<1|1);
    }
    else
    {
        return Ques(l,mid,k,a<<1);
    }
}
int Ques1(int l,int r,int a1,int b1,int a)
{
    if(a1<=l&&r<=b1)
        return tree[a].w;
    int ans=0;
    int mid=(l+r)>>1;
    if(a1<=mid)
        ans=ans+Ques1(l,mid,a1,b1,a<<1);
    if(b1>mid)
        ans=ans+Ques1(mid+1,r,a1,b1,a<<1|1);
    return ans;
}
int main()
{
    int n;
    int r=100000;
    while(scanf("%d",&n)!=EOF)
    {
        Build(1,r,1);
        while(n--)
        {
            int type;
            scanf("%d",&type);
            if(type==0)
            {
                int a;
                scanf("%d",&a);
                Update(1,r,a,1);
            }
            else if(type==1)
            {
                int a;
                scanf("%d",&a);
                ok=0;
                Delete(1,r,a,1);
               // printf("%d\n",ok);
                if(ok==1)
                    printf("No Elment!\n");
            }
            else
            {
                int a,k;
                ok=0;
                scanf("%d%d",&a,&k);
                int c=Ques1(1,r,1,a,1);
                k=k+c;
                if(k>tree[1].w)
                {
                    printf("Not Find!\n");
                    continue;
                }
                int ans=Ques(1,r,k,1);
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

B

n然后 n个串

m然后m个串  问上面有多少个串包括下面这个串   输出m个数字

n个串建字典树    abab   那么就是   abab   bab  ab b  但是不能重复计数  那么 加上个标记就行了

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<stdlib.h>

using namespace std;

#define MAXN 100010
#define inf  1000000007
#define ll long long

char s[25];
struct node
{
    int cnt,id;
    struct node *next[27];
    void cl()
    {
        memset(next,0,sizeof(next));
        cnt=1;
    }
};
int ok;
void Insert(char *s,struct node *p,int cou)
{
    while(*s)
    {
        int a=*s-‘a‘;
        if(p->next[a]==0)
        {
            p->next[a]=(struct node *)malloc(sizeof(struct node));
            (p->next[a])->cl();
            (p->next[a])->id=cou;
        }
        p=p->next[a];
        if(p->id!=cou)
        {
            (p->cnt)++;
            p->id=cou;
        }
        s++;
    }
}

int Ques(char *s,struct node *p)
{
    int len=strlen(s);
    for(int i=0;i<len;i++)
    {
        int a=s[i]-‘a‘;
        if(p->next[a])
            p=p->next[a];
        else
            return 0;
    }
    return p->cnt;
}

int main()
{
    int n,m;
    scanf("%d",&n);
    struct node * root;
    root=(struct node *)malloc(sizeof(struct node));
    root->cl();
    int cou=1;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s);
        ok=0;
        int len=strlen(s);
        for(int j=0;j<len;j++)
        {
            Insert(s+j,root,cou);
            ok=1;
        }
        cou++;
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        int ans=0;
        scanf("%s",s);
        ans=Ques(s,root);
        printf("%d\n",ans);
    }
    return 0;
}

C

给你一个2进制字符串a  然后一个数b  要求在这个字符串上补0或者1  使得b能整除a 求长度最小  字典序最小  不可能输出impossibl
显然是可能的 至少可以在最后加上b   然后 最多就是2^20次方 直接跑的  然后求一下列举的b的倍数是不是包含a就可以了    a=0注意下

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<stdlib.h>

using namespace std;

#define MAXN 100010
#define inf  1000000007
#define ll long long

char z[35];
char s[35];

int main()
{
    while(scanf("%s",z)!=EOF)
    {
        int a;
        scanf("%d",&a);
        int b=0;
        int len=strlen(z);
        for(int i=0;i<len;i++)
            b=b*2+z[i]-‘0‘;
        if(b%a==0)
        {
            printf("%d\n",b);
            continue;
        }
        for(int i=1;;i++)
        {
            int c=a*i;
                int cnt=0;
                int d=c;
                while(d)
                {
                    s[cnt++]=d%2+‘0‘;
                    d=d/2;
                }
                for(int j=0;j<(cnt+1)/2;j++)
                    swap(s[j],s[cnt-j-1]);
                int c1,c2;
                s[cnt]=‘\0‘;
                for(c1=c2=0;c1<cnt&&c2<len;)
                {
                    if(s[c1]==z[c2])
                    {
                        c1++;
                        c2++;
                    }
                    else
                    {
                        c1++;
                    }
                }
                if(c2==len)
                {
                    printf("%s\n",s);
                    break;
                }

        }
    }
    return 0;
}

G题意至今未读懂

时间: 2024-10-13 16:23:15

多校 2009 4的相关文章

多校 2009 7

中间那几场    不太会 B  HDU 2873 n *m矩阵  #表示有炸弹 选这个炸弹后可以在  他上面  左边  任意位子 产生一一个炸弹  丢到1,1的自动爆炸 最后没的弄就输掉 sg函数     第一行第一列处理下 #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #include<math.h> using namespace std; #

中职“网络班级”中家校沟通模块的应用实践

有人说职业学校的学生是单一教育评价体系的"失败者",是家庭教育的"失败者".对于学习,他们的目标不明确,学习精神不饱满,敏感而自卑:对于生活,他们自以为是却不自信,表面自主,内心却缺乏独立的能力.面对职业学校太多的"问题学生",要彻底改变职业学校学生的状态,需要家校之间的沟通与合作.家校沟通的方法有很多,例如开家长会.打电话.组建"网络班级"等,其中现在正在推广的网络班级,是一种很好.很便捷的方式. 笔者最初是通过网络得知&q

2015 ACM多校训练第一场

在下面网址看效果更佳>_< http://mlz000.github.io/2015/08/07/2015-ACM%E5%A4%9A%E6%A0%A1%E8%AE%AD%E7%BB%83%E7%AC%AC%E4%B8%80%E5%9C%BA/ 题外话 这个暑假以前就决定要把这次多校的所有题全补了,中间断断续续,总算把第一场的题补全了,鄙视一下颓废的自己... hdu 5288(1001) OO's Sequence Solution 水题,定义两个数组L[i],R[i]示第i个数左侧和右侧最接

HDU 4864 Task(2014多校--贪心)

Task 比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-.- 大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级,任务是需要工作的时间跟等级.完成一个任务可以得到500*(工作时间)+2*(等级)的报酬.完成任务的条件是机器的工作时间满足任务的需要,等级要大于等于任务的等级,一个机器只能用一次,一个任务也只能用一个机器去完成.需要进行策略选择,使得完成更多的任务. 思路:开始想的就是贪心,也想到了贪心的时候时间

HDU 4864(多校)1004 Task

Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task's level yi cannot complete this task. If the company comp

hdu6069[素数筛法] 2017多校3

/*hdu6069[素数筛法] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long LL; LL l, r, k; const LL MOD = 998244353LL; int T, n, prime[1100000], primesize; bool isprime[11000000]; void getlist(int listsize) { memset(isprime, 1, sizeof

python_爬校花

如何用python爬取校花图片并保存到本地来? 1. 获取什么数据? 校花名字  name 校花所在学校 school 校花图片的url   img_ulr 2.如何获取? 打开网页http://www.xiaohuar.com/hua/ ,打开开发工具,研究每一张图片对应的html,找规律 通过python 的scrapy框架进行批量爬取 环境声明: python 3.50 scrapy 库 出现了哪些问题? 1. 如何去除重复的url? 通过对获取的url 进行md5,进行去重 2. 如何该

2017Summmer_上海金马五校 F题,G题,I题,K题

以下题目均自己搜 F题  A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R,然后对整个数组扫一遍对于每一个下标取m=min(L[i],R[i]);用ans取2*m-1中的最大值.LIS用nlogn的算法实现,二分用的是lower_bound(),直接看代码. //Author: xiaowuga #include <bits/stdc++.h> #define maxx

2015 HDU 多校联赛 5317 RGCDQ 筛法求解

2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据量大, 所以必须做预处理.也就是用筛法求出全部的F[x],将全部F[x] 打印出来发现.事实上结果不大,最大的数值是7.所以对于每一个区间询问, 直接暴力求取有多少个 1 2 3 4 5 6 7 就可以,从大到小查找.假设出现2个以上 3-7 的数值,那么最大公约数就是该数字. 假设没有出现两个反复