A - Fairness

如果奇数次是b - a

否则是a - b

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
//#define ivorysi
using namespace std;
typedef long long int64;
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);
}
int64 A,B,C,K;
void Solve() {
read(A);read(B);read(C);read(K);
if(K & 1) {out(B - A);enter;}
else {out(A - B);enter;}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

B - Backfront

找数值最长的连续的一段子序列,然后将剩下的数必须要移动了

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
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,a[MAXN],pos[MAXN],dp[MAXN];
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) {
read(a[i]);
pos[a[i]] = i;
}
dp[1] = 1;
for(int i = 2 ; i <= N ; ++i) {
if(pos[i - 1] < pos[i]) dp[i] = dp[i - 1] + 1;
else dp[i] = 1;
}
int res = N;
for(int i = 1 ; i <= N ; ++i) {
res = min(res,N - dp[i]);
}
out(res);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

C - Sequence Growing Easy

数列肯定是一段连续递增的好几段拼起来,都找到加上最大值就可以了

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
//#define ivorysi
#define pb push_back
#define MAXN 200005
#define eps 1e-12
#define space putchar(' ')
#define enter putchar('\n')
#define mp make_pair
#define fi first
#define se second
#define mo 974711
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 - '0' + c;
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) putchar('-'),x = -x;
while(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,a[MAXN];
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) read(a[i]);
a[0] = -1;
for(int i = 1 ; i <= N ; ++i) {
if(a[i - 1] < a[i] - 1) {
puts("-1");
return;
}
}
int64 ans = 0;
for(int i = N ; i >= 1 ; --i) {
if(a[i] == a[i + 1] - 1) continue;
ans += a[i];
}
printf("%lld\n",ans);
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

D - Isomorphism Freak

答案是直径的长度 / 2 + 1

我们对于直径长度为奇数,也就是有偶数个点,如果直径长度增加颜色也要增加,所以我们不增加直径

我们枚举作为直径中心的两个点,我们能达到这个要求仅当距离中心距离相同的点点度相同即可

对于直径长度为偶数,也就是有奇数个点,我们分两种情况,第一种是只有一个中心

第二种是有两个中心,我们枚举两个中心,然后要求这两个中心所在的树的深度最大的不超过中心的一半即可

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define MAXN 105
//#define ivorysi
using namespace std;
typedef long long int64;
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);
}
struct node {
int to,next;
}E[MAXN * 2];
int N,sumE,head[MAXN],A[MAXN],B[MAXN],dep[MAXN],ch[MAXN],x[MAXN];
void add(int u,int v) {
E[++sumE].to = v;E[sumE].next = head[u];head[u] = sumE;
}
int Calc(int u,int fa) {
int res = dep[u];
ch[u] = 0;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(v != fa) {
ch[u]++;
dep[v] = dep[u] + 1;
res = max(res,Calc(v,u));
}
}
return res;
}
void Solve() {
read(N);
if(N == 1) {
puts("1 2");return;
}
for(int i = 1 ; i < N ; ++i) {
read(A[i]);read(B[i]);
add(A[i],B[i]);add(B[i],A[i]);
}
int D = 0;
for(int i = 1 ; i < N ; ++i) {
dep[A[i]] = dep[B[i]] = 0;
D = max(D,Calc(A[i],B[i]) + Calc(B[i],A[i]) + 1);
}
out(D / 2 + 1);space;
if(D & 1) {
int64 ans = 9e18;
for(int i = 1 ; i < N ; ++i) {
dep[A[i]] = dep[B[i]] = 0;
int64 tmp = 2;
if(Calc(A[i],B[i]) == D / 2 && Calc(B[i],A[i]) == D / 2) {
memset(x,0,sizeof(x));
for(int j = 1 ; j <= N ; ++j) x[dep[j]] = max(x[dep[j]],ch[j]);
for(int k = 0 ; k < D / 2 ; ++k) tmp = tmp * x[k];
ans = min(ans,tmp);
} }
out(ans);enter;
}
else {
int64 ans = 9e18;
for(int i = 1 ; i < N ; ++i) {
dep[A[i]] = dep[B[i]] = 0;
int64 tmp = 1;
int x0 = Calc(A[i],B[i]),x1 = Calc(B[i],A[i]);
if(x0 > x1) {swap(x0,x1),swap(A[i],B[i]);}
if(x0 == D / 2 - 1 && x1 == D / 2) {
dep[B[i]] = 0;
Calc(B[i],0);
memset(x,0,sizeof(x));
for(int j = 1 ; j <= N ; ++j) x[dep[j]] = max(x[dep[j]],ch[j]);
for(int k = 0 ; k < D / 2 ; ++k) tmp = tmp * x[k];
ans = min(ans,tmp);
} } for(int i = 1 ; i < N ; ++i) {
dep[A[i]] = dep[B[i]] = 0;
int x0 = Calc(A[i],B[i]),x1 = Calc(B[i],A[i]);
if(max(x0,x1) <= D / 2) {
memset(x,0,sizeof(x));
int64 tmp = 2;
for(int j = 1 ; j <= N ; ++j) x[dep[j]] = max(x[dep[j]],ch[j]);
for(int k = 0 ; k <= D ; ++k) {
if(x[k]) tmp *= x[k];
}
ans = min(ans,tmp);
}
} out(ans);enter;
} }
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

E - Sequence Growing Hard

Let's restate the problem = =

我们就相当于先有一个一个标号为0,值为0的点

然后每次新加一个标号为k的点在p点上,我们要新加的k点严格大于p点的值

这个可以用dp来完成

dp[u][x]表示用u个点,根节点值为x的方案数,标号就是0 - u - 1

答案就是dp[N + 1][0]

转移就是

\(dp[n] = \sum_{y > x} dp[n - k][x] * dp[k][y] \binom{n - 2}{k - 1}\)

我们每次把y当做1号点,x当做0号点可以不重不漏

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
//#define ivorysi
using namespace std;
typedef long long int64;
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,K,MOD;
int dp[305][305],sum[305][305],C[305][305];
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 update(int &x,int y) {
x = inc(x,y);
}
void Solve() {
read(N);read(K);read(MOD);
C[0][0] = 1;
for(int i = 1 ; i <= N ; ++i) {
C[i][0] = 1;
for(int j = 1 ; j <= i ; ++j) {
C[i][j] = inc(C[i - 1][j - 1],C[i - 1][j]);
}
}
for(int j = 0 ; j <= K ; ++j) {sum[1][j] = (j + 1) % MOD;dp[1][j] = 1;}
for(int i = 2 ; i <= N + 1; ++i) {
for(int j = 1 ; j < i ; ++j) {
for(int k = 0 ; k <= K ; ++k) {
update(dp[i][k],mul(mul(dp[j][k],inc(sum[i - j][K],MOD - sum[i - j][k])),C[i - 2][i - j - 1]));
}
}
sum[i][0] = dp[i][0];
for(int k = 1 ; k <= K ; ++k) sum[i][k] = inc(sum[i][k - 1],dp[i][k]);
}
out(dp[N + 1][0]);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

F - Simple Subsequence Problem

我们只要构造出一张图

例如110[00011001]

这个点可以转移到

1100[0011001]和1101[1001]和110[]

我们若s在集合中[s] = 1

每个点t的值是t[]

如果t是s的子序列,转移的路径是唯一的,所以只要用dp求路径条数即可

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define space putchar(' ')
#define enter putchar('\n')
#define mp make_pair
#define pb push_back
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
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){putchar('-');x = -x;}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
} int N,K,cnt;
char s[25][(1 << 20) + 5];
vector<int> v[25];
int dp[42000005];
int p0[25],p1[25];
void Solve() {
read(N);read(K);
for(int i = 0 ; i <= N ; ++i) scanf("%s",s[i]);
for(int i = 1 ; i <= N ; ++i) {
v[i].resize((i + 1) * (1 << i));
int s = v[i].size();
for(int j = 0 ; j < s ; ++j) v[i][j] = ++cnt;
}
for(int i = 1 ; i <= N ; ++i) {
for(int j = 0 ; j < (1 << i) ; ++j) {
if(s[i][j] == '1') {
dp[v[i][j * (i + 1) + i]]++;
}
}
}
for(int i = N ; i >= 1 ; --i) {
for(int S = 0 ; S < (1 << i) ; ++S) {
p0[0] = -1,p1[0] = -1;
for(int j = 0 ; j <= i ; ++j) {
p1[j + 1] = p1[j];p0[j + 1] = p0[j];
if(S >> j & 1) p1[j + 1] = j;
else p0[j + 1] = j;
}
for(int j = i ; j >= 0 ; --j) {
int u = v[i][S * (i + 1) + j];
int b = S & ((1 << j) - 1),f = S >> j;
if(dp[u]) {
if(p0[j] != -1) {
int p = ((f << 1) << p0[j]) + (S & (1 << p0[j]) - 1);
int l = p0[j] + 1 + i - j;
dp[v[l][p * (l + 1) + p0[j]]] += dp[u];
}
if(p1[j] != -1) {
int p = ((f << 1 | 1) << p1[j]) + (S & (1 << p1[j]) - 1);
int l = p1[j] + 1 + i - j;
dp[v[l][p * (l + 1) + p1[j]]] += dp[u];
}
if(j != 0 && j != i) {
int l = i - j;
dp[v[l][f * (l + 1)]] += dp[u];
}
}
}
}
}
for(int i = N ; i >= 1 ; --i) {
for(int j = 0 ; j < (1 << i) ; ++j) {
if(dp[v[i][j * (i + 1)]] >= K) {
for(int k = i - 1; k >= 0 ; --k) {
putchar('0' + ((j >> k) & 1));
}
enter;
return;
}
}
}
puts("");
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【AtCoder】AGC024的更多相关文章

  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. 【bzoj3576】 Hnoi2014—江南乐

    http://www.lydsy.com/JudgeOnline/problem.php?id=3576 (题目链接) 题意 给出一个数$F$,然后$n$堆石子,每次操作可以把一堆不少于$F$的石子分 ...

  2. Appium+python自动化环境搭建(小白适用)

    写在前面: 没开始搭建前听好多人说,学习appium80%的人都死于环境搭建,所以一开始很紧张,在搭建环境中也确实遇到了好几个问题,由于之前本人使用app测试经验很少,所以相当于app小白,因此有的问 ...

  3. ByteBuffer的allocate与allocateDirect2013-01-11

    在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式:   public sta ...

  4. Eclipse Neon 汉化

    官网下载的Eclipse是英文版的,对于初学者来说为了减小学习的难度,将英文版汉化是有必要的. 第一步:依次点击Eclipse菜单栏上的“Help"-->”About",查看 ...

  5. INF文件详解

    安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件,一般以INF作为扩展名,因此也叫INF文件.安装信息INF文件与Windows内建的安装服务引擎(AP ...

  6. CCNA学习与实验指南——第3章 以太网

    以太网就是局域网,IEEE制定了802.2和802.3两种标准.802.2规定了OSI模型的数据链路层的上半部分(LLC子层),802.3规定了OSI模型的数据链路层的下半部分和物理层(MAC子层). ...

  7. freemark+ITextRenderer 生成PDF,设置pdf的页面大小

    在html中添加样式,仅生成pdf是生效,浏览器展示时是不会生效的: <style> @page{ size : 200mm  300 mm;   } </style>

  8. Spark记录-Scala模式匹配

    Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...

  9. Brief History of Machine Learning

    Brief History of Machine Learning My subjective ML timeline Since the initial standpoint of science, ...

  10. Java Message Service学习(一)

    一,背景 近期需要用到ActiveMQ接收Oozie执行作业之后的返回结果.Oozie作为消息的生产者,将消息发送给ActiveMQ,然后Client可以异步去ActiveMQ取消息. ActiveM ...