【AtCoder】ARC087
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的更多相关文章
- 【AtCoder】ARC092 D - Two Sequences
[题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...
- 【Atcoder】CODE FESTIVAL 2017 qual A D - Four Coloring
[题意]给定h,w,d,要求构造矩阵h*w满足任意两个曼哈顿距离为d的点都不同色,染四色. [算法]结论+矩阵变换 [题解] 曼哈顿距离是一个立着的正方形,不方便处理.d=|xi-xj|+|yi-yj ...
- 【AtCoder】ARC 081 E - Don't Be a Subsequence
[题意]给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串. http://arc081.contest.atcoder.jp/tasks/arc081_c [算法]字 ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT
[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...
- 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分
[题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...
- 【AtCoder】ARC095 E - Symmetric Grid 模拟
[题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...
- 【Atcoder】AGC022 C - Remainder Game 搜索
[题目]C - Remainder Game [题意]给定n个数字的序列A,每次可以选择一个数字k并选择一些数字对k取模,花费2^k的代价.要求最终变成序列B,求最小代价或无解.n<=50,0& ...
- 【Atcoder】AGC 020 B - Ice Rink Game 递推
[题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...
随机推荐
- Jamie's Contact Groups POJ - 2289(多重匹配 最大值最小化 最大流)
Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 8567 Accepted: ...
- 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 ...
- MT【94】由参数前系数凑配系数题1
评:根据$b,c$前系数凑配系数,也是比较常见的思路.
- 【Vijos1404】遭遇战(最短路)
[Vijos1404]遭遇战(最短路) 题面 Vijos 题解 显然可以树状数组之类的东西维护一下\(dp\).这里考虑一种最短路的做法. 首先对于一个区间\([l,r]\),显然可以连边\((l,r ...
- SpringBoot中的定时任务与Quartz的整合
SpringBoot集成Quartz 定时任务Quartz : 就是在指定的时间执行一次或者循环执行,在项目的开发中有时候会需要的, 还是很有用的. SpringBoot内置的定时 添加依赖 < ...
- Kafka+Zookeeper+Filebeat+ELK 搭建日志收集系统
ELK ELK目前主流的一种日志系统,过多的就不多介绍了 Filebeat收集日志,将收集的日志输出到kafka,避免网络问题丢失信息 kafka接收到日志消息后直接消费到Logstash Logst ...
- MVC、MVP和MVVM浅谈
MVC是最经典的开发模式之一,最早是后台那边来的,后台前端的复杂度也上来了,MVC的开发模式也带进前端了. MVC: MVC有两个很明显的问题: 1.m层和v层直接打交道,导致这两层耦合度高 2.因为 ...
- angularJs的各种服务和指令的使用场景
$location服务,获取页面跳转带的参数 比如说页面是这样的 localhost:9102/admin/goods.html#?id=123 如何获取这个id=123的值呢?????(注意: ...
- Apache Oozie Coordinator 作业自定义配置定时任务
一,介绍 Oozie是Hadoop的工作流系统,如果使用Oozie来提交MapReduce作业(Oozie 不仅仅支持MapReduce作业,还支持其他类型的作业),可以借助Oozie Coordin ...
- 使用JavaScript缓存图片
在JS中,为了让图片缓存起来,客户端JS定义了一个API,首先利用Image()构造函数来创建一个屏幕外图片对象,之后将该对象的src属性设置 期望的URL,由于图片元素并没有添加到文档中,因此它是不 ...