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('\n');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; }
看完题目显然是一个二分 但是我不会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('\n');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; }
这个简单一个矩阵快速幂解决了。。
//#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('\n');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; }
今天发挥的不太好没有充分利用知识至少第二题的二分我应该是可以想出来的。