文章目录

  • 1001题
    • Link with Bracket Sequence II
      • 题目大意
      • 思路
      • 代码
  • 1003题
    • Magic
      • 思路
      • 代码

1001题

Link with Bracket Sequence II

题目链接

题目大意

给定一个长度为 n n n 的方括号数组,其中 0 0 0 表示该元素缺失,你有 m m m 种类型的括号可以将其替换。如果 a i > 0 a_i > 0 ai​>0 则代表此元素为 a i a_i ai​ 类型的左括号,如果 a i < 0 a_i < 0 ai​<0 则代表此元素为 a i a_i ai​ 类型的右括号。如果两个括号匹配则认为它有效。(特殊地,长度为 0 0 0 也认为是有效的括号序列。)
例如:若 A A A 为有效的括号序列, X = − Y X = -Y X=−Y,则 X A Y XAY XAY 也为一个有效的括号序列;若 A A A、 B B B 均为有效的括号序列,则 A B AB AB 也为有效的括号序列。现需要输出你有多少种方案使得这个括号序列有效(答案对 1 e 9 + 7 1e9+7 1e9+7 取模)

思路

先对长度 n n n 进行考虑,因为括号序列必定是两两匹配,故 n n n 一定为偶数,奇数情况的 n n n 无方案,答案为 0 0 0 .
当 n n n 为偶数时,开始考虑不同括号之间的关系:

  1. 对于类似于 A B AB AB 这种括号序列,若 B B B 是我们正在考虑的, A A A 已经确定,则方案数 A B AB AB应当是方案数 A × A\times A× 方案数 B B B 。
  2. 对于类似于 X A Y XAY XAY 这种括号序列,因为 A A A 的方案数已知,故考虑 X X X 和 Y Y Y 匹配得到的方案数。
    • 如果 X Y XY XY 的和为 0 0 0 或有一方为 0 0 0 ,则方案数为 1 1 1 .
    • 若两者均为 0 0 0 ,则方案数为 m m m 。其他情况则不匹配,方案数为 0 0 0.

基于以上两种思路,如果我们用 a n s ans ans 数组代表最终结果, d p dp dp 数组表示目前正在考虑的互相匹配的括号序列的方案数的话。我们就可以得出:

  1. 对于第一种情况: a n s [ i ] [ j ] ans[i][j] ans[i][j] = ( a n s [ i ] [ j ] + a n s [ i ] [ k ] ) (ans[i][j] + ans[i][k]) (ans[i][j]+ans[i][k]) × \times × f [ k + 1 ] [ j ] f[k+1][j] f[k+1][j];
  2. 对于第二种情况: f [ i ] [ j ] f[i][j] f[i][j] = a n s [ i + 1 ] [ j − 1 ] ans[i+1][j-1] ans[i+1][j−1] × \times ×倍数;

其中 i i i, j j j 表示当前序列的左端点和右端点。之后只需要按长度遍历每一种情况即可。

代码

#include<iostream>
#include<string.h>
using namespace std;
#define ll long long
const int mod = 1e9+7;
const int N = 600;int dp[N][N],ans[N][N];void solve(){int n,m;cin>>n>>m;memset(dp,0,sizeof dp);memset(ans,0,sizeof ans);int a[N];for(int i = 1;i <= n;i ++)cin>>a[i];if(n & 1){//奇数长度的括号序列不匹配cout<<0<<endl;return;}for(int i = 0;i <= n;i ++)ans[i+1][i] = 1;for(int len = 2;len <= n;len += 2){//奇数长度的括号序列一定不匹配,故len+=2for(int l = 1;l + len - 1 <= n;l++){int r = l + len - 1;if(a[l] >= 0 && a[r] <= 0){int b = 0;if(a[l] == 0 && a[r] == 0)b = m;//两端都是0,说明有m个匹配的方法else if(a[l] == 0 || a[r] == 0)b = 1;//有一端确定,说明只有一种匹配方法else if(a[l] == -1*a[r])b = 1;//两端匹配成功,只有一种匹配方法else b = 0;//没有匹配成功dp[l][r] = 1ll*ans[l+1][r-1]*b%mod;}for(int i = l;i <= r;i += 2){ans[l][r] = (ans[l][r] + 1ll*ans[l][i-1]*dp[i][r])%mod;}}}cout<<ans[1][n]<<endl;
}int main(){int t;cin>>t;while(t--)solve();system("pause");return 0;
}

1003题

Magic

题目链接

思路

显然是差分约束(不懂的可以做一下这一题:P5960 【模板】差分约束算法)。我们将区间操作转换为点操作,设 a [ i ] a[i] a[i] 表示前 i i i 个魔法塔中加入的魔法原料之和。

  • 每个魔法塔都能影响半径为 k k k 内的魔法塔的魔法值,则第 i i i 个魔法塔对魔法值的需求可以表示为 a [ m i n ( i + k − 1 , n ) ] − a [ m a x ( 1 , i − k + 1 ) − 1 ] ≥ p i a[min(i+k-1,n)]-a[max(1,i-k+1)-1]\ge p_i a[min(i+k−1,n)]−a[max(1,i−k+1)−1]≥pi​;

  • 每个魔法塔的魔法原料都 ≥ 0 \ge0 ≥0,则有 a [ i ] − a [ i − 1 ] ≥ 0 a[i]-a[i-1]\ge0 a[i]−a[i−1]≥0;

  • 对每个区间添加魔法原料的限制可以表示为 a [ R i ] − a [ L i − 1 ] ≤ B i a[R_i]-a[L_i-1]\le B_i a[Ri​]−a[Li​−1]≤Bi​,即 a [ L i − 1 ] − a [ R i ] ≥ − B i a[L_i-1]-a[R_i]\ge-B_i a[Li​−1]−a[Ri​]≥−Bi​。

因为最终答案求的是 a [ n ] a[n] a[n] 的最小值,我们可以转化为求最长路的形式,从节点 0 0 0 开始跑 SPFA,如果存在正环,无解;否则,答案就是 d i s t [ n ] dist[n] dist[n]。

代码

bool spfa() {memset(cnt, 0, sizeof(cnt));memset(dist, -127, sizeof(dist));memset(st, 0, sizeof(st));dist[0] = 0, st[0] = 1;queue<int> q;q.push(0);while (q.size()) {int x = q.front();q.pop();st[x] = 0;for (auto i : e[x]) {int y = i.first, z = i.second;if (dist[y] < dist[x] + z) {dist[y] = dist[x] + z;cnt[y] = cnt[x] + 1;if (cnt[y] >= n + 1) return 0;if (!st[y]) q.push(y), st[y] = 1;}}}return 1;
}void solve() {scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++) {int x;scanf("%d", &x);int l = max(1, i - k + 1), r = min(i + k - 1, n);e[l - 1].push_back({r, x});}for (int i = 1; i <= n; i++) e[i - 1].push_back({i, 0});scanf("%d", &m);while (m--) {int l, r, x;scanf("%d%d%d", &l, &r, &x);e[r].push_back({l - 1, -x});}if (spfa())printf("%d\n", dist[n]);elseputs("-1");for (int i = 0; i < N; i++) e[i].clear();
}

2022暑期杭电第四场相关推荐

  1. 2022暑期杭电第十场

    文章目录 1003题 Wavy Tree 题目大意: 思路: 参考代码: 1007题 Even Tree Split 题目大意 思路 代码 1009题 Painting Game 题目大意 分析 代码 ...

  2. 2022暑期杭电第八场

    文章目录 1001题 Bragging Dice 题目大意 思路 代码 1007题 Darnassus 题目大意 思路 代码 1008题 Orgrimmar 题目大意 思路 代码 1011题 Stor ...

  3. 2022暑期杭电第七场

    文章目录 1002题 Independent Feedback Vertex Set 题目大意: 思路: 代码: 1003题 Counting Stickmen 题目大意 思路 代码 1008题 tr ...

  4. 2022暑期杭电第三场

    文章目录 1002题 Boss Rush 题意 分析 代码 1009 Package Delivery 题意 思路 代码 1011题 Taxi 题意: 思路: 代码 1012题 Two Permuta ...

  5. 2022暑期杭电第九场

    文章目录 1003题 Fast Bubble Sort 题目大意 思路 代码 1007题 Matryoshka Doll--线性DP 题目大意 思路 代码 1008题 Shortest Path in ...

  6. 2019暑期杭电多校HDU6599 I Love Palindrome String

    2019杭电多校HDU6599 I Love Palindrome String 题目链接 I Love Palindrome String Time Limit: 4000/2000 MS (Jav ...

  7. 2022 年杭电多校第八场补题记录

    A Theramore 题意:给定一个长度为 nnn 的 010101 串,每次可以选取一个奇数长度的连续子串进行位置上的翻转,问经过若干次操作能得到的字典序最小的串.n≤5×105n \leq 5\ ...

  8. 2021杭电多校第八场补题

    比赛传送门:Contest Problem List (hdu.edu.cn) 1006)GCD Game 题目翻译:爱丽丝和鲍勃正在玩游戏. 他们轮流操作.有n个数字,a1,a2,...,an.每次 ...

  9. 2022杭电多校(四)

    2022杭电多校(四) 文章目录 2022杭电多校(四) 一.比赛小结 二.题目分析及解法(基础题) 1001.Link with Bracket Sequence II 1002.Link with ...

最新文章

  1. Spark基础知识解答
  2. 5个新兴人工智能物联网应用
  3. IE9(测试版)浏览器实用快捷键使用方法
  4. mysql1193 HY000_[MySQL参数取值] Status取值ERROR 1193 (HY000): Unknown system_MySQL
  5. php 安全基础 第七章 验证与授权 密码嗅探
  6. js在div中追加html,JS把内容动态插入到DIV的实现方法
  7. eclipse 取消置顶
  8. antd vue关闭模态对话框_我不能没有的5个Vue.js库
  9. 蓝桥杯刷题 -- 第六届蓝桥杯
  10. 二进制空间权重矩阵_Stata_ 空间权重矩阵的构建
  11. 月球探测器中的计算机技术,月球探测器自主视觉导航技术的研究
  12. 西威变频器调试软件GF-EXprss
  13. stm32电容触摸按键的实现
  14. 货币兑换java程序,Spring Cloud货币换算及货币兑换服务介绍
  15. 域控服务器共享盘搭建,搭建域控服务器
  16. 关于Snoop的用法
  17. 基于DFSMN-CTC及CTC-CE联合训练的声学模型
  18. 美国服务器电影网站版权问题,为什么说选择美国服务器做电影网站比较好
  19. eclipse官网下载不了eclipse开发工具的解决方法
  20. 老DOS游戏-殖民计划

热门文章

  1. pymysql安装与介绍
  2. 3. matlab 中的 linprog函数
  3. 前段学习网站学习资料
  4. python的scatter函数_python scatter函数用法实例详解
  5. 校招变相毁约、为714高炮导流!百融云创没有金融科技的“正确打开方式”?
  6. 1000个工程师、500个设计建筑师、2500个社区经理,这家公司你如何来定义?
  7. ubuntu上编译Linux内核步骤
  8. 魔兽停服:500万寂寞背后的利益暗战
  9. C#获取显示器宽度高度,桌面宽度高度等
  10. [项目] Java 图书管理系统 CMD 版 (附源码)