zoukankan      html  css  js  c++  java
  • 5.22 noip模拟赛

    本来我是不想写的,无奈不会写。蒟蒻 考场就是想不出来 今天得到了100分额外水过了100分我是真的失败。还有一个根本不会check 感觉自己非常之菜。

    这道题是这样的 还行吧比较有意思 首先确立一个真命题对于一个入度为2的点其一定是属于链上的一点的。因为 考虑其不在链上的情况如果连接的是不管连接的一定是多度数点>=3和其他的点但其末尾一定是一个度数等于1的点我们将其提上来把当前的点插到直径上即可。为什么不考虑单度数点呢?因为树的直径一定只有两个单度数点我们考虑也没用。

    再确定一个假命题 当一棵树的度数一定是这颗树也确定,假的!同分异构体和等效氢的方法将其排除!那么此时对答案的影响就只有多度数点了考虑对答案的贡献是 任意一个多度数点和双度数点一样都可以连在树的直径之上这个我们随便想都是可行的。于是有解法了 对于多度数点删一些边即可当度数>=3时删掉n-2条边然后就没了。

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<queue>
    #include<iomanip>
    #include<cctype>
    #include<cstdio>
    #include<deque>
    #include<utility>
    #include<cmath>
    #include<ctime>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<map>
    #include<set>
    #include<bitset>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)>(y)?(y):(x))
    #define INF 1000000000
    #define ll long long
    #define db double
    using namespace std;
    char buf[1<<15],*fs,*ft;
    inline char getc()
    {
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline int read()
    {
        int x=0,f=1;char ch=getc();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
        return x*f;
    }
    inline void put(int x)
    {
        x<0?putchar('-'),x=-x:0;
        int num=0;char ch[50];
        while(x)ch[++num]=x%10+'0',x/=10;
        num==0?putchar('0'):0;
        while(num)putchar(ch[num--]);
        putchar('
    ');return;
    }
    const int MAXN=50;
    int n,flag,ans,cnt,flag1;
    int a[MAXN];
    int main()
    {
        freopen("1.in","r",stdin);
        //freopen("tree.in","r",stdin);
        //freopen("tree.out","w",stdout);
        n=read();ans=n-1;
        for(int i=1;i<=n;++i)
        {
            a[i]=read();
            if(a[i]>=3)ans-=a[i]-2;
            if(a[i]==n-1&&n>2)flag1=1;
            if(a[i]<=0)flag=1;
            cnt+=a[i];
        }
        if(cnt!=((n-1)<<1))flag=1;
        if(flag==1){put(-1);return 0;}
        if(flag1==1){put(2);return 0;}
        put(ans);
        return 0;
    }
    View Code

    看完题目显然是一个二分 但是我不会check 丢人 check是 找到ad的值域和bc的值域观察是否有交集即可。

    我没想到我不知道为什么我会没想到 这我知道了以后感觉很显然就这样判断一下就是100分诶。

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<queue>
    #include<iomanip>
    #include<cctype>
    #include<cstdio>
    #include<deque>
    #include<utility>
    #include<cmath>
    #include<ctime>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<map>
    #include<set>
    #include<bitset>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)>(y)?(y):(x))
    #define INF 1000000000
    #define ll long long
    #define db double
    using namespace std;
    char buf[1<<15],*fs,*ft;
    inline char getc()
    {
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline int read()
    {
        int x=0,f=1;char ch=getc();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
        return x*f;
    }
    inline void put(int x)
    {
        x<0?putchar('-'),x=-x:0;
        int num=0;char ch[50];
        while(x)ch[++num]=x%10+'0',x/=10;
        num==0?putchar('0'):0;
        while(num)putchar(ch[num--]);
        putchar('
    ');return;
    }
    int a,b,c,d;
    inline int check(db x)
    {
        db maxx,maxx1,minn,minn1;
        maxx=maxx1=-(ll)INF*(ll)INF*1.0;
        minn=minn1=(ll)INF*(ll)INF*1.0;
        db a1=a+x,a2=a-x;
        db b1=b+x,b2=b-x;
        db c1=c+x,c2=c-x;
        db d1=d+x,d2=d-x;
        maxx=max(maxx,a1*d1);
        maxx=max(maxx,a1*d2);
        maxx=max(maxx,a2*d1);
        maxx=max(maxx,a2*d2);
        minn=min(minn,a1*d1);
        minn=min(minn,a1*d2);
        minn=min(minn,a2*d1);
        minn=min(minn,a2*d2);
        maxx1=max(maxx1,c1*b1);
        maxx1=max(maxx1,c1*b2);
        maxx1=max(maxx1,c2*b1);
        maxx1=max(maxx1,c2*b2);
        minn1=min(minn1,c1*b1);
        minn1=min(minn1,c1*b2);
        minn1=min(minn1,c2*b1);
        minn1=min(minn1,c2*b2);
        if(minn<=maxx1&&minn>=minn1)return 1;
        if(maxx<=maxx1&&maxx>=minn1)return 1;
        return 0;
    }
    int main()
    {
        freopen("1.in","r",stdin);
        //freopen("matrix.in","r",stdin);
        //freopen("matrix.out","w",stdout);
        a=read();b=read();c=read();d=read();
        //if(a==1&&b==2&&c==3&&d==4){puts("0.2000000000");return 0;}
        db l=0,r=1000000000.0;
        while(l+0.0000001<r)
        {
            db mid=(l+r)/2;
            if(check(mid))r=mid;
            else l=mid;
        }
        if(check(l))printf("%.12lf",l);
        else printf("%.12lf",r);
        return 0;
    }
    View Code

    这个简单一个矩阵快速幂解决了。。

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<queue>
    #include<iomanip>
    #include<cctype>
    #include<cstdio>
    #include<deque>
    #include<utility>
    #include<cmath>
    #include<ctime>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<map>
    #include<set>
    #include<bitset>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)>(y)?(y):(x))
    #define INF 1000000000
    #define ll long long
    #define db double
    using namespace std;
    char buf[1<<15],*fs,*ft;
    inline char getc()
    {
        return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
    }
    inline ll read()
    {
        ll x=0,f=1;char ch=getc();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
        return x*f;
    }
    inline void put(ll x)
    {
        x<0?putchar('-'),x=-x:0;
        ll num=0;char ch[50];
        while(x)ch[++num]=x%10+'0',x/=10;
        num==0?putchar('0'):0;
        while(num)putchar(ch[num--]);
        putchar('
    ');return;
    }
    const ll MAXN=10;
    ll n,m;
    ll f[MAXN];
    ll w=2;
    struct wy
    {
        ll A[MAXN][MAXN];
        wy(){memset(A,0,sizeof(A));}
        wy friend operator*(wy a,wy b)
        {
            wy tmp;
            for(ll i=1;i<=w;++i)
                for(ll j=1;j<=w;++j)
                    for(ll k=1;k<=w;++k)
                        tmp.A[i][j]=(tmp.A[i][j]+a.A[i][k]*b.A[j][k]%m)%m;
            return tmp;
        }
    }c;
    inline void fast(ll x)
    {
        while(x)
        {
            if(x&1)
            {
                ll tmp1=(f[1]*c.A[1][1]%m+f[2]*c.A[2][1]%m)%m;
                ll tmp2=(f[1]*c.A[1][2]%m+f[2]*c.A[2][2]%m)%m;
                f[1]=tmp1;f[2]=tmp2;
            }
            x=x>>1;
            c=c*c;
        }
    }
    int main()
    {
        //freopen("1.in","r",stdin);
        freopen("fibonacci.in","r",stdin);
        freopen("fibonacci.out","w",stdout);
        n=read();m=read();
        if(n==1||n==0){put(1%m);return 0;}
        c.A[1][1]=0;c.A[1][2]=1;
        c.A[2][1]=1;c.A[2][2]=1;
        f[1]=1;f[2]=1;
        fast(n);
        put(f[1]%m);
        return 0;
    }
    View Code

    今天发挥的不太好没有充分利用知识至少第二题的二分我应该是可以想出来的。

  • 相关阅读:
    Jquery 操作radio实例
    不错的linux下通用的java程序启动脚本(转载)
    activeMQ消费消息时网络流量异常大的问题
    利用passssh,批量远程修改机器密码
    tomcat的maxThreads、acceptCount(最大线程数、最大排队数)
    非阻塞IO、NIO为什么会快,我们为什么需要多线程
    关于find命令 name 匹配字符无法正确生效的问题 find: paths must precede expression:
    想取得刚才nextval()的值时,放心大胆的用currval()吧,currval()的返回值并不会因为nextval()的并发访问而混乱
    slef4j的好处
    杂(一) 奶酪
  • 原文地址:https://www.cnblogs.com/chdy/p/10908163.html
Copyright © 2011-2022 走看看