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 }
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; }