题意

题目链接

Sol

\(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\)

然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答案

转移的时候用总的方案减去相同颜色的方案

复杂度\(O(n^2 log^2 n)\)

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1001, INF = 1e9 + 10, mod = 1000000007, SS = MAXN * MAXN * 10;
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int add(int x, int y) {if(x + y < 0) return x + y + mod;return x + y >= mod ? x + y - mod : x + y;
}
int N, M, K, c[MAXN][MAXN], f[MAXN][MAXN], tot;
int root[SS], ls[SS], rs[SS], sum[SS];
void IntAdd(int &k, int l, int r, int pos, int val) {if(!k) k = ++tot;sum[k] = add(sum[k], val);if(l == r) return ;int mid = l + r >> 1;if(pos <= mid) IntAdd(ls[k], l, mid, pos, val);else IntAdd(rs[k], mid + 1, r, pos, val);
}
int Query(int k, int l, int r, int ll, int rr) {if(!k) return 0;if(ll <= l && r <= rr) return sum[k];int mid = l + r >> 1;if(ll > mid) return Query(rs[k], mid + 1, r, ll, rr);else if(rr <= mid) return Query(ls[k], l, mid, ll, rr);else return add(Query(ls[k], l, mid, ll, rr), Query(rs[k], mid + 1, r, ll, rr));
}
signed main() {N = read(); M = read(); K = read();f[1][1] = 1;for(int i = 1; i <= N; i++) {for(int j = 1; j <= M; j++) {int k = read(); c[i][j] = k;if(!f[i][j]) f[i][j] = add(Query(root[0], 1, M, 1, j - 1), -Query(root[k], 1, M, 1, j - 1));}for(int j = 1; j <= M; j++)IntAdd(root[0], 1, M, j, f[i][j]),IntAdd(root[c[i][j]], 1, M, j, f[i][j]);}cout << f[N][M];return 0;
}

转载于:https://www.cnblogs.com/zwfymqz/p/10216215.html

洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)相关推荐

  1. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  2. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  3. 动态开点线段树(多棵线段树)的内存分配与回收

    前言 线段树,是一个很好用的能支持O(logn)区间操作的数据结构,随着做一些稍微烦一点的题,有时候会发现有些情况要开一个数组的线段树,更有甚者要树套树,而在很多情况下线段树就不能把所有点都开满了(否 ...

  4. CF1045G AI robots(动态开点线段树)

    题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...

  5. NOIP2017 列队——动态开点线段树

    Description: Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为  ...

  6. codeforces 915E - Physical Education Lessons 动态开点线段树

    题意: 最大$10^9$的区间, $3*10^5$次区间修改,每次操作后求整个区间的和 题解: 裸的动态开点线段树,计算清楚数据范围是关键... 经过尝试 $2*10^7$会$MLE$ $10^7$会 ...

  7. HDU 6681 Rikka with Cake(扫描线、动态开点线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6681 题意 在矩形区域内有k条射线,问这些射线将矩形分成了多少区域 题解 容易发现答案为所有射线交点个数+1. ...

  8. P3157 动态逆序对 ,树状数组套动态开点线段树

    题目 洛谷题目链接 题解 在求整体的逆序对的数量时,很好办,直接用树状数组处理即可,不过在这时,我们还需要处理出一个数组pa[]pa[]pa[],其中pa[i]pa[i]pa[i]代表在区间[1,i) ...

  9. 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)

    题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi​,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...

最新文章

  1. 麦肯锡顾问深度工作安排:将工作可视化
  2. 【收藏清单】AI学习资料汇总——你想要的AI资源,这里都有
  3. 全球通吃5G!高通发布最新骁龙865、7系芯片,小米、OPPO将实现首发
  4. tensorflow随笔-tensorflow版本号
  5. OpenGL基本窗口和OpenGL 初始化
  6. 五、Kafka 用户日志上报实时统计之应用概述
  7. 使用vue实现自定义搜索功能
  8. template 标签
  9. kindle刷机ttl_求助大神!现在KPW2只能在TTL下进入uboot
  10. mysql循环遍历获取_mysql存储过程之循环遍历查询结果集
  11. 基于物联网的工业分析将席卷制造业
  12. PHP-redis中文帮助手册_set相关
  13. linux mint自动登录,Linux Mint 19.2新功能/新特性介绍,包含Cinnamon、MATE、Xfce版本
  14. 超详细图文教程,阿里云服务器搭建
  15. IOS 中json解析异常Domain=NSCocoaErrorDomain Code=3840之诡异事件
  16. pygame游戏之旅2:创建游戏窗口界面
  17. 蓝桥杯 我们的征途是星辰大海
  18. 怎样成为“吃鸡”沙漠霸主?掌握资源点是关键
  19. Hive查询问题(卡住)
  20. java 解密pdf_Java 加密和解密 PDF

热门文章

  1. iperf3怎么看结果_网速测试利器-iperf3
  2. Git 学习札记(二)安装git以及基本操作
  3. 【从零开始的Java开发】2-9-3 油画商城静态网页案例
  4. 浅谈JavaScript和Canvas实现彩色图片转换成黑白图片
  5. 微信如何置顶文字?原来方法这么简单,1分钟就搞定了
  6. tSNE-python代码实现及使用讲解
  7. mysql 闪存,高性能MySQL:什么时候应该使用闪存
  8. YHL--------------------------------------------------人生路规划
  9. 常用软件的包名和startAcitivity名
  10. IPV6的路由协议(基础)、ipv6和ipv4的共存、DHCPv6