B. 游戏

大意: $n$堆石子, 第$i$堆初始$a_i$, 每次只能选一堆, 假设一堆个数$x$, 只能取$x$的约数, 求先手第一步必胜取法.

SG入门题, 预处理出所有$SG$值. 先手要必胜必须满足留给后手的异或值为0.

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, P2 = 998244353, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head const int N = 1e5+10;
int n, a[N], sg[N], vis[N];
vector<int> fac[N]; void init() {
REP(i,1,N-1) for(int j=i;j<N;j+=i) fac[j].pb(i);
REP(i,1,N-1) {
for (int j:fac[i]) vis[sg[i-j]]=i;
REP(j,0,N-1) if (vis[j]!=i) {
sg[i] = j; break;
}
}
} int main() {
init();
scanf("%d", &n);
int s = 0;
REP(i,1,n) {
scanf("%d", a+i);
s ^= sg[a[i]];
}
if (!s) return puts("0"),0;
int ans = 0;
REP(i,1,n) {
for (int x:fac[a[i]]) {
if (!(s^sg[a[i]]^sg[a[i]-x])) ++ans;
}
}
printf("%d\n", ans);
}

C.收益

大意: 要融资$L$元$n$个人, 融资成功收益$M$, 第$i$个客户有$p_i$概率出钱$m_i$元, 若融资成功要付$m_ir_i$元, 求最后期望收益.

DP求出最终得到$x$元的概率及期望花费, 然后统计答案.

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, P2 = 998244353, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head const int N = 111;
int n, L, M;
int m[N], r[N], p[N];
int f[2][500100], g[2][500100]; int main() {
scanf("%d%d%d", &n, &L, &M);
int sum = 0, inv100 = inv(100);
REP(i,1,n) {
scanf("%d%d%d",m+i,r+i,p+i);
sum += m[i];
r[i] = (ll)m[i]*r[i]%P*inv100%P;
p[i] = (ll)p[i]*inv100%P;
}
int cur = 0;
f[cur][0] = 1;
REP(i,1,n) {
cur ^= 1;
REP(j,0,sum) {
int nxt = j-m[i]>=0?j-m[i]:sum+1;
f[cur][j] = ((ll)f[!cur][nxt]*p[i]+(ll)f[!cur][j]*(1-p[i]))%P;
g[cur][j] = (((ll)g[!cur][nxt]+(ll)r[i]*f[!cur][nxt])%P*p[i]+(ll)g[!cur][j]*(1-p[i]))%P;
}
}
int ans = 0;
REP(i,L,sum) ans = (ans+(ll)f[cur][i]*M-g[cur][i])%P;
if (ans<0) ans += P;
printf("%d\n", ans);
}

D.漂亮的公园

给定树, 点$i$颜色为$c[i]$, 每次询问所有颜色为$x$的点到颜色为$y$的点的最大距离.

结论: 对于树上点集$S$, $S$内距离最远的两点为$x,y$, 则其他点$u$到点集$S$的最远距离必然是$u$到$x$或$u$到$y$.

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <map>
#define REP(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int N = 1e5+10;
int n, q, c[N], sz[N], dep[N];
int fa[N], son[N], top[N];
int f[N][2];
vector<int> g[N];
int b[N]; void dfs(int x, int d, int f) {
sz[x]=1,fa[x]=f,dep[x]=d;
for (int y:g[x]) if (y!=f) {
dfs(y,d+1,x),sz[x]+=sz[y];
if (sz[y]>sz[son[x]]) son[x]=y;
}
}
void dfs(int x, int tf) {
top[x]=tf;
if (son[x]) dfs(son[x],tf);
for (int y:g[x]) if (!top[y]) dfs(y,y);
}
int lca(int x, int y) {
while (top[x]!=top[y]) {
if (dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
int dis(int x, int y) {
if (!x||!y) return 0;
return dep[x]+dep[y]-2*dep[lca(x,y)];
} void upd(int x) {
int &A = f[c[x]][0], &B = f[c[x]][1];
if (!A) A = x;
else if (!B) B = x;
else {
int d1 = dis(A,B), d2 = dis(A,x), d3 = dis(B,x);
if (d2>d1&&d2>d3) {
if (d2>d3) B = x;
else A = x;
}
else if (d3>d1) A = x;
}
} int main() {
scanf("%d%d", &n, &q);
REP(i,1,n) scanf("%d",c+i),b[i]=c[i];
sort(b+1,b+1+n),*b=unique(b+1,b+1+n)-b-1;
REP(i,1,n) c[i]=lower_bound(b+1,b+1+*b,c[i])-b;
REP(i,2,n) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0,0),dfs(1,1);
REP(i,1,n) upd(i);
while (q--) {
int x, y;
scanf("%d%d", &x, &y);
int xx=lower_bound(b+1,b+1+*b,x)-b;
int yy=lower_bound(b+1,b+1+*b,y)-b;
if (b[xx]!=x||b[yy]!=y) {
puts("0"); continue;
}
x = xx, y = yy;
int ans = 0;
REP(i,0,1) REP(j,0,1) ans = max(ans, dis(f[x][i],f[y][j]));
printf("%d\n", ans);
}
}

E. 排序

大意: 初始有一个长为$2n$的排列, 随机打乱后, 将奇数位升序排列, 求期望逆序对. $n\le 5e7$

打个表发现答案是$\frac{7n^2-n}{12}$, 官方题解如下

F 生成树计数 留坑

最新文章

  1. CentOS yum 源的配置与使用
  2. Install MySQL on CentOS 7
  3. 【wikioi】1002 搭桥(dfs+最小生成树)
  4. DoubanFm之设计模式(一)
  5. Educational Codeforces Round 2 A. Extract Numbers 模拟题
  6. JS获取TextArea和Input的同步值
  7. jQuery包裹节点用法完整示例
  8. 使用CMD连接SQL Server
  9. BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
  10. python中的subprocess.Popen()使用
  11. 给定了经纬度的一张my_latlng表,和一个my_grid表,怎么实现my_latlng表回mygrid中的id?
  12. c语言清屏、等待、随机函数
  13. Springboot中enable注解
  14. shell_mysql_ alias 快速启动
  15. Timer-triggered memory-to-memory DMA transfer demonstrator
  16. Ubuntu 18 开机启动慢
  17. windows服务启动的进程无窗口
  18. Android模拟器怎么配置网络连通
  19. &lt;a&gt;标签中的href=&quot;javascript:;&quot;就是去掉a标签的默认行为
  20. 记一次学习SpringBoot RequestBodyAdvice ResponseBodyAdvice RestControllerAdvice

热门文章

  1. CF1197B
  2. pycham更换主题
  3. go中interface作为参数和switch里的type
  4. P1944 最长括号匹配_NOI导刊2009提高(1)
  5. 安装mysql后必须要做的一件事
  6. 如何获取linux内核的某个子系统的维护者邮箱?
  7. Socket概述
  8. php中如何传递Session ID
  9. CockroachDB学习笔记——[译]CockroachDB是如何进行分布式原子事务的
  10. mysql表如何使用redis保存?