day4下

来源:互联网 发布:西地那非淘宝 编辑:程序博客网 时间:2024/06/11 06:13

t1
已知一个数列{a}的前两项a1,a2,且n>2时,f(n)=|f(n-1)-f(n-2)|。
你需要求出:这个数列中出现了多少个不同的数?
打个表一看,这个就是更相减损法,就是辗转相除

#include<cstdio>#include<cmath>#include<iostream>using namespace std;#define ll long longll ans;ll gcd(ll x,ll y){    if(!y) return x;    ans+=x/y;    return gcd(y,x%y);}ll a,b;int main(){    freopen("seq.in","r",stdin);    freopen("seq.out","w",stdout);     scanf("%lld%lld",&a,&b);    if(a<b) swap(a,b);    gcd(a,b);    printf("%lld",ans+1);}

t2
弄一个树,上面的点代表车的重量,叶节点是每个城市,儿子就是比这个车的重量小的,像是个大根堆

#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#define ll long long#define M 510000struct st{    int x,y,s;    inline bool operator <(const  st &b)const{        return s>b.s;    } }e[M];int n,m,f[M],v[M],size[M],son[M][2],N;ll ans[M];int find(int x){    return f[x]=f[x]==x?x:find(f[x]);}void dfs(int x,int fat,ll cnt){    if(fat){        if(v[x]==v[fat]) size[x]=size[fat];        else cnt+=1ll*(size[fat]-size[x])*(size[fat]-size[x]);    }    if(son[x][0])        dfs(son[x][0],x,cnt),dfs(son[x][1],x,cnt);    else ans[x]=cnt;    return ;}int main(){    freopen("car.in","r",stdin);    freopen("car.out","w",stdout);    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].s);    std::sort(e+1,e+m+1);    for(int i=1;i<=n;i++) f[i]=i;    for(int i=1;i<=n;i++) size[i]=1;    N=n;    for(int i=1;i<=m;i++){        int fx=find(e[i].x);int fy=find(e[i].y);        if(fx==fy) continue;        son[++N][0]=fx;        son[N][1]=fy;        f[fx]=f[fy]=N;        f[N]=N;v[N]=e[i].s;        size[N]=size[fx]+size[fy];      }    dfs(N,0,0);    for(int i=1;i<=n;i++) printf("%lld ",ans[i]);}
原创粉丝点击