T1猎人杀

想玩lrs了

考场上写出正解然后手模错了口胡样例把自己hack,气死

把问题转化一下,1号猎人ger屁的局数就是在它死之前的期望人数+1;

那么每个猎人在他之前ger屁的概率就是(w[i])/(w[1]+w[i]);把他们加起来再加个1就好了

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 inline int read()
 5 {    
 6     int x=0,f=1;char ch=getchar();
 7     while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
 8     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
 9     return x*f;
10 }
11 const int maxn=1e5+5;
12 const int mod=998244353;
13 int n,w[maxn],sum;
14 int f[maxn];
15 int dp[maxn],ans=0;
16 inline int ksm(int x,int y)
17 {
18     int res=1;x%=mod;
19     while(y)
20     {
21         if(y&1) res=res*x%mod;
22         x=x*x%mod;y>>=1;
23     }
24     return res;
25 }
26 signed main()
27 {
28     n=read();for(int i=1;i<=n;i++) w[i]=read();
29     int base=1;
30     for(int i=2;i<=n;i++)
31     ans+=w[i]*ksm(w[1]+w[i],mod-2)%mod;
32     cout<<ans%mod+1<<endl;
33 }
T1

T2Defence

线段树合并+玫瑰花精,挺好写的,只不过快读打错,tio了半天

维护一下最左边的1,最右边的1,中间最长的0序列就好了

最后ans就是最左边的0序列和最右边的0序列的和以及中间最长的0的最大值

T3Connect

可恶,今晚没有暴颓时间,咕了

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1 ;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int n,m;
int dis[21][21],dp[1<<15][16][2],f[1<<15][16],h[1<<15];
inline int getval(int x,int y)
{
    int res=0; for(int i=0;i<n;++i)
    if(x>>i&1) res+=f[y][i];
        return res;
}
signed main()
{
    n=read(),m=read();int x,y,z;
    for(int i=1;i<=m;i++)
    {
        x=read()-1;y=read()-1;z=read();
        dis[x][y]=z; dis[y][x]=z;
    }
    memset(dp,0x3f,sizeof(dp)); int U=(1<<n)-1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++) f[1<<j][i]=dis[j][i];
        for(int j=1,z;j<=U;++j) z=j&-j,f[j][i]=f[j^z][i]+f[z][i];
    }
    int ans=1e9;
    for(int i=0;i<=U;++i) h[i]=getval(i,U^i);dp[1][0][0]=0;
    for(int z=0;z<(1<<n);++z)for(int i=0;i<n;++i)
    {
        if(dp[z][i][0]<1e9) for(int zz=U^z;~zz;--zz)
            {
                zz&=U^z;
                dp[z|zz][i][1]=min(dp[z|zz][i][1],dp[z][i][0]+h[(1<<i)|zz]);
            }
        if(dp[z][i][1]<1e9)
            {
                if(i==n-1) ans=min(ans,dp[z][i][1]);
                for(int j=0;j<n;++j) if(!(z>>j&1)&&dis[i][j])
                dp[z|(1<<j)][j][0]=min(dp[z|(1<<j)][j][0],dp[z][i][1]-2*dis[i][j]);
            }
    }
    cout<<ans/2<<endl;
}
T3

 

posted on 2021-08-08 20:43  JYFHYX  阅读(31)  评论(0编辑  收藏  举报