2017-11-4离线赛总结

题目

3802,3803,3804.

失分小结

估分

100+20+80=200

实际分数

65+0+0=65
小C:你是打酱油的么
我:我本来可以拿200的!
小C:骗谁啊
三题都炸,最烂的一次…
第一题内存开小…
第二题…本来也就只写了P20然后还编译错误…
第三题依旧编译错误…我恨重载!!少加了个const…以及ans没开long long

题解

T1

P65

真的只是无聊给你们看看内存开小的后果

CODE
#include<cstdio>
#include<algorithm>
#define N 100005
int n,m;
int Q[N],Q2[N],l1=1,l2=1,r1,r2;
inline int top() {
    int t1=-2e9,t2=-2e9;
    if(l1<=r1)t1=Q[l1];
    if(l2<=r2)t2=Q2[l2];
    if(t1>=t2) {
        l1++;
        return t1;
    }
    l2++;
    return t2;
}
bool cmp(int _,int __) {return _>__;}

int main() {
    int i;
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)scanf("%d",&Q[i]);
    std::sort(Q+1,Q+1+n,cmp);
    r1=n;
    i=0;
    while(++i) {
        int x=top();
        if(x<i) {
            --i;
            break;
        }
        if(x==i)break;
        Q2[++r2]=x-m+1;
    }
    printf("%d",i);
    return 0;
}
P100
CODE
#include<cstdio>
#include<algorithm>
#define N 500005
int n,m;
int Q[N],Q2[N],l1=1,l2=1,r1,r2;
inline int top() {
    int t1=-2e9,t2=-2e9;
    if(l1<=r1)t1=Q[l1];
    if(l2<=r2)t2=Q2[l2];
    if(t1>=t2) {
        l1++;
        return t1;
    }
    l2++;
    return t2;
}
bool cmp(int _,int __) {return _>__;}

int main() {
    int i;
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)scanf("%d",&Q[i]);
    std::sort(Q+1,Q+1+n,cmp);
    r1=n;
    i=0;
    while(++i) {
        int x=top();
        if(x<i) {
            --i;
            break;
        }
        if(x==i)break;
        Q2[++r2]=x-m+1;
    }
    printf("%d",i);
    return 0;
}

T2

状压dp.

P100

O(2kk).

CODE
#include<cstdio>
#include<cmath>
#include<memory.h>
#define M 20
#define reg register/*不要在意这些细节*/
typedef long long LL;
inline void rd(int &x) {
    x=0;char c;
    while(c=getchar(),c<48);
    do x=(x<<3)+(x<<1)+(c&15);
    while(c=getchar(),c>47);
}
int cnt[M],A[100005];
LL cost[1<<M][M];
LL dp[1<<M],val[M][M];
inline void Min(LL &a,LL b) {if(a>b)a=b;}
int main() {
    int n,k;
    rd(n),rd(k);
    for(reg int i=1; i<=n; i++)rd(A[i]),A[i]--;
    for(reg int i=n; i>=1; i--) {
        for(reg int j=0; j<k; j++)
            if(j!=A[i])
                val[A[i]][j]+=cnt[j];
        cnt[A[i]]++;
    }
    for(reg int i=0; i<k; i++)
        for(reg int j=1; j<(1<<k); j++)
            if(!(j&(1<<i))) {
                reg int x=j&-j;
                cost[j][i]=cost[j-x][i]+val[i][(int)log2(x)];
            }
    memset(dp,127,sizeof dp);
    dp[0]=0;
    for(reg int i=0; i<(1<<k); i++)
        for(reg int j=0; j<k; j++)
            if(!(i&(1<<j)))
                Min(dp[i|(1<<j)],dp[i]+cost[i][j]);
    printf("%lld\n",dp[(1<<k)-1]);
    return 0;
}

T3

P80
CODE
#include<cstdio>
#include<memory.h>
#include<algorithm>
#define N 100005
using namespace std;
struct node2 {int to,nxt;}edge[N<<1];
int head[N],tot;

int dep[N],fa[N],sz[N],son[N],top[N];
struct node {
    int a,b,lca;
    bool operator<(const node _)const/*就是这个const!!!*/ {return dep[lca]>dep[_.lca];}
} A[N];

void dfs1(int x) {
    sz[x]=1;
    for(int i=head[x]; ~i; i=edge[i].nxt) {
        node2 y=edge[i];
        if(y.to==fa[x])continue;
        fa[y.to]=x;
        dep[y.to]=dep[x]+1;
        dfs1(y.to);
        sz[x]+=sz[y.to];
        if(sz[son[x]]<sz[y.to])
            son[x]=y.to;
    }
}
void dfs2(int x,int tp) {
    top[x]=tp;
    if(son[x])dfs2(son[x],tp);
    for(int i=head[x]; ~i; i=edge[i].nxt) {
        int y=edge[i].to;
        if(y==fa[x]||y==son[x])continue;
        dfs2(y,y);
    }
}
int LCA(int a,int b) {
    while(top[a]!=top[b]) {
        if(dep[top[a]]>dep[top[b]])a=fa[top[a]];
        else b=fa[top[b]];
    }
    return dep[a]>dep[b]?b:a;
}
int du[N];
bool cmp(node a,node b) {return a.a<b.a;}

int main() {
    int n,m,a,b;
    scanf("%d %d",&n,&m);
    memset(head,-1,sizeof head);
    bool flag=1;
    for(int i=1; i<n; i++) {
        scanf("%d %d",&a,&b);
        edge[tot]=(node2) {b,head[a]},head[a]=tot++;
        edge[tot]=(node2) {a,head[b]},head[b]=tot++;
        du[a]++;
        du[b]++;
        if(a!=b+1&&b!=a+1)flag=0;
    }
    dfs1(1);
    dfs2(1,1);
    for(int i=1; i<=m; i++) {
        scanf("%d %d",&A[i].a,&A[i].b);
        A[i].lca=LCA(A[i].a,A[i].b);
        if(A[i].a>A[i].b) {
            int t=A[i].a;
            A[i].a=A[i].b;
            A[i].b=t;
        }
    }
    long long ans=0;
    if(!flag) {//非链
        sort(A+1,A+m+1);
        for(int i=1; i<=m; i++) {
            for(int j=i+1; j<=m; j++) {
                int lcai=A[i].lca,lcaj=A[j].lca;
                if(lcai!=lcaj&&lcai!=A[j].a&&lcai!=A[j].b) {
                    if(dep[lcai]==dep[lcaj])continue;
                    int cnt=0;
                    bool f=0;
                    if(dep[lcai]<=dep[A[j].a])cnt++;
                    if(dep[lcai]<=dep[A[j].b])f=1,cnt++;
                    if(cnt==0)continue;
                    else if(cnt==1) {
                        if(f&&LCA(lcai,A[j].b)==lcai)ans++;
                        else if(LCA(lcai,A[j].a)==lcai)ans++;
                    } else {
                        cnt=0;
                        if(LCA(lcai,A[j].a)!=lcai)cnt++;
                        if(LCA(lcai,A[j].b)!=lcai)cnt++;
                        if(cnt==1)ans++;
                    }
                } else ans++;
            }
        }
    } else {//链
        sort(A+1,A+m+1,cmp);
        for(int i=1; i<m; i++) {
            int x=A[i].b,pos=i;
            int L=i+1,R=m;
            while(L<=R) {
                int mid=(L+R)>>1;
                if(A[mid].a<=x) {
                    L=mid+1;
                    pos=mid;
                } else R=mid-1;
            }
            ans+=pos-i;
        }
    }
    printf("%lld\n",ans);
    return 0;
}
P100
CODE
#include<cstdio>
#include<memory.h>
#define N 100005
using namespace std;

inline void rd(int &x){
    x=0;char c;
    while(c=getchar(),c<48);
    do x=(x<<1)+(x<<3)+(c&15);
    while(c=getchar(),c>47);
}

struct node2 {int to,nxt;}edge[N<<1];
int head[N],tot;

int dep[N],fa[N],sz[N],son[N],top[N];
void dfs1(int x) {
    sz[x]=1;
    for(register int i=head[x]; ~i; i=edge[i].nxt) {
        node2 y=edge[i];
        if(y.to==fa[x])continue;
        fa[y.to]=x;
        dep[y.to]=dep[x]+1;
        dfs1(y.to);
        sz[x]+=sz[y.to];
        if(sz[son[x]]<sz[y.to])
            son[x]=y.to;
    }
}
void dfs2(int x,int tp) {
    top[x]=tp;
    if(son[x])dfs2(son[x],tp);
    for(register int i=head[x]; ~i; i=edge[i].nxt) {
        register int y=edge[i].to;
        if(y==fa[x]||y==son[x])continue;
        dfs2(y,y);
    }
}
int LCA(int a,int b) {
    while(top[a]!=top[b]) {
        if(dep[top[a]]>dep[top[b]])a=fa[top[a]];
        else b=fa[top[b]];
    }
    return dep[a]>dep[b]?b:a;
}
int sum[N],cnt[N];
long long ans=0;
void DFS(int x) {
    for(register int i=head[x]; ~i; i=edge[i].nxt) {
        register int y=edge[i].to;
        if(y==fa[x])continue;
        DFS(y);
        sum[x]+=sum[y];
    }
    ans+=1LL*cnt[x]*sum[x]+1LL*cnt[x]*(cnt[x]-1)/2;
}

int main() {
    int n,m,a,b,lca;
    rd(n),rd(m);
    memset(head,-1,sizeof head);
    for(register int i=1; i<n; i++) {
        rd(a),rd(b);
        edge[tot]=(node2) {b,head[a]},head[a]=tot++;
        edge[tot]=(node2) {a,head[b]},head[b]=tot++;
    }
    dfs1(1);
    dfs2(1,1);
    for(register int i=1; i<=m; i++) {
        rd(a),rd(b);
        lca=LCA(a,b);
        sum[a]++;sum[b]++;sum[lca]-=2;cnt[lca]++;
    }
    DFS(1);
    printf("%lld\n",ans);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用 JavaScript 编写的杀死幽灵游戏(附源代码) 杀死鬼魂游戏是使用 Vanilla JavaScript、CSS 和 HTML 画布开发的简单项目。这款游戏很有趣。玩家必须触摸/杀死游荡的鬼魂才能得分。您必须将鼠标悬停在鬼魂上 - 尽量得分。鬼魂在眨眼间不断从一个地方移动到另一个地方。您必须在 1 分钟内尽可能多地杀死鬼魂。 游戏制作 这个游戏项目只是用 HTML 画布、CSS 和 JavaScript 编写的。说到这个游戏的特点,用户必须触摸/杀死游荡的幽灵才能得分。游戏会根据你杀死的幽灵数量来记录你的总分。你必须将鼠标悬停在幽灵上——尽量得分。你必须在 1 分钟内尽可能多地杀死幽灵。游戏还会显示最高排名分数,如果你成功击败它,该分数会在游戏结束屏幕上更新。 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要玩游戏,首先,单击 index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
javascript 中的 Paint War Game 是使用 HTML、CSS 和 JavaScript 开发的。谈到游戏玩法,这款游戏的主要目标是建造比敌人更多的油漆砖。您所要做的就是使用 WASD 键输入玩家的动作。您可以使用 VS Code 来运行该项目。 关于项目 每次您的玩家走过一块瓷砖时,它都会被涂成您的团队颜色。您必须在同一块瓷砖上走 4 次才能获得更多游戏点数。瓷砖会被您的团队挡住,并且不能再被偷走。如果您走过另一支球队的瓷砖,它会像您第一次走过时一样被涂上颜色。如果您创建一个封闭的被阻挡瓷砖图形,图形内所有未被阻挡的瓷砖都将固定为您的团队颜色。这个游戏充满乐趣,创造和重新即兴发挥会更有趣。 要运行此项目,我们建议您使用现代浏览器,例如 Google Chrome、  Mozilla Firefox。该游戏可能还支持 Explorer/Microsoft Edge。 演示: javascript 中的 Paint War Game 是使用 HTML、CSS 和 JavaScript 开发的。谈到游戏玩法,这款游戏的主要目标是建造比敌人更多的油漆砖。您所要做的就是使用 WASD 键输入玩家的动作。您可以使用 VS Code 来运行该项目。 关于项目 每次您的玩家走过一块瓷砖时,它都会被涂成您的团队颜色。您必须在同一块瓷砖上走 4 次才能获得更多游戏点数。瓷砖会被您的团队挡住,并且不能再被偷走。如果您走过另一支球队的瓷砖,它会像您第一次走过时一样被涂上颜色。如果您创建一个封闭的被阻挡瓷砖图形,图形内所有未被阻挡的瓷砖都将固定为您的团队颜色。这个游戏充满乐趣,创造和重新即兴发挥会更有趣。 要运行此项目,我们建议您使用现代浏览器,例如 Google Chrome、  Mozilla Firefox。该游戏可能还支持 Explorer/Microsoft Edge。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值