zoj3741

简单dp。wa了两个小时,中间改了好多细节。后来还是不对,参考了别人的代码,发现一个致命问题,初始化的时候,不是每种状态都能直接达到的。初始化成-1。

(题目有个小坑,0<=L<=5, 即使吃药了,也不能到6 )

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#define pk printf("lalala");
using namespace std;
#define PI acos(-1.0)
#define EXP exp(1.0) // 自然对数
#define ESP 1E-6
#define clr(x,c) memset(x,c,sizeof(x))
typedef long long ll;
const int N = 105;
int dp[N][2*N];
int a[N]; void print()
{
for (int k = 1; k <= 6; ++k) {
for (int i = 98; i <= 101; ++i)
printf("%d ", dp[k][i]);
printf("\n");
} } int main()
{
int l, n, x, y;
while (~scanf("%d%d%d%d", &l, &n, &x, &y)) {
clr(dp, -1);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
dp[0][100] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 100 - y; j <= 100 + x; ++j) {
if (j == 100 - y) {
if (dp[i - 1][100 + x] == -1) continue;
if (0 >= a[i]) dp[i][j] = dp[i - 1][100 + x] + 1;
else dp[i][j] = dp[i - 1][100 + x];
} else if (j < 100) {
if (dp[i - 1][j - 1] == -1) continue;
if (0 >= a[i]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = dp[i - 1][j - 1];
} else if (j == 100 + 1) {
if (dp[i - 1][j - 1] == -1 && dp[i - 1][100 - 1] == -1) continue;
if ((l + 1 <= 5 && l + 1 >= a[i]) || l >= a[i]) {
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][100 - 1]) + 1;
} else {
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][100 - 1]);
}
} else if (j > 100) {
if (dp[i - 1][j - 1] == -1) continue;
if ((l + 1 <= 5 && l + 1 >= a[i]) || l >= a[i]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = dp[i - 1][j - 1];
} else {
if (dp[i - 1][j] == -1 && dp[i - 1][100 - 1] == -1) continue;
if (l >= a[i]) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][100 - 1]) + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][100 - 1]);
}
}
}
}
int ans = 0;
for (int i = 100 - y; i <= 100 + x; ++i) {
ans = max(ans, dp[n][i]);
}
//print();
printf("%d\n", ans);
}
return 0;
} /*
3 6 1 2
1 3 4 5 6 4 0 6 3 1
1 0 1 0 1 0 3 6 1 3
3 4 3 3 4 4 3 6 1 2
3 4 3 4 3 4 3 6 1 2
4 5 4 5 4 5 5 6 1 2
6 5 6 4 5 6 5 6 2 3
6 5 6 5 6 5 4 6 1 6
5 5 5 5 5 5 4 6 5 2
5 5 0 0 5 5 4
6
4
4
2
3
3
1
5
*/

  

zoj 3911

线段树区间更新,点更新,区间查询。好久不写,不是很会写了 (尴尬 - -#)

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <utility> // pair
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#define pk printf("lalala");
using namespace std;
#define PI acos(-1.0)
#define EXP exp(1.0) // 自然对数
#define ESP 1E-6
#define clr(x,c) memset(x,c,sizeof(x))
typedef long long ll; const int MAX_N = 10000005;
int prime[MAX_N];
bool is_prime[MAX_N]; int sieve(int n)
{
int p = 0;
for (int i = 0; i <= n; ++i) is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
prime[p++] = i;
for (int j = 2 * i; j <= n; j += i)
is_prime[j] = false;
}
}
return p;
} #define lson (o<<1)
#define rson (o<<1|1)
#define mid ((l+r)>>1) const int N = 100005;
int tr[N * 3];
int ans[N * 3];
int v, yl, yr; void pushup(int o)
{
ans[o] = ans[lson] + ans[rson];
} void build(int o, int l, int r)
{
if (l == r) {
scanf("%d", &tr[o]);
if (is_prime[ tr[o] ]) ans[o] = 1;
else ans[o] = 0;
return ;
}
build(lson, l, mid);
build(rson, mid + 1, r);
pushup(o);
} void pushdown(int o, int l, int r)
{
if (tr[o] == 0) return ;
tr[lson] = tr[rson] = tr[o];
if (is_prime[ tr[o] ]) {
ans[lson] = mid - l + 1;
ans[rson] = r - mid;
} else {
ans[lson] = ans[rson] = 0;
}
tr[o] = 0;
} void add(int o, int l, int r)
{
if (l == r) {
tr[o] += v;
if (is_prime[ tr[o] ]) ans[o] = 1;
else ans[o] = 0;
return ;
}
pushdown(o, l, r);
if (mid >= yl) add(lson, l, mid);
else add(rson, mid + 1, r);
pushup(o);
} void update(int o, int l, int r)
{
if (yl <= l && yr >= r) {
tr[o] = v;
if (is_prime[v]) {
ans[o] = r - l + 1;
} else {
ans[o] = 0;
}
return ;
}
pushdown(o, l, r);
if (yl <= mid) update(lson, l, mid);
if (yr > mid) update(rson, mid + 1, r);
pushup(o);
} int query(int o, int l, int r)
{
if (yl <= l && yr >= r) return ans[o];
pushdown(o, l, r);
int res = 0;
if (yl <= mid) res += query(lson, l, mid);
if (yr > mid) res += query(rson, mid + 1, r);
return res;
} int main()
{
sieve(10000000); int t;
scanf("%d", &t);
while (t--) {
int n, q;
scanf("%d%d", &n, &q);
clr(tr, 0);
build(1, 1, n); while (q--) {
char op[4];
scanf("%s", op);
if (*op == 'A') {
scanf("%d%d", &v, &yl);
add(1, 1, n);
} else if (*op == 'R') {
scanf("%d%d%d", &v, &yl, &yr);
update(1, 1, n);
} else {
scanf("%d%d", &yl, &yr);
printf("%d\n", query(1, 1, n));
}
}
} return 0;
}

  

群赛 ZOJ3741(dp) ZOJ3911(线段树)的更多相关文章

  1. Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)

    题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...

  2. LightOJ 1085(树状数组+离散化+DP,线段树)

    All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format: ...

  3. BZOJ 1835: [ZJOI2010]base 基站选址(DP,线段树)

    可以很容易的写出dp方程: F[i][j]=min(F[l][j-1]+w[l][i])+c[i] (w[i][j]是从l+1到i-1这些点p里,所有满足d[p]+s[p]<d[i] & ...

  4. Codeforces 671D Roads in Yusland [树形DP,线段树合并]

    洛谷 Codeforces 这是一个非正解,被正解暴踩,但它还是过了. 思路 首先很容易想到DP. 设\(dp_{x,i}\)表示\(x\)子树全部被覆盖,而且向上恰好延伸到\(dep=i\)的位置, ...

  5. LOJ2537 PKUWC2018 Minimax 树形DP、线段树合并

    传送门 题意:自己去看 首先可以知道,每一个点都有几率被选到,所以$i$与$V_i$的关系是确定了的. 所以我们只需要考虑每一个值的取到的概率. 很容易设计出一个$DP$:设$f_{i,j}$为在第$ ...

  6. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  7. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  8. CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树

    http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...

  9. 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并

    题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...

随机推荐

  1. Spring MVC常用的注解

    @Controller @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为 类名称开头字母小写,你也可以自己指定,如下 方法一: @Controller ...

  2. gei shilei d

    body, p { margin: 0; padding: 0; font-size: 16px; } div { margin: 0 auto; } .wrapper { width: 1080px ...

  3. [转载]C# 多选功能(checkedListBox控件)

    // 全选; private void btn_allSelected_Click(object sender, EventArgs e) { //this.CheckedListBox1.Check ...

  4. [状压dp]POJ1185 炮兵阵地

    中文题 题意不再赘述 对于中间这个“P” 根据dp的无后效性 我们只需考虑前面的 就变成了 只需考虑: 也就是状压前两行 具体与HDOJ的4539类似: 看HDOJ 4539 仅仅是共存状态的判断不同 ...

  5. 简单讨论数据类型(byte)强制转化后的数值变化规律

    package com.wangzhu.datatype; /** * Java基本数据类型练习 * * @ClassName: DataTypes * @Description: TODO * @a ...

  6. DHTMLX 前端框架 建立你的一个应用程序 教程(八)-- 添加表单Form

    添加表单Form 我们下一步是在页面中添加一个表单,表格中的选中字段将会显示在表单中.提供一个提交按钮 可以对显示的数据进行修改提交. 添加表单到布局单元格中 1.在右侧布局中使用attachForm ...

  7. Android 图片从网页中获取并动态加载到listview中

    实现功能: 效果图: 代码:这里

  8. leetcode面试准备:Add and Search Word - Data structure design

    leetcode面试准备:Add and Search Word - Data structure design 1 题目 Design a data structure that supports ...

  9. 【HDOJ】2295 Radar

    DLX+二分. /* 2295 */ #include <iostream> #include <string> #include <map> #include & ...

  10. 【HDOJ】1241 Oil Deposits

    经典的BFS. #include <stdio.h> #include <string.h> #define MAXNUM 105 #define MAXROW 105 #de ...