2017.10.3离线赛总结

第1题:写书
题意:(…)总而言之,输入n,计算1~n每个数字位数的总和(n<=10^9)

虽然是水题,但考试时做的还是太慢了,
现在回忆一下,当时只想着把数切分,再来打个小表。(还虚的要对拍)
然而,这题推公式也是很容易的…

第2题:LR棋盘
题意:
有一个长度为1*n的棋盘,有一些棋子在上面,标记为L和R。
每次操作可以把标记为L的棋子,向左移动一格,把标记为R的棋子,向右移动一格,前提条件是目标格子为空。
结果任意多次操作之后,棋盘会有多少种不同的状态?
(棋子数不超过2000,棋盘长度不超过20000)。
考试的时候没多想,只打了暴力,但赛后看来,此题的dp完全是写过的…
(反思,以前的笔记多翻翻,时刻记住题型)

#include<bits/stdc++.h>
#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--) 
#define N 20005
#define M 2005
using namespace std;
const int P=1e9+7;
char s[N];
int n,m;
int L[M],R[M];
int dp[M];
int main(){
    scanf("%s",s+1);
    int n=strlen(s+1);
    REP(i,1,n){
        if(s[i]=='L')L[++m]=0,R[m]=i;
        else if(s[i]=='R')L[++m]=i,R[m]=n;
    }
    dp[0]=1;
    REP(i,1,n)
        DREP(j,m,1)
            if(i>=L[j] && i<=R[j])
                dp[j]+=dp[j-1],dp[j]%=P;
    cout<<dp[m]<<endl;
    return 0;
}

第3题:道路评价
题意:
乐乐的家乡,进行了道路改进,n户人家,用n-1条道路连接,形成一棵树。
他想通过程序来评价一下这些道路的性能。从x点到达y点时,记录一下这条路上最长的边,和最短的边。
用它们的差值来表示x到y的方便程度。
乐乐想知道任意两户人家的方便程度之和。

总而言之,就是求∑(d.max-d.min)
那么,也就是求∑d.max-∑d.min;
这也是很好求的,(赛后一切都是屁话…)
只要知道该边左右的节点数即可,ans+=cntl*cntr*d.cost;
而cnt就可以用并查集来合并

#include<bits/stdc++.h>
#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long
#define INF 0x3f3f3f3f
#define N 100005
using namespace std;
int n,a,b,c;
LL ans;
struct node{
    int from,to,cost;
    bool operator<(const node &a)const{
        return cost>a.cost;
    }
}E[N];
int cnt[N],fa[N];
int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}
int main(){
    scanf("%d",&n);
    REP(i,1,n-1)scanf("%d%d%d",&E[i].from,&E[i].to,&E[i].cost);
    REP(i,1,n)fa[i]=i,cnt[i]=1;
    sort(E+1,E+n);
    REP(i,1,n-1){
        int x=Find(E[i].from);
        int y=Find(E[i].to);
        fa[x]=y;
        ans-=1LL*cnt[x]*cnt[y]*E[i].cost;
        cnt[y]+=cnt[x];
    }
    REP(i,1,n)fa[i]=i,cnt[i]=1;
    DREP(i,n-1,1){
        int x=Find(E[i].from);
        int y=Find(E[i].to);
        fa[x]=y;
        ans+=1LL*cnt[x]*cnt[y]*E[i].cost;
        cnt[y]+=cnt[x];
    }
    cout<<ans<<endl;
    return 0;
}

小结:
其实这一次应该是最简单的一次了。无论是代码长度(每题都没超过1000B),还是思路(都讲过了)。而只是敲了暴力分,可最终连暴力分都没水完(第2题内存没注意)。
可见自我的代码实现能力还需要提高。
第1题还是要做的快点,控制在10min~20min。
第2,3题暴力敲的还时慢了点,代码功底有待提高。
最后剩下的时间先去想第2题,真的有时间多,并且有200分的把握,再去写第3题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值