AtCoder Beginner Contest 136

题目链接

A - +-x

直接取\(max\)即可。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5; int main() {
ios::sync_with_stdio(false); cin.tie(0);
int a, b;
cin >> a >> b;
cout << max(a + b, max(a - b, a * b));
return 0;
}

B - One Clue

直接输出,注意判断左右边界。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5; int main() {
ios::sync_with_stdio(false); cin.tie(0);
int k, x;
cin >> k >> x;
for(int i = max(-1000000, x - k + 1); i <= min(1000000, x + k - 1); i++) cout << i << ' ';
return 0;
}

C - Green Bin

\(map\)统计\(string\)出现次数即可。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
map <string, int> mp;
string s;
int n;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
ll ans = 0;
for(int i = 1; i <= n; i++) {
cin >> s;
sort(s.begin(), s.end());
if(mp.find(s) != mp.end()) ans += mp[s];
mp[s]++;
}
cout << ans;
return 0;
}

D - Summer Vacation

时间倒流。

每一个工作只能在某一个时刻之前开始进行才能获得收益。考虑倒序枚举时间,在每一个位置将所有工作加入,取最大收益即可。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, m;
vector <int> c[N];
struct node{
int A, B;
}a[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i].B >> a[i].A;
for(int i = 1; i <= n; i++) {
if(a[i].B <= m) c[m - a[i].B].push_back(a[i].A);
}
priority_queue <int> q;
int ans = 0;
for(int i = m - 1; i >= 0; i--) {
for(auto it : c[i]) q.push(it);
if(!q.empty()) {
ans += q.top(); q.pop();
}
}
cout << ans;
return 0;
}

E - Coins Respawn

首先\(dfs\)一次找到所有能够到达\(n\)的点,然后在这些点上面跑\(spfa\)+判正环就行。

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2505, M = 5005;
int n, m, p;
struct Edge{
int u,v,w,next;
}e[M<<1];
int tot, head[N];
void adde(int u,int v,int w){
e[tot].u=u;e[tot].v=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;
}
bool ok[N], vis[N];
bool g[N][N];
int c[N], d[N], dis[N];
void dfs(int u) {
ok[u] = 1;
for(int i = 1; i <= n; i++) {
if(g[u][i] && !ok[i]) dfs(i);
} }
int spfa(int s){
queue <int> q;
memset(d,0xcf,sizeof(d));
memset(vis,0,sizeof(vis));memset(c,0,sizeof(c));
q.push(s);vis[s]=1;d[s]=0;c[s]=1;dis[s]=0;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
if(c[u]>n){
return d[0];
}
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(!ok[v]) continue;
if(d[v]<d[u]+e[i].w){
d[v]=d[u]+e[i].w;
dis[v]=dis[u]+1;
if(!vis[v]){
vis[v]=1;
q.push(v);
c[v]++;
}
}
}
}
return d[n];
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m >> p;
memset(head, -1, sizeof(head));
for(int i = 1; i <= m; i++) {
int u, v, w; cin >> u >> v >> w;
adde(u, v, w - p);
g[v][u] = 1;
}
dfs(n);
int t = spfa(1);
if(t == d[0]) cout << -1;
else cout << max(0, t);
return 0;
}

F - Polynomial Construction

考虑拉格朗日插值,那么答案就是:

\[y=\sum_{i=0}^{p-1}a_i\prod_{j\neq i}\frac{x-j}{i-j}=\sum_{i=0}^{p-1}a_i\prod_{j\neq i}x-j\prod_{j\neq i}\frac{1}{i-j}
\]

现在就考虑如何快速求\(\prod_{j\neq i}x-j\)。

这部分可以直接递推计算,设\(dp[i][j]\)表示考虑\(\prod_{k=0}^{i}x-k\)的结果中\(x^j\)的系数是多少,那么就有:

  • \(dp[i][0]=dp[i-1][0]*(-i)\)
  • \(dp[i][j]=dp[i-1][j-1]-dp[i-1][j]*i\)

因为式子中有限制条件:\(j\neq i\),那么就考虑如何去掉一个\(x-i\):

  • \(dp[n-1][j]=dp[n-1][j+1](if:i=0)\)
  • \(dp[n-1][j]=\frac{dp[n-1][j]-tmp}{i}(else)\),\(tmp\)表示前面的对后面的贡献。

详见代码:

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3000;
int n, mod;
int a[N], res[N];
ll qp(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
int inv[N], inv2[N];
int dp[N][N];
int add(int x, int y) {
x += y;
if(x >= mod) x -= mod;
return x;
}
int sub(int x, int y) {
x -= y;
if(x < 0) x += mod;
return x;
}
int mul(ll x, ll y) {
x = x * y % mod;
if(x < 0) x += mod;
return x;
}
void pre() {
for(int i = 1; i <= n; i++) inv[i] = qp(i, mod - 2);
for(int i = 1; i <= n; i++) inv2[i] = qp(mod - i, mod - 2);
dp[0][1] = 1;
for(int i = 1; i < n; i++) {
for(int j = 0; j <= i + 1; j++) {
dp[i][j] = mul(dp[i - 1][j], mod - i);
if(j) dp[i][j] = add(dp[i][j], dp[i - 1][j - 1]);
// cout << i << ' ' << j << ' ' << dp[i][j] << '\n';
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n; mod = n;
for(int i = 0; i < n; i++) cin >> a[i];
pre();
for(int i = 0; i < n; i++) if(a[i]) {
int ans = 1;
for(int j = 0; j < n; j++) {
if(i > j) ans = mul(ans, inv[i - j]);
if(i < j) ans = mul(ans, inv2[j - i]);
}
int tmp = 0;
if(i == 0) tmp = dp[n - 1][1];
res[0] = add(res[0], mul(ans, tmp));
for(int j = 1; j < n; j++) {
tmp = mul(sub(dp[n - 1][j], tmp), inv2[i]);
if(i == 0) tmp = dp[n - 1][j + 1];
res[j] = add(res[j], mul(ans, tmp));
}
}
for(int i = 0; i < n; i++) cout << res[i] << " \n"[i == n - 1];
return 0;
}

AtCoder Beginner Contest 136的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 137 F

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

  5. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  6. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  7. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  8. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

  9. AtCoder Beginner Contest 075 C bridge【图论求桥】

    AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...

随机推荐

  1. windows 中如何定位恶意软件的藏身位置

    目录 一: 下载spy++ 打开后 点击 搜索下面的查找窗口(Alt+F3) 点击 查找程序工具 右侧的 靶子一样的图标,鼠标左键按住不放,拖放到 弹窗上面,弹窗周围会出现 黑框. 然后 我们点击确定 ...

  2. docker:轻量级图形页面管理工具Portainer

    1.介绍 docker 图形化管理提供了很多工具,有Portainer.Docker UI.Shipyard等等,本文主要介绍Portainer. Portainer是一个开源.轻量级Docker管理 ...

  3. SWIG 3 中文手册——2. 引言

    目录 2 引言 2.1 SWIG 是什么? 2.2 为什么使用 SWIG? 2.3 一个 SWIG 示例 2.3.1 SWIG 接口文件 2.3.2 swig 命令 2.3.3 构建 Perl5 模块 ...

  4. 阿里云配置DDoS高防

  5. 中级java面试经历

    2018年已经远去,2019年悄然而至.跳槽不仅是为了涨薪,更是为了锻炼自己,提高自己的能力.树挪死,人挪活.在一个公司呆的时间越长,就越老油条,从而失去不断前进的动力.现在下面就主要讲述我这一个月面 ...

  6. TP5 按照汉字的拼音排序

    业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下: 1,某字段(field1)为null的排前面 2,某字段(field2)为null的排前面 3,姓名(field3)按照汉字的 ...

  7. Linux时间日期类,压缩和解压类

    一.时间日期类 1.data指令 1.基本指令 date 显示当前日期 data +%Y 显示当前年份 data +%m 显示当前月份 data +%d 显示当前天 data +%Y-%m-%d %H ...

  8. 动态代理(二)—— CGLIB代理原理

    前篇文章动态代理(一)--JDK中的动态代理中详细介绍了JDK动态代理的Demo实现,api介绍,原理详解.这篇文章继续讨论Java中的动态代理,并提及了Java中动态代理的几种实现方式.这里继续介绍 ...

  9. What Is HLS (HTTP Live Streaming)?

    HTTP Live Streaming  (HLS) Executive Summary HTTP Live Streaming (or HLS) is an adaptive streaming c ...

  10. 在配置和销售凭证 GET_CONFIG_MODE 间通信时内部出错

    “在配置和销售凭证 GET_CONFIG_MODE 间通信时内部出错” 订单打开出现这种错误提示,多半是配置对象号问题. SAP NOTE 2019-09-27 901893901893 - Repo ...