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. SD卡FAT32文件系统格式

    一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...

  2. hadoop 2.2.0 编译报错: [ERROR] class file for org.mortbay.component.AbstractLifeCycle not found

    [ERROR]  class file for org.mortbay.component.AbstractLifeCycle not found 错误堆栈如下: [ERROR] COMPILATIO ...

  3. Linux按照时间查找文件

    linux按照时间查找文件 需要用到一个根据最后修改时间来处理的脚本. 前面有个有关find的基本用法,根据文件大小,类型什么的,这个是关于时间的.  linux 文件的三种时间(以 find 为例) ...

  4. 1003: [ZJOI2006]物流运输trans

    spfa+dp; 刚刚开始一直想不通怎么判断他是否换了道: 后来才知道,将那个时间段打包,找出这段时间内的最短路: 真是太奇妙了! #include<cstdio> #include< ...

  5. POJ2402+模拟

    题意:找出第index 个回文数. 这题是有规律的,即list[]数组. 其次,对于某个 index 可以先精确到 位数 pos,然后在进行分析. 1a #include<stdio.h> ...

  6. POJ1269+直线相交

    求相交点 /* 线段相交模板:判相交.求交点 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  7. 解决Eclipse乱码的办法

    如果在项目中,已经配置了过滤器等各种解决编码问题方法,但是始终解决不了问题,那种考虑下修改eclipse环境本身的编码问题. 在Eclipse中导入新的项目的时候,会遇到乱码的问题,而乱码的问题主要集 ...

  8. 使用phpexecel类库导出数据

    公司要求做一个功能:将数据库里的数据导出,并生成excel文件. 于是百度了下,集大牛之所长,加上自己之所长,做出了整理,并分享. 目标:使用phpexcel类库生成xml文件,并下载. 步骤一:下载 ...

  9. PCB使用技巧

    1.元器件标号自动产生或已有的元器件标号取消重来Tools 工具|Annotate…注释All Part:为所有元器件产生标号Reset Designators:撤除所有元器件标号2.单面板设置:De ...

  10. 解决VC++6.0 无法打开、无法添加工程文件

    在windows系统下,经常会遇到这样的问题:点击VC++6.0 的[文件]下的[打开]无法操作,并且无法向工程添加文件,下面详细介绍一下解决方案? 工具/原料 VC++6.0 修复工具:FileTo ...