多校 2013 1

HDU 4602

C

求n 的分解方式 k 出现了几次

先把 n 分解成 n个1   然后考虑  1        k 在边上  2*2^(n-k-1)

2        k 在中间  左边 t1 右边t2  个1  那么就是 2^(t1-1)*2^(t2-1)*(n-k-1)

加起来就是  有些特殊的判断下

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>

using namespace std;

#define inf 1000000007
#define MAXN 100010
#define ll __int64

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);
    while(t--)
    {
        ll n,k;
        scanf("%I64d%I64d",&n,&k);
        ll ans;
        if(k>n)
            ans=0;
        else if(k==n)
            ans=1;
        else if(k==n-1)
            ans=2;
        else
            ans=(Quick(2,n-k,inf)+((n-k-1)*Quick(2,n-k-2,inf))%inf)%inf;
        printf("%I64d\n",ans);
    }
    return 0;
}

HDU 4604

E

n个数放到deque里面 deque 要求不递减 求DQ最大长度

从后往前 针对每个点  求出他的最长不下降自序列  最长不上升子序列

然后去一下同    可以取相反数

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>
#include<queue>

using namespace std;

#define inf 1000000007
#define MAXN 100010
#define ll __int64

int z[MAXN];
int dp1[MAXN],dp2[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        int cnt1,cnt2;
        cnt1=cnt2=0;
        int mx=0;

        for(int i=n;i>=1;i--)
        {
            int a=upper_bound(dp1,dp1+cnt1,z[i])-dp1;
            int b=lower_bound(dp1,dp1+cnt1,z[i])-dp1;
            if(a==cnt1)
                dp1[cnt1++]=z[i];
            else
                dp1[a]=z[i];
            int len1=a+1;
            int same=a-b+1;
            a=upper_bound(dp2,dp2+cnt2,-z[i])-dp2;
            b=lower_bound(dp2,dp2+cnt2,-z[i])-dp2;
            if(a==cnt2)
                dp2[cnt2++]=z[i];
            else
                dp2[a]=-z[i];
            int len2=a+1;
            same=min(same,a-b+1);
            mx=max(len1+len2-same,mx);

        }
        printf("%d\n",mx);
    }
    return 0;
}

HDU 4606

G

n个城市的坐标 m个障碍的坐标    p个士兵 然后城市占领的顺序

士兵走路需要食物 开始是满的  士兵占有城市就可以充满食物 然后城市不能在占有 走i的路消耗i的食物

求最少的开始的食物

1 求每个点之间的距离  2  floyd 算法求最短 3 二分带的食物  那么边小于食物的就可以建上去  4 最小路径覆盖

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>
#include<queue>

using namespace std;

#define inf 1000000007
#define MAXN 510
#define ll long long

int n,m,p;

struct point
{
    double x,y;
    point operator - (point a)const
    {
        point b;
        b.x=x-a.x;
        b.y=y-a.y;
        return  b;
    }
    double operator ^ (const point a)
    {
        return x*a.y-a.x*y;
    }
}z[1010];

struct li
{
    double x1,y1,x2,y2;
}l[1010];
double d[310][310];
int y[MAXN];

bool jud(int a,int b,int c)
{
    point cc,dd;
    cc.x=l[c].x1;
    cc.y=l[c].y1;
    dd.x=l[c].x2;
    dd.y=l[c].y2;

    if(((z[b]-z[a])^(cc-z[a]))*(((z[b]-z[a])^(dd-z[a])))<0&&(((dd-cc)^(z[a]-cc))*(((dd-cc)^(z[b]-cc))))<0)
        return 1;
    return 0;
}
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int head[MAXN],cnt,fa[MAXN];
bool vis[MAXN];
struct node
{
    int v,next;
}edge[MAXN*MAXN];

void add(int u,int v)
{
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
bool dfs(int u)
{
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(vis[v]==1)
            continue;
        if(fa[v]==-1)
        {
            fa[v]=u;
            return 1;
        }
        vis[v]=1;
        if(dfs(fa[v]))
        {
            fa[v]=u;
            return 1;
        }
    }
    return 0;
}
int deal()
{
    int ans=0;
    memset(fa,-1,sizeof(fa));
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))
            ans++;
    }
    return ans;
}
bool check(double a)
{
    cnt=0;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(d[y[i]][y[j]]<=a)
                add(y[i],y[j]+n);
        }
    }
    return n-deal()<=p;
}
void solve()
{
    double l=0,r=inf;
    for(int i=0;i<=50;i++)
    {
        double mid=(l+r)/2;
        if(check(mid))
            r=mid;
        else
            l=mid;
    }
    printf("%.2lf\n",l);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&p);
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&z[i].x,&z[i].y);
        for(int i=1;i<=m;i++)
        {
            scanf("%lf%lf%lf%lf",&l[i].x1,&l[i].y1,&l[i].x2,&l[i].y2);
            z[n+i*2-1].x=l[i].x1;
            z[n+i*2-1].y=l[i].y1;
            z[n+i*2].x=l[i].x2;
            z[n+i*2].y=l[i].y2;
        }
        memset(d,0,sizeof(d));
        for(int i=1;i<=n+m*2;i++)
        {
            for(int j=1;j<=n+m*2;j++)
            {
                if(i==j)
                    d[i][j]=0;
                else
                {
                    int ok=0;

                    for(int k=1;k<=m;k++)
                    {
                       // printf("%d %d %d %d\n",i,j,k,jud(i,j,k));
                        if(jud(i,j,k))
                         {
                             ok=1;
                             break;
                         }
                    }
                    if(ok==1)
                        d[i][j]=d[j][i]=inf;
                    else
                        d[i][j]=d[j][i]=dis(z[i].x,z[i].y,z[j].x,z[j].y);
                }

            }
        }
        for(int k=1;k<=n+m*2;k++)
        {
            for(int i=1;i<=n+m*2;i++)
            {
                for(int j=1;j<=n+m*2;j++)
                    d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
            }
        }
        for(int i=1;i<=n;i++)
            scanf("%d",&y[i]);
        solve();

    }
    return 0;
}

HDU 4607

H

一棵树  边 1   查询  访问 k 个定点要最少走多少路

求树上最长链 长度len       1   k<len+1  那么就是  k-1

2   画个图  len+2*(k-(len+1))   后面那一半就是个来回

dfs 或者bfs

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>
#include<queue>

using namespace std;

#define inf 1000000007
#define MAXN 100010
#define ll __int64

struct node
{
    int to,next;
}edge[MAXN<<1];

int head[MAXN],cnt,d[MAXN];
void add(int u,int v)
{
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
queue<int>q1;
bool vis[MAXN];
int n,m,mx1;

int bfs(int s)
{
    memset(vis,0,sizeof(vis));
    memset(d,0,sizeof(d));
    q1.push(s);
    vis[s]=1;
    while(!q1.empty())
    {
        int now=q1.front();
        q1.pop();
        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int v=edge[i].to;
            if(!vis[v])
            {
                d[v]=d[now]+1;
                q1.push(v);
                vis[v]=1;
            }
        }
    }
    int mx,dis;
    dis=0;
    for(int i=1;i<=n;i++)
    {
        if(d[i]>dis)
        {
            dis=d[i];
            mx=i;
            mx1=dis;
        }
    }
    return mx;
}
int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        cnt=0;
        mx1=0;
        for(int i=1;i<n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
        }
        int a=bfs(1);
        a=bfs(a);
        while(m--)
        {
            int a;
            scanf("%d",&a);
            if(a<=mx1+1)
                printf("%d\n",a-1);
            else
                printf("%d\n",mx1+(a-(mx1+1))*2);
        }
    }
    return 0;
}

HDU 4608

I

+1 大数模拟下

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>
#include<deque>

using namespace std;

#define inf 1000000007
#define MAXN 100010
#define ll __int64

char s[MAXN];
int  z[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int len=strlen(s);
        memset(z,0,sizeof(z));
        for(int i=len-1,j=0;i>=0;j++,i--)
            z[j]=s[i]-‘0‘;
        while(1)
        {
            z[0]++;
            for(int i=0;i<len;i++)
            {
                if(z[i]>9)
                {
                    z[i]=0;
                    z[i+1]++;
                }
            }
            if(z[len]>0)
                len++;
            int sum=0;
            for(int i=0;i<len;i++)
                sum=sum+z[i];
            if(sum%10==0)
                break;
        }
        for(int i=len-1;i>=0;i--)
            printf("%d",z[i]);
        printf("\n");
    }

    return 0;
}

时间: 2024-11-07 10:46:44

多校 2013 1的相关文章

多校 2013 3

B hash 把字符串看成数字插进去 #include<stdio.h> #include<string.h> using namespace std; #define SEED 13331 #define MAXN 2007 #define HASH 10007 int head[HASH]; int cnt; struct node { int id,next; unsigned long long v; }edge[MAXN]; char str[MAXN]; unsigne

多校 2013 8

F 给你ABC三个串 让你求D串 D是AB的子序列 C是D的子串 求D的长度 求出C在AB中出现的位子记录开始位子和结束位子 n^2 枚举在A中位子和在B中位子 然后得到AB 开始位子之前的lcs 和AB结束位子的lcs 开始预处理一下lcs #include <iostream> #include <cstdio> #include <cmath> #include <map> #include <algorithm> #include <

多校 2013 10

I 求n的整数拆分有多少方法 2^(n-1) n太大  欧拉降幂+快速幂 #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; typedef long long ll; #define inf 1e9+7 #define MAXN 100010 char s[MAXN]; ll Quick(ll a,ll b,ll c) { ll ans=1; while(b>

多校 2013 6

A n 然后n个数字 要求组合成的段数最大 低高 低高 ... (a *b -a) *(s/(ab)) #include<stdio.h> #include<string.h> #include<algorithm> #include<deque> #include<set> #include<map> using namespace std; #define ll __int64 #define MAXN 1000010 ll in

hdu 4603 Color the Tree 2013多校1-4

这道题细节真的很多 首先可以想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占领和这个点邻接的边 所以,解决这道题的步骤如下: 预处理阶段: step 1:取任意一个点为根节点,找出父子关系并且对这个树进行dp,求出从某个节点出发往下所包含的所有边的权值总和  复杂度O(n) step 2:从tree dp 的结果中计算对于某个节点,从某条边出发所包含的边的综合,并且对其从大到小进行排序 复杂度O(n*logn) step 3:dfs求出这颗树的欧拉回路,以及每个点的

hdu 4601 Letter Tree 2013多校1-2

不容易啊..一个小错误让我wa死了,找了一个晚上,怎么都找不到 最后是对拍代码找到的错误,发现当步数比较小的时候答案就是对的,比较大的时候就不对了 想到一定是什么地方越界了... power[i] = (i64)(power[i - 1] * 26) % mod; 就是这行... 改成  power[i] = ((i64)power[i - 1] * 26) % mod; 就过了... 这道题总的来说就是非常综合,什么方面都涉及一点,核心部分还是把树转化成序列之后二分边界+RMQ,用dfn来确定

蒟蒻ACMer回忆录 &#183; 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

Word 2013安裝字典

不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 [定義]. 或者,按一下 [校閱] > [定義]. 如果系統提示您登入則請登入,並查看字典清單中的選項,然後按一下 [下載] 以安裝您想要的字典. 下載完成後,字典會自動在 Word 中開啟.此後,每次按一下 [定義] 時就會開啟字典. 提示: 如果您要尋找相似詞,請以滑鼠右鍵按一下文件中的任何單

ActiveReports 9实战教程(1): 手把手搭建好开发环境Visual Studio 2013 社区版

ActiveReports9刚刚公布3天.微软就公布了 Visual Studio Community 2013 开发环境. Visual Studio Community 2013 提供完整功能的 IDE ,可开发 Windows.Android 和 iOS 应用.支持:C++, Python, HTML5, JavaScript, 和 C#,VB, F# 语言的开发.提供设计器.编辑器.调试器和诊断工具. 最牛逼的在于你全然能够免费使用该工具: 能够正大光明的免费使用visual studi