1001 string string string

题意

给定一个字符串$s$,求其中出现$k$次的子串的个数。

题解

后缀自动机。

代码

1002 cable cable cable

题意

给定$M$个显示屏和$K$个不同颜色的信号源。求最少连多少条数据线,可以使得任选$K$个显示屏,都可以恰好显示$K$个不同颜色。

题解

找规律。
考虑信号源$1$和显示屏$[1,M-K+1]$相连,信号源$2$和显示屏$[2,M-K+2]$相连……信号源$K$和显示屏$[K,M]$相连。故:$res=(M-K+1)*K$。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m, k;
int main() {while (~scanf("%lld%lld", &m, &k)) {printf("%lld\n", (m - k + 1) * k);}
}

1003 happy happy happy

题意

给定$n$个数$a_i$,爸爸和儿子玩游戏,爸爸每次可以选最左和最右的数,儿子先选且每次选最左最右中最大的(相同选最左),最终和最大的人获胜。爸爸想让儿子获胜,求最小差值。

题解

$DFS$。

代码

1004 array array array

题意

给定$n$个数$A_i$,判断能否去掉$k$个数使其变成不上升或不下降序列。

题解

$DP$。
求最长不下降和最长不上升子序列的长度,和$n-k$比较即可。

代码

#include <bits/stdc++.h>
using namespace std;const int N = 1e5+9;
int n, k, a[N], b[N], d[N];inline int read() {int s = 1, x = 0; char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') s = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return s * x;
}inline int dp(int c[N]) {int len = 0; d[++len] = c[1];for (int i = 2; i <= n; i++) {if (c[i] >= d[len]) d[++len] = c[i];else *upper_bound(d + 1, d + len + 1, c[i]) = c[i];}return len;
}int main() {int T = read();while (T--) {n = read(), k = read();for (int i = 1; i <= n; i++) a[i] = read();for (int i = 1; i <= n; i++) b[i] = -a[i];puts((dp(a) >= n - k || dp(b) >= n - k) ? "A is a magic array." : "A is not a magic array.");}return 0;
}

1005 number number number

题意

定义能用$k$项斐波拉契数列之和表示的数为“好数”,否则是“坏数”。给定$k$,求最小的“坏数”。

题解

找规律。
根据前几项我们发现:对于$k$,最小的坏数为$F_{2k+3}-1$。矩阵快速幂算一下即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3;
const int Q = 998244353;
struct Mat {ll mat[N][N];
}f, g;
int k;
Mat operator *(Mat a, Mat b) {Mat c; memset(c.mat, 0, sizeof(c.mat));for (int k = 1; k <= 2; k++) {for (int i = 1; i <= 2; i++) {for (int j = 1; j <= 2; j++) {c.mat[i][j] += (a.mat[i][k] % Q * b.mat[k][j] % Q);c.mat[i][j] %= Q;}}}return c;
}
Mat operator ^(Mat a, int n) {Mat c; memset(c.mat, 0, sizeof(c.mat));for (int i = 1; i <= 2; i++) {for (int j = 1; j <= 2; j++) {c.mat[i][j] = (i == j);}}for (; n; n >>= 1) {if (n & 1) c = c * a;a = a * a;}return c;
}
int main() {while (~scanf("%d", &k)) {memset(f.mat, 0, sizeof(f.mat));f.mat[1][1] = f.mat[1][2] = f.mat[2][1] = 1;g = f ^ (2 * k + 1);f.mat[1][2] = 0;g = g * f;printf("%d\n", g.mat[1][1] - 1);}return 0;
}

1006 gems gems gems

题意

给定$n$个价值为$V_i$的宝石,两个人从左往右取宝石,第一个人可以取$1$或$2$个,之后若一个人先取了$k$个,则另一个人只能取$k+1$个,当无法再取时游戏结束。求两个人所取宝石的最小差值。

题解

$DP$。
本来以为是个博弈论的,还是图样。。。
考虑动态规划,用$dp[0/1][i][j]$表示某一个人从第$i$个宝石开始取$j$或$j+1$个宝石的最优结果。
转移方程:
$\begin{equation}
dp[0][i][j]=\sum_{i}^{i+j-1}{V_i}+max
\begin{cases}
dp[1][i+j][j]\newline
dp[1][i+j+1][j+1]+V_{i+j} \newline
\end{cases}
\end{equation}$

$\begin{equation}
dp[1][i][j]=-\sum_{i}^{i+j-1}{V_i}+min
\begin{cases}
dp[0][i+j][j] \newline
dp[0][i+j+1][j+1]-V_{i+j} \newline
\end{cases}
\end{equation}$

考虑第三维的范围:极端情况第$k$轮取$k+1$个,有$\frac{(k+1)(k+2)}{2}< n$。故:第三维的$j\leq 200$。
这样时间复杂度为:$\Theta(400n)$。
下面来优化空间复杂度:
考虑不会超过$long\space long$,$dp$数组用$int$型即可;
考虑第二维转移有空间浪费,用滚动数组即可。
HDOJ是缺内存还是怎么滴啊。。$MLE$很难受啊。。

代码

#include <bits/stdc++.h>
using namespace std;const int N = 2e4+9;
const int K = 209;
const int Q = 255;
const int M = 255+9;
int sum[N], dp[2][M][K];inline int read() {int s = 1, x = 0; char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') s = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return s * x;
}int main() {int T = read();while (T--) {int n = read();memset(sum, 0, sizeof(sum));for (int i = 1; i <= n; i++) {int v = read();sum[i] = sum[i - 1] + v;}memset(dp, 0, sizeof(dp));for (int i = n; i; i--) {for (int j = K - 1; j; j--) {if (i + j <= n) {dp[0][i&Q][j] = sum[i+j-1] - sum[i-1] + max(dp[1][(i+j)&Q][j], dp[1][(i+j+1)&Q][j+1] + sum[i+j] - sum[i+j-1]);dp[1][i&Q][j] = sum[i-1] - sum[i+j-1] + min(dp[0][(i+j)&Q][j], dp[0][(i+j+1)&Q][j+1] - sum[i+j] + sum[i+j-1]);continue;}if (i + j - 1 <= n) {dp[0][i&Q][j] = dp[1][(i+j)&Q][j] + sum[i+j-1] - sum[i-1];dp[1][i&Q][j] = dp[0][(i+j)&Q][j] - sum[i+j-1] + sum[i-1];}}}printf("%d\n", dp[0][1][1]);}
}

1007 mustedge mustedge mustedge

题意

题解

代码

1008 transaction transaction transaction

题意

给定一个$n$个节点的树,每个点有一个点权$p_i$。选定两个节点$S$和$T$,使得【$p_T-p_S-$路径上的边权】最大,求这个最大值。

题解

树形$DP$。
考虑将$S$到$T$的路径拆成两部分即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5+9;
const int INF = 0x3f3f3f3f;
int T, n, p[N];
vector<pii> g[N];
ll res,dp[2][N];inline int read() {int s = 1, x = 0; char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') s = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return s * x;
}inline void dfs(int u, int fa) {dp[0][u] = dp[1][u] = p[u];for (auto e : g[u]) {int v = e.first, w = e.second;if (v != fa) {dfs(v, u);dp[0][u] = max(dp[0][u], dp[0][v] - w);dp[1][u] = min(dp[1][u], dp[1][v] + w);}}res = max(res, dp[0][u] - dp[1][u]);
}int main() {T = read();while (T--) {memset(p, 0, sizeof(p));n = read();for (int i = 1; i <= n; i++) p[i] = read();for (int i = 1; i <= n; i++) g[i].clear();for (int i = 1; i < n; i++) {int x = read(), y = read(), z = read();g[x].push_back( make_pair(y, z) );g[y].push_back( make_pair(x, z) );}res = 0; dfs(1, 0);printf("%lld\n", res);}
}

1009 cube cube cube

题意

题解

$DFS$。

代码

1010 ping ping ping

题意

题解

代码

1011 triangulation triangulation triangulation

题意

题解

代码

1012 card card card

题意

给定$n$堆数组成一个圈,每堆数有$a_i$和$b_i$两个参数。选一个堆数开始按顺序取,每次加上$a_i-b_i$直到和小于$0$停止。要求取数的$a_i$之和最大,求应该从哪一堆开始取。

题解

尺取法。
先将$n$堆数重复成$2n$堆数变成环,考虑我们只需要尺取$n$堆数。当$[i,j]$不满足时,即$\sum_{k=i}^{j}{a_k-b_k}< 0$,上式对$[i,j]$内的$i$都成立,因此我们只需要把$i$移动到$j+1$即可。时间复杂度是线性的。

代码

#include <bits/stdc++.h>
using namespace std;const int N = 2e6 + 9;
int n, a[N], b[N], c[N];inline int read() {int s = 1, x = 0; char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') s = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return s * x;
}int main() {while (~scanf("%d", &n)) {for (int i = 0; i < n; i++) a[i] = read(), a[i + n] = a[i];for (int i = 0; i < n; i++) b[i] = read(), b[i + n] = b[i];for (int i = 0; i < n << 1; i++) c[i] = a[i] - b[i];int cur = 0, sum = 0, SUM = 0, res = 0;for (int i = 0, j = 0; j < n << 1; j++) {if (cur + c[j] < 0) {sum += a[j];if (sum > SUM) SUM = sum, res = i;cur = sum = 0, i = j + 1;} else cur += c[j], sum += a[j];if (j - i == n - 1 && sum > SUM) {SUM = sum, res = i;break;}}printf("%d\n", res);}return 0;
}

转载于:https://www.cnblogs.com/jstztzy/p/7505490.html

[Contest]2017 ACM/ICPC Asia Regional Shenyang Online(01 03 07 09 10 11待补)相关推荐

  1. 2017 ACM/ICPC Asia Regional Shenyang Online array

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197 题目大意:给出一个序列,删去k个元素是否能构成不上升序列或不下降子序列 (呃,先凑个数吧 二分+ ...

  2. 2017 ACM/ICPC Asia Regional Shenyang Online Ping Ping Ping 树链剖分+树状数组

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题目大意:给出n+1个节点的树( 3<n<10^4),并给出m对点(m<=50 ...

  3. HDU 6194 String String String (后缀数组+线段树, 2017 ACM/ICPC Asia Regional Shenyang Online)

    Problem 求字符串 S 中严格出现 k 次的子串个数 k≥1k\ge 1 |S|≤105|S|\le 10^5 ∑|S|≤2×106\sum |S| \le 2\times 10^6 Idea ...

  4. 2017 ACM/ICPC Asia Regional Shenyang Online(9.10)

    总结下这两天做的题目,昨天的题目与图相关的很多,图的题一般就是遇到没见过就gg了,比如那个有向的加强图那个,,沈阳这个有两个推公式的,但是只过了一个...number number number这个题 ...

  5. Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online

    网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...

  6. 2015 ACM/ICPC Asia Regional Shenyang Online题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABCFGJL A. Traversal AC的C++语言程序: #include <bits/stdc++. ...

  7. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  8. 2016 ACM/ICPC Asia Regional Shenyang Online

    I:QSC and Master 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意: 给出n对数keyi,vali表示当前这对数的键值和权值 ...

  9. 2017 ACM/ICPC Asia Regional Xian Online 记录

    题目链接  Xian 转载于:https://www.cnblogs.com/cxhscst2/p/7594649.html

最新文章

  1. 九、调度算法的评价指标
  2. 无线基站侧的信令风暴根因——频繁的释放和连接RRC产生大量信令、设备移动导致小区重选信令增加、寻呼信令多...
  3. 初始化字典的6种方式
  4. 穿越剧_张宇鑫:穿越剧——从皇帝到乞丐
  5. php未定义要怎样做,php-Behat-未定义的功能步骤
  6. java afconsole_Java ——基础语法
  7. C# 多线程编程 ThreadStart ParameterizedThreadStart
  8. 中国首富们三十而立的年纪都在干什么
  9. 对比 C++ 和 Python,谈谈指针与引用
  10. 情人节,找个程序员当男朋友,一般都不会太差
  11. scala 单例对象 伴生对象
  12. SQL注入攻击原理与几种防御方式
  13. 【STC15】使用PCA0和PCA1做的模拟串口
  14. Zune无法连接手机的解决办法
  15. 安卓Push Rejected解决
  16. python---字典详解
  17. 在线免费压缩pdf文件
  18. 编写KNN算法预测泰坦尼克号存活率
  19. python编写MySQL数据库查询/操作软件代码
  20. 手持SLAM年终杂谈

热门文章

  1. memcached的缺点
  2. GDI+ 应用,Release没有错误,Debug很多。
  3. java基础将字符串进行反转
  4. (十四)面向对象之多态
  5. java类与对象(属性,方法)的使用
  6. javascript中的字符串编码、字符串方法详解
  7. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
  8. 关于产品与数据该如何结合的一点想法(一)
  9. vue.js:634 [Vue warn]: Error in render: “TypeError: Cannot read property ‘matched‘ of undefined“
  10. 【Vue】组件的创建以及 data methods 属性的使用