HDU 4901 The Romantic Hero

题意: 一串数字a  找一个位置分开  前面为S'后面为T'  从这两个集合中分别选出子集S和T  使得S中元素的“异或”值等于T中元素的“且”值  问一共几种方案

思路:

由于a[i]只有1024  那么无论怎么运算都不可能大于2047  又因为S和T有一个明显的分界  所以我们可以想到利用dp分左右两边处理  令l[i][j]表示从左到i位置且一定选取a[i]的情况下异或值为j的方案数  r[i][j]类似  令sl[i][j]表示l[1~i][j]的和  sr[i][j]类似  这些都可以通过正反扫描得到  最后为了防止重复计数  可以通过sl[i][j]*r[i+1][j]或者sr[i][j]*l[i-1][j]来更新答案

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1010
#define mod 1000000007
#define M 2048int l[N][M], r[N][M], sl[N][M], sr[N][M], a[N];
int t, n, ans;int main() {int i, j, v;scanf("%d", &t);while (t--) {scanf("%d", &n);for (i = 1; i <= n; i++)scanf("%d", &a[i]);memset(l, 0, sizeof(l));memset(sl, 0, sizeof(sl));l[1][a[1]] = sl[1][a[1]] = 1;for (i = 2; i <= n; i++) {for (j = 0; j < M; j++) {v = j ^ a[i];l[i][v] = sl[i - 1][j];}l[i][a[i]] = (l[i][a[i]] + 1) % mod;for (j = 0; j < M; j++)sl[i][j] = (sl[i - 1][j] + l[i][j]) % mod;}memset(r, 0, sizeof(r));memset(sr, 0, sizeof(sr));r[n][a[n]] = sr[n][a[n]] = 1;for (i = n - 1; i >= 1; i--) {for (j = 0; j < M; j++) {v = j & a[i];r[i][v] = (r[i][v] + sr[i + 1][j]) % mod;}r[i][a[i]] = (r[i][a[i]] + 1) % mod;for (j = 0; j < M; j++)sr[i][j] = (sr[i + 1][j] + r[i][j]) % mod;}ans = 0;for (i = 1; i < n; i++) {for (j = 0; j < M; j++) {if (sl[i][j] && r[i + 1][j]) {ans = ((__int64 ) sl[i][j] * r[i + 1][j] % mod + ans) % mod;}}}printf("%d\n", ans);}return 0;
}

HDU 4902 Nice boat

题意: n个数字  m个操作  每次1操作将[l,r]区间所有值改为x  每次2操作将[l,r]中大于x的数改为与x取gcd

思路:明显是线段树  不过想不出对于一段区间进来两次2操作如何合并  想想要更新到叶子节点(这里的叶子指的是一段连续区间的数字相同)  就觉得线段树也优化不到哪去  于是开始玩暴力  结果500+ms就过了…

暴力方法很简单  因为如果1操作覆盖了f这个点  那么这个1操作前面的所有操作都没有意义  因此暴力枚举n个位置  对于每个位置从后到前扫描操作  如果遇到1操作就break  然后把扫描进来的2操作暴力做一遍  可以模拟栈来实现

代码:

#include<cstdio>
#include<algorithm>
using namespace std;__int64 last[100010], a[100010], num[100010];
int l[100010], r[100010], op[100010];
int n, m, t;__int64 func(__int64 fa) {if (fa < 0)return -fa;return fa;
}__int64 kgcd(__int64 fa, __int64 fb) {if (fa == 0)return fb;if (fb == 0)return fa;if (!(fa & 1) && !(fb & 1))return kgcd(fa >> 1, fb >> 1) << 1;else if (!(fb & 1))return kgcd(fa, fb >> 1);else if (!(fa & 1))return kgcd(fa >> 1, fb);elsereturn kgcd(func(fa - fb), min(fa, fb));
}int main() {int i, j, top;__int64 ans;scanf("%d", &t);for (; t; t--) {scanf("%d", &n);for (i = 1; i <= n; i++)scanf("%I64d", &a[i]);scanf("%d", &m);for (i = 1; i <= m; i++)scanf("%d%d%d%I64d", &op[i], &l[i], &r[i], &num[i]);for (i = 1; i <= n; i++) {top = 0;ans = a[i];for (j = m; j >= 1; j--) {if (i >= l[j] && i <= r[j]) {if (op[j] == 1) {ans = num[j];break;} else {last[++top] = num[j];}}}for (j = top; j > 0; j--) {if (ans > last[j])ans = kgcd(ans, last[j]);}printf("%I64d ", ans);}putchar('\n');}return 0;
}

HDU 4905 The Little Devil II

陈题不多说了  四边形优化

注意:不要迷信什么快速gcd  我队友因为他TLE了好几次  为什么呢?  算法是错的?  不是的…  在期望情况下明显快速gcd更优  不过这题的gcd是一个区间里所有数的gcd  由于数字是随机的  所以很容易就产生小数字  因此还是辗转相除靠谱

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
typedef __int64 ll;
using namespace std;const int M = 3010;
int a[M], s[M][M], g[M][M];
ll dp[M][M];
int n;template<class T>
inline void scan_d(T &ret) {char c;ret = 0;while ((c = getchar()) < '0' || c > '9');while (c >= '0' && c <= '9')ret = ret * 10 + (c - '0'), c = getchar();
}inline int abs(int a) {return a < 0 ? -a : a;
}int gcd(int a, int b) {if (a < b)swap(a, b);int i;while (b) {i = a % b;a = b;b = i;}return a;
}inline void solve() {int l, i, j, k;memset(dp, 0, sizeof(dp));for (i = 1; i <= n; i++)s[i][i] = i;for (l = 1; l <= n - 1; l++) {for (i = 1; i <= n - l; i++) {j = i + l;for (k = s[i][j - 1]; k <= s[i + 1][j]; k++) {if (k < j && dp[i][j] < dp[i][k] + dp[k + 1][j] + g[i][j]) {dp[i][j] = dp[i][k] + dp[k + 1][j] + g[i][j];s[i][j] = k;}}}}
}int main() {int min, i, j;int T;scan_d(T);while (T--) {scan_d(n);ll max = 0;ll s = 0;for (i = 1; i <= n; i++) {scan_d(a[i]);s += a[i];}for (i = 1; i <= n; i++) {g[i][i] = a[i];for (j = i + 1; j <= n; j++) {g[i][j] = gcd(g[i][j - 1], a[j]);}}solve();printf("%I64d\n", s + dp[1][n]);}return 0;
}

PS:比赛的时候脑子还是不太灵TAT  总是看到别人出题才深入思考… sad…  同时团队配合还要加强!! 加油!!

2014多校联合四(HDU 4901 HDU 4902 HDU 4905)相关推荐

  1. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)

    题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...

  2. HDU 4868 Information Extraction(2014 多校联合第一场 H)

    看到这道题时我的内心是奔溃的,没有了解过HTML,只能靠窝的渣渣英语一点一点翻译啊TT. Information Extraction 题意:(纯手工翻译,有些用词可能在html中不是一样的,还多包涵 ...

  3. 2013 多校联合4 1011 Fliping game (hdu 4642)

    题意:在一个矩阵中放着可上可下的银币,你可以翻一个矩形里面的银币使它们变成相反的方向,但此矩型必须是右下角是矩阵的最右下角,左上角这个点必须是朝上的.最 后结束的标志是所有的银币都已经都是朝上的,此时 ...

  4. 2014多校联合-第八场

    1001:2048 很明显,一开始看错题了...sad 这题目我感觉挺卡时间的... dp[i][j]:在选择2^i的时候,选择的和为j*2^i到(j+1)*2^i-1时候的情况. #include ...

  5. 2014多校联合-第七场

    1005: ( Stupid Tower Defense ) 由题意我们很明显可以知道,红色的塔放在最后面是最优的. 假如前i个塔,放j个绿塔,i-j个蓝塔.那么无论前i个塔的顺序怎么放,对后面的塔造 ...

  6. 2014多校联合-第六场

    最近这两场好无奈啊... 今天这场最后30分钟敲1001,压力倍增,虽然思路比较明确,但是代码打起来不怎么容易. 但是还是好在25分钟左右debug结束.提交wa,再提交,依然WA.......最后5 ...

  7. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  8. 华中科技大学辅修计算机双学位,关于做好“七校联合办学”辅修专业、双学位的通知...

    华中科技大学教务处发表的通知内容如下: 各院(系): 2014-2015学年武汉大学.华中科技大学.华中师范大学.武汉理工大学.中国地质大学.中南财经政法大学.华中农业大学等七校联合办学报名工作即将开 ...

  9. 2022杭电多校(四)

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

最新文章

  1. SQL操作的组成部分
  2. context:annotation-config / 和context:component-
  3. STM32应用实例六:与MS5837压力传感器的I2C通讯
  4. es Root mapping definition has unsupported parameters解决方法
  5. Android SoundPool 的简单使用
  6. THYMELEAF 如何用TH:IF做条件判断
  7. 众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”
  8. mac安装mysql的两种方法(含配置)
  9. UVa 10118 免费糖果(记忆化搜索+哈希)
  10. 电商时代,谁是手持数据采集巴枪的终结者【转】
  11. Unity游戏开发:背包系统的实现
  12. 关于飞思卡尔MSCAN滤波器的理解
  13. Android7工程模式,安卓手机的“工程模式”是什么?
  14. SAP中决定销售订单出现在MRP运算中的因素
  15. 教你如何一键重装Windows7系统
  16. linux发行版中的i386/i686/x86-64/有什么区别?
  17. word加密文档忘记密码了如何打开
  18. 嫦娥探月数据公布:高清真彩色月面图像首公开
  19. 为何使用云原生应用架构 四 :独霸天下之四大绝技 — 终端多样性 篇
  20. 读书百客:《登河北城楼作》赏析

热门文章

  1. 网页箭头特效:用CSS写的网页导航向上箭头
  2. Tekla厂房拉条快速建模
  3. van Emde Boas 树 数据结构说解
  4. obj[key]和obj[‘key’]
  5. SigComm‘21 - A Variegated Look at 5G in the Wild: Performance, Power, and QoE Implications
  6. deepwalk 代码实战
  7. RK3288 android5.1 增加AP6256 调试wifi和蓝牙
  8. 用perl找到图片信息
  9. 【非编软件】达芬奇非编软件升级为付费版的6个理由
  10. oc中不同方式实现锁