Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)
就是个等比数列,特判公比为 $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 ;
}
优先删除靠近叶子节点的偶数度数的节点,因为假如删了这个节点的父节点,就剩下两个点一条边了。
那这样肯定是不能删完的。
就搞出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$ 个数必须成比例。
排个序排除一下这两种情况。
具体排列方式就与比例的约数有关了,比如对于长为 $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 ;
}
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 ;
}
有转移方程 $$ 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)的更多相关文章
- 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 解 对于题目要求,显然一开始的树,要求度数为偶数的节点个数为奇数个,通过奇 ...
- 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 ...
- 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 ...
- CodeForces 837D - Round Subset | Educational Codeforces Round 26
/* CodeForces 837D - Round Subset [ DP ] | Educational Codeforces Round 26 题意: 选k个数相乘让末尾0最多 分析: 第i个数 ...
- 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 ----------------------------------------------------------我是分 ...
- 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 ...
- Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)
思路:把边看成点,然后每条边只能从下面的边转移过来,我们将边按照u为第一关键字,w为第二关键字排序,这样就能用线段树维护啦. #include<bits/stdc++.h> #define ...
- 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 ...
- 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 ...
随机推荐
- 企业级Nginx负载均衡与keepalived高可用实战(一)Nginx篇
1.集群简介 1.1.什么是集群 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器. ...
- 查看window重启日志
命令行输入 net statistics WORKSTATION 显示开机时间 如果你今天一直没有关机,但是你看到这个信息显示今天XX点才开始统计数据的说明电脑重启了
- pandas的使用(7)--分组
pandas的使用(7)--分组
- 024 如何让html引用公共的头部和尾部(多个html文件公用一个header.html和footer.html)
前端静态html页面,封装公共的头文件(header:顶部页眉,顶部导航栏等部分)和尾部文件(footer:CopyRight.友情链接等部分) 当前方法:通过load()函数,引入公共头部和尾部文件 ...
- 一个JS正则的字符串替换函数
直接上函数吧 不废话 function replacestring(oldstr,newstr,text) { var exp = new RegExp(oldstr,'g'); var c=tex ...
- 单片机成长之路(51基础篇) - 026 基于stm89c52之单片机看门狗
基于stc89c52的看门狗,代码如下: main.c #include "stc89c5x_Quick_configuration.h" // 自定义头文件 #include & ...
- 制作一个SSRS的ORACLE数据库报表,使用了时间类型的参数。
需求:我们这个报表是以月为单位,呈现的数据为查询为当前月的第一天到最后一天.条件类似于:time_day > 20140601 and time_day < 20140630 因为是让用 ...
- C# 随笔写txt
public static void WriterFile(string file) { string path = AppDomain.CurrentDomain.BaseDirectory; // ...
- .net 调用 Python脚本中的代码
使用工具:IronPython 工具介绍:是一种在 .NET 及 Mono上的 Python 实现,是一个开源的项目,基于微软的 DLR 引擎.(个人理解就是在 .net上面运行Python代码) 使 ...
- 2019-08-26 linux
1.question:什么是linux? answer:Linux由林纳斯·托瓦兹开发的一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU ...