2019: Fleecing the Raffle
#include<iostream>
using namespace std;
int main(void)
{
long long n,p ;
while(cin>>n>>p)
{
double x = n/(p-1);
double ans = 1;
ans *= (double)p*x/(n+1);
for(int i = 2;i <= p+1;++i)
ans *= (double)(n-p+i)/(n + x -p+i-1);
printf("%0.8f\n",ans);
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
struct node_t{
int val;
int suit;
int idx;
}p[60];
int increas[6],ssort[6];
bool cmp(node_t &a,node_t &b){
if(a.suit==b.suit)
return (increas[a.suit]&&a.val<b.val)||(!increas[a.suit]&&a.val>b.val);
return ssort[a.suit]<ssort[b.suit];
}
int Idx[60],flag[6]={0};
int DP[60];
char s[3];
int ans,n;
int S_Int_val(char a){
if('2'<=a&&a<='9')
return a-'1';
if(a=='T') return 9;
if(a=='J') return 10;
if(a=='Q') return 11;
if(a=='K') return 12;
return 13;
}
int S_Int_suit(char a){
if(a=='s') return 1;
if(a=='h') return 2;
if(a=='d') return 3;
return 4;
}
void dfs(int rt){
if(rt==0){
sort(p,p+n,cmp);
for(int i=0;i<n;++i)
Idx[p[i].idx]=i;
DP[0]=1;
int maxn=1;
for(int i=1;i<n;++i){
DP[i]=1;
for(int j=0;j<i;++j)
if(Idx[j]<Idx[i]) DP[i]=max(DP[j]+1,DP[i]);
maxn=max(maxn,DP[i]);
}
ans=min(n-maxn,ans);
}
for(int i=1;i<=4;++i){
if(flag[i])continue;
flag[i]=1;
ssort[rt]=i;
dfs(rt-1);
flag[i]=0;
}
}
int main(){
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%s",s);
p[i].val=S_Int_val(s[0]);
p[i].suit=S_Int_suit(s[1]);
p[i].idx=i;
}
ans=1e9;
for(int i=0;i<(1<<4);++i){
for(int j=0;j<4;++j)
increas[j+1]=((1<<j)&i)?1:0;
dfs(4);
}
printf("%d\n",ans);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
typedef long long ll;
const int N=1e6+10;
using namespace std;
int X[4]={0,0,-1,1};
int Y[4]={1,-1,0,0};
struct query{int x1,y1,x2,y2;} Q[10010];
int n,m,q,f[N],num[1010][1010],p[1010][1010];
int ans[10010],tot=0; bool v[N];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
bool check(int x,int y)
{
if (x<=0||y<=0||x>n||y>m) return 0;
return 1;
}
void work(int x,int y)
{
tot++;
f[num[x][y]]=num[x][y];
for(int k=0;k<4;k++)
{
int xx=x+X[k],yy=y+Y[k];
if (!check(xx,yy)||p[xx][yy]) continue;
if (find(num[xx][yy])==find(num[x][y])) continue;
f[find(num[xx][yy])]=find(num[x][y]); tot--;
}
}
int main(){
int no=0;
scanf("%d%d%d",&m,&n,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
num[i][j]=++no,f[no]=no;
for(int i=1;i<=q;i++)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&y1,&x1,&y2,&x2);
if (x1==x2)
{
if (y1>y2) swap(y1,y2);
for(int j=y1;j<=y2;j++) p[x1][j]++;
} else
{
if (x1>x2) swap(x1,x2);
for(int j=x1;j<=x2;j++) p[j][y1]++;
}
Q[i]=query{x1,y1,x2,y2};
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if (p[i][j]) continue;
for(int k=0;k<4;k++)
{
int xx=i+X[k],yy=j+Y[k];
if (!check(xx,yy)) continue;
if (p[xx][yy]) continue;
if (find(num[xx][yy])==find(num[i][j])) continue;
f[find(num[xx][yy])]=find(num[i][j]);
}
}
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if (p[i][j]) continue;
int fa=find(num[i][j]);
if (v[fa]) continue;
v[fa]=1; tot++;
}
ans[q]=tot;
for(int k=q;k>=2;k--)
{
if (Q[k].x1==Q[k].x2)
{
for(int i=Q[k].y1;i<=Q[k].y2;i++)
if (!--p[Q[k].x1][i]) work(Q[k].x1,i);
} else
{
for(int i=Q[k].x1;i<=Q[k].x2;i++)
if (!--p[i][Q[k].y2]) work(i,Q[k].y2);
}
ans[k-1]=tot;
}
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#define N 1000010
#define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
char s[N];
int n,m;
struct Trie
{
struct node{int ch[28],cnt;}T[N];
int tot,root,d[N]; bool v[N];
void init(){tot=root=1;}
int newnode()
{
++tot;
for(int i=0;i<28;i++)
T[tot].ch[i]=0;
T[tot].cnt=0;
return tot;
}
void ins(char* x)
{
int o=root;
vector<int> point;
for(int k=0;x[k];k++)
{
int c=x[k]-'a';
if (!T[o].ch[c]) T[o].ch[c]=newnode();
if (!T[o].ch[26]&&!T[o].cnt) point.push_back(o);
T[T[o].ch[c]].ch[27]=o; o=T[o].ch[c];
}
T[o].cnt++;
for(int i=0;i<point.size();i++)
if (point[i]!=root) T[point[i]].ch[26]=o;
}
void bfs()
{
queue<int> q;
memset(v,0,sizeof(v));
q.push(root); d[root]=0; v[root]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=0;i<28;i++)
{
int y=T[x].ch[i];
if (y==0||v[y]) continue;
v[y]=1; d[y]=d[x]+1; q.push(y);
}
}
}
int query(char* x)
{
int o=root,k;
for(k=0;x[k];k++)
{
int c=x[k]-'a';
if (T[o].ch[c]==0) break;
o=T[o].ch[c];
}
return d[o]+strlen(x)-k;
}
} Trie;
int main()
{
while(cin>>n>>m)
{
Trie.init();
while(n--)
{
scanf("%s",s);
Trie.ins(s);
}
Trie.bfs();
while(m--)
{
scanf("%s",s);
printf("%d\n",Trie.query(s));
}
puts("");
}
return 0;
}