C - Good Sequence

题解

用个map愉悦一下就好了

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N;
int a[MAXN],ans;
map<int,int> zz;
void Init() {
read(N);
for(int i = 1 ; i <= N ; ++i) {read(a[i]);zz[a[i]] += 1;}
sort(a + 1,a + N + 1);
N = unique(a + 1,a + N + 1) - a - 1;
}
void Solve() {
for(int i = 1 ; i <= N ; ++i) {
if(zz[a[i]] < a[i]) ans += zz[a[i]];
else ans += zz[a[i]] - a[i];
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

D - FT Robot

如果经过了奇数个T,那么原来在x轴上走,后来肯定在y轴上走,原来y轴变为x轴

如果偶数个T,那么保持原来的轴不变

我们会选定一个方向使得在这个方向上走后面的F的个数

这个可以用一个简单的背包(加上bitset优化一下)实现,注意在序列最前的F手动走完,因为无法改成X轴负方向

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,x,y,s,t;
char str[8005];
vector<int> dir[2];
bitset<16005> f[2];
bool cmp(int a,int b) {
return a > b;
}
void Solve() {
scanf("%s",str + 1);read(x);read(y);
N = strlen(str + 1);
int d = 0;
s = 0,t = 0;
int p = 1;
while(p <= N && str[p] == 'F') {++s;++p;}
int cnt = 0;
for(int i = p ; i <= N ; ++i) {
if(str[i] == 'T') {
if(cnt) dir[d].pb(cnt);
d ^= 1;cnt = 0;
}
else {++cnt;}
}
if(cnt) dir[d].pb(cnt);
if(abs(s - x) > N) {puts("No");return;}
int cur = 0;
f[cur].reset();
f[cur][8000] = 1;
for(auto k : dir[0]) {
f[cur ^ 1].reset();
f[cur ^ 1] = (f[cur] << k) | (f[cur] >> k);
cur ^= 1;
}
if(!f[cur][8000 + abs(s - x)]) {puts("No");return;}
cur = 0;
f[cur].reset();
f[cur][8000] = 1;
for(auto k : dir[1]) {
f[cur ^ 1].reset();
f[cur ^ 1] = (f[cur] << k) | (f[cur] >> k);
cur ^= 1;
}
if(!f[cur][8000 + abs(t - y)]) {puts("No");return;}
puts("Yes");
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

E-Prefix-free Game

给每个可以走的点的sg函数简单推一下,从第(L - 1)层开始归纳

很容易发现sg函数是lowbit(L - dep)

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int son[MAXN][2],N,rt = 1,Ncnt = 1;
int64 L,dep[MAXN];
char s[MAXN];
int64 lowbit(int64 x) {
return x & -x;
}
void Insert(char *str) {
int len = strlen(str + 1);
int p = rt;
for(int i = 1 ; i <= len ; ++i) {
if(!son[p][str[i] - '0']) {
son[p][str[i] - '0'] = ++Ncnt;
dep[Ncnt] = dep[p] + 1;
}
p = son[p][str[i] - '0'];
}
}
void Solve() {
read(N);read(L);
for(int i = 1 ; i <= N ; ++i) {
scanf("%s",s + 1);
Insert(s);
}
int64 ans = 0;
for(int i = 1 ; i <= Ncnt ; ++i) {
if((son[i][0] == 0 && son[i][1] != 0) || (son[i][0] != 0 && son[i][1] == 0)) {
ans ^= lowbit(L - dep[i]);
}
}
if(ans) puts("Alice");
else puts("Bob");
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

F - Squirrel Migration

第一个结论就推不出来QAQ

就是考虑一条边,边断掉分成两个子树是\(x,y\),这条边最多被经过\(2min{siz[x],siz[y]}\)

考虑有两个重心(也就是断开一条边可以分成两个大小为\(N / 2\)的子树)

肯定可以构造合法的解,方案数就是\((\frac{N}{2}!)^2\)

有一个重心也是有解的,就是把所有的儿子从大到小排序

把最大的放在第一个,然后把剩下从小到大放,重心到它自己即可

这是一个合法解

那么我们可以知道,满足条件的答案一定是重心随便放,断掉重心后,剩下的点必须不选自己所在的树里的点

我们可以容斥做,用\(f[k]\)选了k个点,且这k个点能到达的点都是自己子树中的点,类似树背包那样转移

答案就是\(\sum_{i = 0}^{N - 1} (-1)^{i}f[i] \cdot (N - i)!\)

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 5005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int N;
struct node {
int to,next;
}E[MAXN * 2];
int head[MAXN],sumE,siz[MAXN],son[MAXN];
int C[MAXN][MAXN],fac[MAXN],val[MAXN],tot,f[MAXN];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void add(int u,int v) {
E[++sumE].next = head[u];
E[sumE].to = v;
head[u] = sumE;
}
void dfs(int u,int fa) {
siz[u] = 1;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa) {
dfs(v,u);
siz[u] += siz[v];
son[u] = max(son[u],siz[v]);
}
}
son[u] = max(son[u],N - siz[u]);
}
void Init() {
read(N);
int x,y;
for(int i = 1 ; i < N ; ++i) {
read(x);read(y);
add(x,y);add(y,x);
}
C[0][0] = 1;
for(int i = 1 ; i <= N ; ++i) {
C[i][0] = 1;
for(int j = 1 ; j <= N ; ++j) {
C[i][j] = inc(C[i - 1][j],C[i - 1][j - 1]);
}
}
fac[0] = 1;
for(int i = 1 ; i <= N ; ++i) fac[i] = mul(fac[i - 1],i);
}
void Solve() {
dfs(1,0);
int g = 1;
for(int i = 2 ; i <= N ; ++i) {
if(son[i] < son[g]) g = i;
}
if(N % 2 == 0 && son[g] == N / 2) {
out(mul(fac[N / 2],fac[N / 2]));enter;return;
}
for(int i = head[g] ; i ; i = E[i].next) {
int v = E[i].to;
if(siz[v] < siz[g]) val[++tot] = siz[v];
}
if(g != 1) val[++tot] = N - siz[g];
int s = 0;f[0] = 1;
for(int i = 1 ; i <= tot ; ++i) {
for(int t = s + val[i] ; t >= 0 ; --t) {
for(int j = 1 ; j <= val[i] ; ++j) {
if(j > t) break;
f[t] = inc(f[t],mul(mul(f[t - j],C[val[i]][j]),mul(C[val[i]][j],fac[j])));
}
}
s += val[i];
}
int t = 1,ans = 0;
for(int i = 0 ; i <= N - 1; ++i) {
ans = inc(ans,mul(mul(t,f[i]),fac[N - i]));
t = mul(t,MOD - 1);
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

【AtCoder】ARC087的更多相关文章

  1. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  2. 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring

    [题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...

  3. 【AtCoder】ARC 081 E - Don't Be a Subsequence

    [题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...

  4. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  5. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  6. 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分

    [题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...

  7. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  8. 【Atcoder】AGC022 C - Remainder Game 搜索

    [题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...

  9. 【Atcoder】AGC 020 B - Ice Rink Game 递推

    [题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...

随机推荐

  1. Jamie's Contact Groups POJ - 2289(多重匹配 最大值最小化 最大流)

    Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 8567   Accepted: ...

  2. Codeforces Round #442 (Div. 2)A,B,C,D,E(STL,dp,贪心,bfs,dfs序+线段树)

    A. Alex and broken contest time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  3. MT【94】由参数前系数凑配系数题1

    评:根据$b,c$前系数凑配系数,也是比较常见的思路.

  4. 【Vijos1404】遭遇战(最短路)

    [Vijos1404]遭遇战(最短路) 题面 Vijos 题解 显然可以树状数组之类的东西维护一下\(dp\).这里考虑一种最短路的做法. 首先对于一个区间\([l,r]\),显然可以连边\((l,r ...

  5. SpringBoot中的定时任务与Quartz的整合

    SpringBoot集成Quartz 定时任务Quartz : 就是在指定的时间执行一次或者循环执行,在项目的开发中有时候会需要的, 还是很有用的. SpringBoot内置的定时 添加依赖 < ...

  6. Kafka+Zookeeper+Filebeat+ELK 搭建日志收集系统

    ELK ELK目前主流的一种日志系统,过多的就不多介绍了 Filebeat收集日志,将收集的日志输出到kafka,避免网络问题丢失信息 kafka接收到日志消息后直接消费到Logstash Logst ...

  7. MVC、MVP和MVVM浅谈

    MVC是最经典的开发模式之一,最早是后台那边来的,后台前端的复杂度也上来了,MVC的开发模式也带进前端了. MVC: MVC有两个很明显的问题: 1.m层和v层直接打交道,导致这两层耦合度高 2.因为 ...

  8. angularJs的各种服务和指令的使用场景

    $location服务,获取页面跳转带的参数 比如说页面是这样的  localhost:9102/admin/goods.html#?id=123   如何获取这个id=123的值呢?????(注意: ...

  9. Apache Oozie Coordinator 作业自定义配置定时任务

    一,介绍 Oozie是Hadoop的工作流系统,如果使用Oozie来提交MapReduce作业(Oozie 不仅仅支持MapReduce作业,还支持其他类型的作业),可以借助Oozie Coordin ...

  10. 使用JavaScript缓存图片

    在JS中,为了让图片缓存起来,客户端JS定义了一个API,首先利用Image()构造函数来创建一个屏幕外图片对象,之后将该对象的src属性设置 期望的URL,由于图片元素并没有添加到文档中,因此它是不 ...