A. Alternating Sum

就是个等比数列,特判公比为 $1$ 的情况即可。

#include <bits/stdc++.h>
using namespace std; const int MOD = 1e9 + ;
const int N = 1e5 + ; int qp(int a, int b = MOD - ) {
int ans = ;
while (b) {
if (b & ) ans = 1LL * ans * a % MOD;
a = 1LL * a * a % MOD;
b >>= ;
}
return ans;
} int M(int a) {
if (a < ) a += MOD;
if (a >= MOD) a -= MOD;
return a;
} char s[N]; int main() {
int n, a, b, k;
scanf("%d%d%d%d", &n, &a, &b, &k);
int q = 1LL * qp(qp(a, k)) * qp(b, k) % MOD;
scanf("%s", s);
int a1 = ;
for (int i = ; i < k; i++) {
int x = ((s[i] == '+') ? : -);
a1 = M(a1 + 1LL * x * qp(a, n - i) % MOD * qp(b, i) % MOD);
}
if (q == ) {
int ans = 1LL * a1 * (n + ) / k % MOD;
printf("%d\n", ans);
return ;
}
int inv = qp(q - );
int ans = 1LL * a1 * (qp(q, (n + ) / k) - ) % MOD * inv % MOD;
printf("%d\n", ans);
return ;
}

B. Destruction of a Tree

优先删除靠近叶子节点的偶数度数的节点,因为假如删了这个节点的父节点,就剩下两个点一条边了。
那这样肯定是不能删完的。
就搞出dfs序,倒着删,如果有偶数度数的就往下删,不往父节点方向走即可。

#include <bits/stdc++.h>
using namespace std; const int N = 2e5 + ;
vector<int> G[N];
int degree[N], fa[N], dfn[N], tol;
bool vis[N];
int ans[N], cnt; void dfs(int u, int pre) {
fa[u] = pre;
dfn[++tol] = u;
for (auto v: G[u])
if (v != pre)
dfs(v, u);
} void dfs2(int u) {
vis[u] = ;
ans[++cnt] = u;
for (auto v: G[u]) {
degree[v]--;
if (v == fa[u] || vis[v]) continue;
if (degree[v] % == ) dfs2(v);
}
} int main() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
int x;
scanf("%d", &x);
if (!x) continue;
degree[i]++;
degree[x]++;
G[i].push_back(x);
G[x].push_back(i);
}
dfs(, );
for (int i = tol; i >= ; i--) {
if (degree[dfn[i]] % == )
dfs2(dfn[i]);
}
if (cnt == n) {
puts("YES");
for (int i = ; i <= n; i++)
printf("%d\n", ans[i]);
} else {
puts("NO");
}
return ;
}

C. Cutting Rectangle

画图发现,对于不一样长度的矩形,它所具有的宽度集合必须一样,并且对应的 $c$ 个数必须成比例。
排个序排除一下这两种情况。
具体排列方式就与比例的约数有关了,比如对于长为 $3$ 的矩形,它具有的宽度集合为 $2$,$3$,$4$,个数分别为 $2$,$4$,$6$
那么基底就为 $1$ $2$ $3$,把它们拼在一起,就有两个这样的大矩形,那么排列方式就是两种,横着拼一起或者竖着拼一起。
也就是 gcd 的约数个数,但这只是一组的排列方式,因为要满足和其它组能拼成最后的大矩形,那么就是所有数的 gcd 的约数个数了。

#include <bits/stdc++.h>
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define se second
using namespace std; const int N = 2e5 + ; struct P {
ll w, h, c;
void read() {
scanf("%lld%lld%lld", &w, &h, &c);
}
bool operator < (const P &rhs) const {
return w < rhs.w || (w == rhs.w && h < rhs.h);
}
} p[N]; vector<pii> vec[N];
ll base[N]; template<class T>
T gcd(T a, T b) {
while (b) {
a %= b;
swap(a, b);
}
return a;
} int main() {
//freopen("in.txt", "r", stdin);
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++)
p[i].read();
sort(p + , p + + n);
int cnt = ;
for (int i = ; i <= n; i++) {
if (p[i].w != p[i - ].w) cnt++;
vec[cnt].push_back(pii(p[i].h, p[i].c));
}
ll g = ;
for (auto p: vec[])
g = gcd(g, p.se);
for (int i = ; i < vec[].size(); i++)
base[i] = vec[][i].se / g;
bool flag = ;
for (int i = ; i <=cnt && !flag; i++) {
if (vec[i].size() != vec[i - ].size()) {
flag = ;
break;
}
for (int j = ; j < vec[i].size(); j++) {
if (vec[i][j].fi != vec[i - ][j].fi) {
flag = ;
break;
}
}
if (flag) break;
if (vec[i][].se % base[]) {
flag = ;
break;
}
ll temp = vec[i][].se / base[];
for (int j = ; j < vec[i].size(); j++) {
if (vec[i][j].se / base[j] != temp) {
flag = ;
break;
}
}
}
if (flag) {
puts("");
return ;
}
g = ;
for (int i = ; i <= cnt; i++) {
g = gcd(g, vec[i][].se / base[]);
}
ll ans = ;
for (ll i = ; i * i <= g; i++) {
if (g % i) continue;
ans++;
if (g / i != i) ans++;
}
printf("%lld\n", ans);
return ;
}

D. Frequency of String

AC自动机直接做。或者哈希。
对长度相同的串同时查询,长度不同的串不超过 $\sqrt n$ 种。这样查询的复杂度是 $O(n \sqrt n)$ 的。

#include <bits/stdc++.h>
using namespace std; const int N = 1e5 + ;
const int sz = ; vector<int> vec[N]; struct Aho {
int trie[N][sz], tol, fail[N], pos[N], last[N];
void init() {
tol = ;
newnode();
}
int newnode() {
for (int i = ; i < sz; i++) trie[tol][i] = ;
fail[tol] = pos[tol] = ;
return tol++;
}
void ins(char *s, int index) {
int len = strlen(s);
int u = ;
for (int i = ; i < len; i++) {
int id = s[i] - 'a';
if (!trie[u][id]) trie[u][id] = newnode();
u = trie[u][id];
}
pos[u] = index;
}
void build() {
queue<int> que;
for (int i = ; i < sz; i++)
if (trie[][i]) que.push(trie[][i]);
while (!que.empty()) {
int u = que.front(); que.pop();
for (int i = ; i < sz; i++) {
int &v = trie[u][i];
if (v) {
fail[v] = trie[fail[u]][i];
que.push(v);
last[v] = pos[fail[v]] ? fail[v] : last[fail[v]];
} else {
v = trie[fail[u]][i];
}
}
}
}
void search(char *s) {
int u = ;
for (int i = ; s[i]; i++) {
int id = s[i] - 'a';
int temp = trie[u][id];
u = temp;
while (temp) {
if (pos[temp]) vec[pos[temp]].push_back(i);
temp = last[temp];
}
}
}
} ac; char s[N], t[N];
int k[N], len[N]; int main() {
// freopen("in.txt", "r", stdin);
int n;
scanf("%s%d", s, &n);
ac.init();
for (int i = ; i <= n; i++) {
scanf("%d", k + i);
scanf("%s", t);
ac.ins(t, i);
len[i] = strlen(t);
}
ac.build();
ac.search(s);
for (int i = ; i <= n; i++) {
if (vec[i].size() < k[i]) {
puts("-1");
continue;
}
int ans = 1e9;
for (int l = , r = k[i] - ; r < vec[i].size(); l++, r++) {
ans = min(ans, vec[i][r] + len[i] - - vec[i][l] + );
}
printf("%d\n", ans);
}
return ;
}
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std; const int N = 1e5 + ;
const ull BASE = ;
ull bit[N], Hash[N];
unordered_map<ull, int> id[N];
int vec[N], cnt;
vector<int> pos[N]; ull get(int l, int r) {
return Hash[r] - Hash[l - ] * bit[r - l + ];
} char s[N], t[N];
int k[N], l[N]; int main() {
scanf("%s", s + );
int len = strlen(s + );
for (int i = bit[] = ; i <= len; i++)
bit[i] = bit[i - ] * BASE, Hash[i] = Hash[i - ] * BASE + s[i];
int q;
scanf("%d", &q);
for (int i = ; i <= q; i++) {
scanf("%d%s", k + i, t + );
l[i] = strlen(t + );
ull temp = ;
for (int j = ; j <= l[i]; j++)
temp = temp * BASE + t[j];
id[l[i]][temp] = i;
vec[++cnt] = l[i];
}
sort(vec + , vec + + cnt);
cnt = unique(vec + , vec + + cnt) - vec - ;
for (int i = ; i <= cnt; i++) {
int n = vec[i];
for (int ll = , rr = n; rr <= len; ll++, rr++) {
ull temp = get(ll, rr);
if (id[n].count(temp))
pos[id[n][temp]].push_back(ll);
}
}
for (int i = ; i <= q; i++) {
int ans = 1e9;
for (int ll = , rr = k[i] - ; rr < pos[i].size(); ll++, rr++)
ans = min(ans, pos[i][rr] + l[i] - - pos[i][ll] + );
printf("%d\n", (ans == 1e9) ? - : ans);
}
return ;
}

E. Circles of Waiting

有转移方程 $$ f(x, y) = p_1 * f(x - 1, y) + p_2 * f(x, y - 1) + p_3 * f(x + 1, y) + p_4 * f(x, y + 1) + 1$$
有 $R ^ 2$ 个未知数,直接高斯消元解复杂度为 $O(R ^ 6)$
因为跟自己有关的项达不到 $R^2$ 的级别。所以只要对相邻这些消元即可。

#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
using namespace std; const int N = ;
const int M = ;
const int MOD = 1e9 + ;
int n, p[], ans[M], a[M][M];
const int dx[] = {-, , , }, dy[] = {, -, , };
vector<pii> all; int qp(int a, int b = MOD - ) {
int ans = ;
while (b) {
if (b & ) ans = 1LL * ans * a % MOD;
a = 1LL * a * a % MOD;
b >>= ;
}
return ans;
} int main() {
int R;
scanf("%d", &R);
int sum = ;
for (int i = ; i < ; i++)
scanf("%d", p + i), sum += p[i];
sum = qp(sum);
for (int i = ; i < ; i++)
p[i] = 1LL * p[i] * sum % MOD;
for (int i = -R; i <= R; i++)
for (int j = -R; j <= R; j++)
if (i * i + j * j <= R * R)
all.push_back(pii(i, j));
n = all.size();
for (int i = ; i < n; i++) {
int x = all[i].fi, y = all[i].se;
a[i][i] = a[i][n] = ;
for (int j = ; j < ; j++) {
int u = x + dx[j], v = y + dy[j];
if (u * u + v * v <= R * R)
a[i][lower_bound(all.begin(), all.end(), pii(u, v)) - all.begin()] = MOD - p[j];
}
}
for (int i = ; i < n; i++) {
vector<int> t = {n};
int u = min(i + R * + , n);
for (int j = i; j < u; j++) {
if (a[i][j]) {
t.push_back(j);
}
}
int inv = qp(a[i][i]);
for (int j = i + ; j < u; j++) {
if (a[j][i]) {
int mul = 1LL * a[j][i] * inv % MOD;
for (auto k: t) {
a[j][k] = (a[j][k] - 1LL * mul * a[i][k] % MOD + MOD) % MOD;
}
}
}
}
for (int i = n - ; ~i; i--) {
int val = a[i][n];
for (int j = i + ; j < n; j++) {
val = (val - 1LL * ans[j] * a[i][j] % MOD + MOD) % MOD;
}
ans[i] = 1LL * val * qp(a[i][i]) % MOD;
}
printf("%d\n", ans[lower_bound(all.begin(), all.end(), pii(, )) - all.begin()]);
return ;
}

Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)的更多相关文章

  1. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1) 963B 964D B Destruction of a Tree

    题 OvO http://codeforces.com/contest/963/problem/B CF 963B 964D 解 对于题目要求,显然一开始的树,要求度数为偶数的节点个数为奇数个,通过奇 ...

  2. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)D. Frequency of String

    题意:有一个串s,n个串模式串t,问s的子串中长度最小的包含t k次的长度是多少 题解:把所有t建ac自动机,把s在ac自动机上匹配.保存每个模式串在s中出现的位置.这里由于t两两不同最多只有xsqr ...

  3. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)

    A. Splits time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  4. CodeForces 837D - Round Subset | Educational Codeforces Round 26

    /* CodeForces 837D - Round Subset [ DP ] | Educational Codeforces Round 26 题意: 选k个数相乘让末尾0最多 分析: 第i个数 ...

  5. Codeforces 932 A.Palindromic Supersequence (ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined))

    占坑,明天写,想把D补出来一起写.2/20/2018 11:17:00 PM ----------------------------------------------------------我是分 ...

  6. ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) A

    2018-02-19 A. Palindromic Supersequence time limit per test 2 seconds memory limit per test 256 mega ...

  7. Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)

    思路:把边看成点,然后每条边只能从下面的边转移过来,我们将边按照u为第一关键字,w为第二关键字排序,这样就能用线段树维护啦. #include<bits/stdc++.h> #define ...

  8. ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined)

    靠这把上了蓝 A. Palindromic Supersequence time limit per test 2 seconds memory limit per test 256 megabyte ...

  9. Codeforces 932 C.Permutation Cycle-数学 (ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined))

    C. Permutation Cycle   time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

随机推荐

  1. oracle 块速查

    头信息区 这个区包括数据块的地址,数据块类型,检查点信息,scn信息等信息. --------- Start minblk maxblk buffer tsn: rdba: ) scn: 0x0000 ...

  2. 写了此书《微软Azure实战参考》 北京航空航天大学出版社 2019年7月

    经过大半年的努力,写出了此书<微软Azure实战参考> 北京航空航天大学出版社 2019年7月.喜爱微软云平台和需要使用微软云技术的读者,可以参考一下.

  3. 利用Jenkins打包并远程部署SpringBoot应用

    本文Jenkins版本2.190.2,为19年11月最新 1.安装Jenkins.Git.Maven和JDK Jenkins安装参考:https://www.cnblogs.com/zhi-leaf/ ...

  4. c#的IDisposable

    尽量在using中使用非托管资源 1.实现Dispose方法 2.提取一个受保护的Dispose虚方法,在该方法中实现具体的释放资源的逻辑 3.添加析构函数 4.添加一个私有的bool类型的字段,作为 ...

  5. commitizen规范代码提交

    转载链接:https://www.jianshu.com/p/bd712e42f2e9 参考链接:https://segmentfault.com/a/1190000009048911 平时提交的变动 ...

  6. 安装Office 2016 出现 Office 16 Click-to-Run Extensibility Component

    无法安装 64 位版本的 Office,因为在您的 PC 上找到了以下 32 位程序: Office 16 Click-to-Run Extensibility Component 请卸载所有 32 ...

  7. Rider 中无法显示DataTable,VS2019的.netCore才有DataTable可视化工具(4)

    如下图在vs2017中是这样的 在2019中是可以直接看的 在Rider中无论什么项目都不支持.

  8. sizeof()计算结构体的大小

    简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体 ...

  9. openresty 报错:lua entry thread aborted: runtime error

    [1]问题现象 (1)本地openresty系统 (2)报错信息 2019/09/10 08:13:55 [error] 2385#2385: *4 lua entry thread aborted: ...

  10. j2ee的容器:web容器和ejb容器的概念

    在J2EE中,容器充当的是中间件的角色. 两种主要容器的概念 Web容器 给处于其中的应用程序组件(JSP.Servlet)提供一个环境,使得JSP,Servlet能直接和容器中的环境变量.接口交互而 ...