171 F - Strivore

直接把初始字符当成隔板,统计的方案数会有重复

为了避免重复情况,规定隔板字母尽可能最后出现,即在隔板字母后面不能插入含隔板字母的字符串

所以在隔板字母后插入的字符只有25种选择,而在最前面的位置插入字符有26种选择

枚举在最前面位置插入的字符个数,这些字符有26中选法,剩下的字符插入到隔板字母的后面,有25种选法

剩余字符的插入位置利用隔板法转化为在剩余字符中选择\(m - 1\)块板(第一块板已固定)


const int P = 1e9 + 7;
const int N = 2e6 + 10; int n, m;
char s[N];
int fact[N], infact[N]; int pow_mod(int a, int b, int p)
{
int res = 1;
while(b)
{
if(b & 1) res = (LL)res * a % p;
a = (LL)a * a % p;
b >>= 1;
}
return res;
} void init()
{
fact[0] = infact[0] = 1;
for(int i = 1; i < N; ++ i)
{
fact[i] = (LL)fact[i - 1] * i % P;
infact[i] = (LL)infact[i - 1] * pow_mod(i, P - 2, P) % P;
}
} int C(int a, int b)
{
return (LL)fact[a] * infact[b] % P * infact[a - b] % P;
} int main()
{
init();
scanf("%d%s", &n, s); m = strlen(s);
int res = 0;
for(int i = 0; i <= n; ++ i)
{
int tmp = (LL)pow_mod(25, n - i, P) * C(n + m - i - 1, m - 1) % P;
tmp = (LL)tmp * pow_mod(26, i, P) % P;
res = (res + tmp) % P;
}
printf("%d\n", res);
return 0;
}

172 F - Unfair Nim

令\(A = a_1 - x\), \(B = a_2 + x\)

\(A\) ^ \(B\) ^ \(a_3\) ^ \(...\) ^ \(a_n = 0\)

令\(y = a_3\) ^ \(...\) ^ \(a_n\), \(x = a_1 + a_2 = A + B\)

\(A + B = 2 * (A \;\&\; B) + A\) ^ \(B\)

故满足下列式子:\(A \;\&\; B = \dfrac{x - y}{2}\), 且\(A\) ^ \(B = y\)

如果\(x < y\)或者\(2\)不能整除\(x - y\),不合法,输出\(-1\)

找到在\([1,a_1]\)内满足上式的最大的\(A\)

考虑\(A\)的每一位,\(A \;\&\; B\)的位必须为\(1\)

\(XOR = 1, AND = 1\), 不合法,输出\(-1\)

\(XOR = 1, AND = 0\), 如果\(A\)当前位为\(1\)不超过\(a_1\),则此位置\(1\),否则为\(0\)

\(XOR = 0, AND = 1\), \(A\)当前位为\(1\)

\(XOR = 0, AND = 0\), \(A\)当前位为\(0\)


const int N = 300 + 10;
typedef long long LL; int n;
LL a[N]; int main()
{
IOS;
cin >> n;
LL x, y = 0;
for(int i = 1; i <= n; ++ i) cin >> a[i];
for(int i = 3; i <= n; ++ i) y ^= a[i];
x = a[1] + a[2];
if((x - y) < 0 || (x - y) % 2) { puts("-1"); return 0; }
LL XOR = y, AND = (x - y) / 2;
LL A = AND;
for(int i = 60; i >= 0; -- i)
{
int Ai, Xi;
Ai = (AND >> i) & 1;
Xi = (XOR >> i) & 1;
if(Ai == 1 && Xi == 1) { puts("-1"); return 0; }
if(Ai == 0 && Xi == 1)
if(A + (1LL << i) <= a[1]) A += (1LL << i);
} if(A >= 1 && A <= a[1]) cout << a[1] - A << endl;
else puts("-1"); return 0;
}

173 F - Intervals on Tree

森林中子树的数量 = 点的数量 - 边的数量

考虑所有集合中点的数量总和为\(n * 1 + (n - 1) * 2 + (n - 2) * 3 \; + \; ... \; + \; 1 * n\)

考虑每条边\((a,b)\)的贡献(即出现次数)为:\(a * (n - b + 1)\)


int n;
int main()
{
scanf("%d", &n);
LL res = 0;
for(int i = n; i >= 1; -- i)
res += (LL)i * (n + 1 - i);
for(int i = 1; i < n; ++ i)
{
int a, b;
scanf("%d%d", &a, &b);
if(a > b) swap(a, b);
res -= (LL)a * (n - b + 1);
}
printf("%lld\n", res);
return 0;
}

174 F - Range Set Query

离线查询\([l,r]\)中不同数字的个数

对于当前区间来说,每种数字仅保留最后一个位置(置为1),其他的置为0,答案即为\([l,r]\)的权值和.

故先把所有查询读入,按照右端点排序,保证查询区间的右端点依次出现.

修改为\(0\)和查询权值和的操作用树状数组优化.


const int N = 5e5 + 20; struct Query
{
int l, r, id;
}q[N]; int n, m, tr[N], a[N], ans[N];
int pos[N]; bool cmp(Query a, Query b) { return a.r < b.r; }
int lowbit(int x) { return x & -x; } int sum(int x) { int res = 0; for(int i = x; i; i -= lowbit(i)) res += tr[i]; return res; } void add(int x, int v) { for(int i = x; i <= n; i += lowbit(i)) tr[i] += v; } int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i) scanf("%d", &a[i]);
for(int i = 1; i <= n; ++ i) add(i, 1);
for(int i = 1; i <= m; ++ i)
{
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q + 1, q + m + 1, cmp);
int last = 1;
for(int i = 1; i <= m; ++ i)
{
for(int j = last; j <= q[i].r; ++ j)
{
if(pos[a[j]]) add(pos[a[j]], -1);
pos[a[j]] = j;
}
ans[q[i].id] = sum(q[i].r) - sum(q[i].l - 1);
last = q[i].r + 1;
}
for(int i = 1; i <= m; ++ i)
printf("%d\n", ans[i]);
return 0;
}

175 F - Making Palindrome

每个字符串可以看做是一个初始状态,状态由字符串和放置位置(置于左侧或右侧)组成,初始串既可以放在左侧,也可以放在右侧.

对于每一次合并,可以将回文的部分删去,剩余部分则是一个串的前缀或后缀, 故可以把所有字符串的前后缀处理成每个状态.

每一次合并的花费为选择串的价值,即从一个状态连接选择串转移到另一个状态,也就是从当前状态到另一个状态连一条权值为选择串价值的边.

每一个初始串都是一个起点,每一个回文串都是一个终点.

构建一个超级源点,向每个初始串连权值为\(c_i\)的边,构建一个超级汇点,每个回文串向超级汇点连一条权值为\(0\)的边,跑最短路即可.


const int N = 100 + 2;
const int M = 1e5 + 20;
const LL INF = 1e18; string s[N];
int c[N];
int n, cnt; map<pair<string, int>, int> Sub; bool check(string str)
{
if((int)str.size() <= 1) return 1;
int len = str.size() - 1;
for(int i = 0; i <= len / 2; ++ i)
if(str[i] != str[len - i]) return 0;
return 1;
} int conn(string a, string b, string &c)
{
int i = 0, j = b.size() - 1;
while(i < (int)a.size() && j >= 0)
if(a[i ++ ] != b[j -- ]) return -1;
if(i >= (int)a.size() && j < 0) { c = ""; return 0; }
else if(j >= 0) { c = b.substr(0, j + 1); return 1; }
else if(i < (int)a.size()) { c = a.substr(i); return 0; }
} struct Edge
{
int to, nxt, w;
}line[M * 2];
LL dis[M];
int fist[M], idx;
bool st[M];
struct zt
{
int x; LL d;
};
bool operator < (zt a, zt b) { return a.d > b.d; } void add(int x, int y, int z)
{
line[idx] = (Edge){y, fist[x], z};
fist[x] = idx ++;
} void heap_dijkstra()
{
priority_queue<zt> q;
for(int i = 1; i <= cnt + 1; ++ i) dis[i] = INF;
q.push((zt){0, 0});
while(!q.empty())
{
zt u = q.top(); q.pop();
if(st[u.x]) continue;
st[u.x] = 1;
for(int i = fist[u.x]; i != -1; i = line[i].nxt)
{
int v = line[i].to;
if(dis[v] > dis[u.x] + line[i].w)
{
dis[v] = dis[u.x] + line[i].w;
q.push((zt){v, dis[v]});
}
}
}
} int main()
{
IOS;
memset(fist, -1, sizeof fist);
cin >> n;
for(int i = 1; i <= n; ++ i)
{
cin >> s[i] >> c[i];
for(int j = s[i].size() - 1; j >= 0; -- j)
Sub[make_pair(s[i].substr(j), 0)] = ++ cnt;
for(int j = 1; j <= (int)s[i].size(); ++ j)
Sub[make_pair(s[i].substr(0, j), 1)] = ++ cnt;
}
Sub[make_pair("", 0)] = ++ cnt;
Sub[make_pair("", 1)] = ++ cnt;
for(int i = 1; i <= n; ++ i)
{
add(0, Sub[make_pair(s[i], 0)], c[i]);
add(0, Sub[make_pair(s[i], 1)], c[i]);
}
for(auto x: Sub)
if(check(x.first.first))
add(x.second, cnt + 1, 0);
for(auto x: Sub)
for(int i = 1; i <= n; ++ i)
{
int res; string v;
if(x.first.second == 0)
res = conn(x.first.first, s[i], v);
else res = conn(s[i], x.first.first, v);
if(res != -1) add(x.second, Sub[make_pair(v, res)], c[i]);
}
heap_dijkstra();
if(dis[cnt + 1] >= INF) cout << "-1" << endl;
else cout << dis[cnt + 1] << endl;
return 0;
}

2021.1.28

AtCoder Beginner Contest 171-175 F的更多相关文章

  1. AtCoder Beginner Contest 238 A - F 题解

    AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...

  2. AtCoder Beginner Contest 171

    比赛链接:https://atcoder.jp/contests/abc171/tasks A - αlphabet 题意 给出一个字母,如果为大写输出 'A',如果为小写输出 'a' . 代码 #i ...

  3. AtCoder Beginner Contest 131 Task F. Must Be Rectangular

    Score: 600 points Approach 固定横坐标 $x$,考虑横坐标为 $x$ 的竖直线上最多可以有几个点. Observations 若最初两条竖直线 $x_1$.$x_2$ 上都有 ...

  4. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  5. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  6. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  7. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  8. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  9. AtCoder Beginner Contest 161

    比赛链接:https://atcoder.jp/contests/abc161/tasks AtCoder Beginner Contest 161 第一次打AtCoder的比赛,因为是日本的网站终于 ...

  10. 题解 AtCoder Beginner Contest 168

    小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...

随机推荐

  1. 动态主席树【带修改】&& 例题 Dynamic Rankings ZOJ - 2112

    参考链接:https://blog.csdn.net/WilliamSun0122/article/details/77885781 一.动态主席树介绍 动态主席树与静态主席树的不同在于:静态主席树不 ...

  2. 详解Go语言I/O多路复用netpoller模型

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码15.7 可以从 Go 源码目录结构和对应代码文件了解 Go 在不同 ...

  3. Python——Django框架——邮件

    #引用EMAIL服务 EMAIL_BACKEND = 'django.cpre.mail.backends.smtp.EmailBackend' #EMAIL发送服务器 EMAIL_HOST = 's ...

  4. 1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】

    题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比 ...

  5. u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植

    网卡芯片的工作原理 DM9000AE具有以下主要性能: ①48管脚的LQFP封装,管脚少体积小: ②支持8/16位数据总线: ③适用于10Base-T和100Base-T,10/100M自适应,适应不 ...

  6. SQL优化这么做就对了

    目录 前言 SQL优化一般步骤 1.通过慢查日志等定位那些执行效率较低的SQL语句 2.explain 分析SQL的执行计划 3.show profile 分析 4.trace 5.确定问题并采用相应 ...

  7. QUIC协议和HTTP3.0技术研究

    QUIC:基于UDP的安全可靠的HTTP/2传输协议 摘要 QUIC(Quick UDP Internet Connection)是一个新的基于UDP的管线化技术和安全传输协议. QUIC提供: 和H ...

  8. Windows中VS code无法查看C++ STL容器的值 - 解决方法

    Windows中VS code debug时无法查看C++ STL容器内容 首先,你很可能用的是x64版本的Windows. 我发现一个有效的解决方法,但在x64版本的Windows上安装MinGW时 ...

  9. Swift All in One

    Swift All in One Swift 5.3 https://github.com/apple/swift-evolution Xcode https://developer.apple.co ...

  10. website captcha

    website captcha 验证码 hCaptcha hCaptcha通过询问对人类来说很容易且对机器来说很困难的简单问题,可以帮助您喜欢的Web服务阻止机器人,垃圾邮件和滥用行为. https: ...