多校 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;

#define MAXN 10002
#define inf  1000000007
#define ll long long
#define exp 1e-8

/*
    n*m的棋盘上有若干炸弹,两人轮流引爆炸弹(1,1位置的不能选取,这个题目好像没说但样例是这个意思= =..)
引爆后会在同列的上方,同行的左方各产生一个新的炸弹(若在一个方向已经在边缘,则该方向不产生新的炸弹),没有炸弹可选的一方输,求先手胜负。
*/
char z[55][55];
int sg[55][55];
bool vis[2550];

int main()
{
        for(int i=0;i<50;i++)
        {
              sg[i][0]=i;
              sg[0][i]=i;
        }
        for(int i=1;i<50;i++)
        {
            for(int j=1;j<50;j++)
            {
                memset(vis,0,sizeof(vis));
                for(int k=0;k<i;k++)
                {
                    int a=sg[k][j];
                    for(int kk=0;kk<j;kk++)
                    {
                        int b=sg[i][kk];
                        vis[a^b]=1;
                    }
                }
                for(int k=0;;k++)
                {
                    if(vis[k]==0)
                    {
                        sg[i][j]=k;
                        break;
                    }
                }
            }
        }
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==m&&m==0)
            break;
        for(int i=0;i<n;i++)
            scanf("%s",z[i]);
        int ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(z[i][j]==‘#‘)
                    ans=ans^sg[i][j];
            }
        }
        if(ans==0)
            printf("Jack\n");
        else
            printf("John\n");
    }
    return 0;
}

C HDU 2874

n 个点m条边  q个查询

然后  a b  w  无向边   权值w

问这2点能不能到达 不能  Not connected  能的话输出距离

我的空间炸了  不知道怎么弄的   感觉lca

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<stdlib.h>
#include<math.h>
#include<map>
#include<iterator>
#include <utility>
using namespace std;

#define MAXN 10010
#define inf  1000000007
#define ll long long

int fa[MAXN];
int vis[MAXN];
struct node
{
    int u,v,w,next;
}edge[MAXN*2],edge1[2000010];
int cnt,tot;
int head[MAXN],head1[MAXN];
int dis[MAXN];

void add(int u,int v,int w)
{
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void add1(int u,int v,int w)
{
    edge1[tot].u=u;
    edge1[tot].v=v;
    edge1[tot].w=w;
    edge1[tot].next=head1[u];
    head1[u]=tot++;
}
int lca[1000010];
int find1(int a)
{
    if(fa[a]==a)
        return a;
    else
    {
        int b=find1(fa[a]);
        return fa[a]=b;
    }
}
void tarjan(int u,int a)
{
    vis[u]=a;
  //  printf("%d %d\n",u,a);
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(!vis[v])
        {
            dis[v]=dis[u]+edge[i].w;
            tarjan(v,a);
            fa[v]=u;
        //    printf("%d %d\n",v,u);
        }
    }
    for(int i=head1[u];i!=-1;i=edge1[i].next)
    {

        int v=edge1[i].v;
        if(vis[v]==a)
        {
          //  printf("%d %d\n",v,find1(v));
            lca[edge1[i].w]=find1(v);
        }
    }
}
int main()
{
    int n,m,q;
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        memset(head,-1,sizeof(head));
        cnt=0;
        tot=0;
        for(int i=1;i<=n;i++)
            fa[i]=i;
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        memset(head1,-1,sizeof(head1));
        for(int i=1;i<=q;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add1(a,b,i);
            add1(b,a,i);
        }
        for(int i=0;i<=q;i++)
            lca[i]=inf;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                dis[i]=0;
                tarjan(i,i);
            }
        }

        for(int i=0;i<tot;i+=2)
        {
            int a,b,c;
            a=edge1[i].u;
            b=edge1[i].v;
            c=edge1[i].w;
            if(lca[c]==inf)
                printf("Not connected\n");
            else
                printf("%d\n",dis[a]+dis[b]-2*dis[lca[c]]);
        }
    }
    return 0;
}

E HDU 2876

t组样例

然后  a b x y

求d * d * |F1Q|*|F2Q|

直接算就可以      p在椭圆里   In ellipse      判断 P Q到原点的距离就可以了

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

using namespace std;

#define MAXN 10002
#define inf  1000000007
#define ll long long
#define exp 1e-8
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double a,b,x1,y1;
        scanf("%lf%lf%lf%lf",&a,&b,&x1,&y1);
        if(a<b)
        {
            swap(a,b);
            swap(x1,y1);
        }
        if(x1<0)
            x1=-x1;
        if(y1<0)
            y1=-y1;
        double c=sqrt(a*a-b*b);
        double x0,y0;
        if(fabs(x1)<exp)
        {
            x0=0;
            y0=b;
        }
        else
        {
            x0=sqrt(x1*x1*a*a*b*b/(x1*x1*b*b+y1*y1*a*a));
            y0=y1/x1*x0;
        }
        if(dis(0,0,x0,y0)<=dis(0,0,x1,y1))
        {
             double ans=1/(x0*x0/(a*a*a*a)+y0*y0/(b*b*b*b))*sqrt((x0-c)*(x0-c)+y0*y0)*sqrt((x0+c)*(x0+c)+y0*y0);
            printf("%.0lf\n",ans);
        }
        else
            printf("In ellipse\n");

    }
    return 0;
}

H  HDU 2879

证明的话   不会

结果跑下快速幂就可以了

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

using namespace std;

#define MAXN 10002
#define inf  1000000007
#define ll long long

bool vis[10000010];
int prim[10000005];
ll Quick(ll a,ll b,ll c)
{
    ll ans=1;
    while(b>0)
    {
        if(b&1)
            ans=(ans*a)%c;
        b>>=1;
        a=(a*a)%c;
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(ll i=2;i*i<10000010;i++)
    {
        if(vis[i]==0)
        {
            for(ll j=i*i;j<=10000000;j=j+i)
                vis[j]=1;
        }
    }
    int cnt=0;
    for(int i=2;i<=10000000;i++)
        if(vis[i]==0)
            prim[cnt++]=i;
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        ll ans=0;
        for(int i=0;i<cnt&&prim[i]<=n;i++)
            ans=ans+n/prim[i];
        printf("%lld\n",Quick(2,ans,m));
    }
    return 0;
}

J  HDU 2881

n  m

n*n的矩阵上面   有 m个点 时间   x y

问 最多可以走多少个点

走的花费是(x-x) +(y-y)  然后dp一下就可以了

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

using namespace std;

#define MAXN 10002
#define inf  1000000007
#define ll long long

struct node
{
    int a,b,c;
}z[MAXN];
bool cmp(node a,node b)
{
    return a.a<b.a;
}
int dp[MAXN];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==m&&m==0)
            break;
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&z[i].a,&z[i].b,&z[i].c);
        sort(z+1,z+m+1,cmp);
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            dp[i]=1;
            for(int j=1;j<i;j++)
            {
                if(abs(z[i].a-z[j].a)>=(abs(z[i].b-z[j].b)+abs(z[i].c-z[j].c)))
                    dp[i]=max(dp[i],dp[j]+1);
            }
            ans=max(dp[i],ans);
        }
        printf("%d\n",ans);
    }
    return 0;
}

时间: 2024-08-10 17:00:08

多校 2009 7的相关文章

多校 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

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

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