雅礼集训2017Day2

T1

给你一个水箱,水箱里有n-1个挡板,水遵循物理定律

给你m个条件,表示第i个格子上面y+1高度的地方有或没有水

现在给你无限的水从任意地方往下倒,问最多满足多少条件

n,m 1e5

SOL:

考虑答案的表示方法,肯定是类似于dp["区间1到n"]这种的

“区间1到n”这个东西我们可以状压,就过了20%

另外10%的数据只有“有水”的条件 我们cout<<m

另外30%的n平方做法肯定是要用到dp(我没有想出来这个东西怎么搞到n平方)

。。。

这里是全知全能的XiongGod提供的一种n平方做法

对于每一个条件,可以将其视为l到r区间的最高/最低高度为x;

把所有条件记录下来后就成了区间选择问题的版题,分成上下界两种讨论dp就好了

考虑暴力碾标算

一个区间能能不能“有水”取决于中间最长的那个木板

于是可以考虑递归建一棵“线段树”

这样一个区间的问题就可以递归到左右儿子解决

且因为这是棵线段树,最多nlogn个点

然后树形DP

$d[i]$表示i节点水没有漫出去的情况

$f[i]$表示i节点水漫出去的情况

式子由于...这是要给学妹(实际只有学弟吧?)看的

所以你们自己推吧

T2

一个100*100的棋盘,有地方有障碍

Alice和Bob两个人玩游戏,Alice放一个棋子,Bob先手二人轮流移动棋子

要求:不能移到障碍上且走过的地方不能走

不能动就输了

求Alice的必胜点

SOL:

原题啊...

将棋盘黑白染色建出二分图 有障碍直接跳过就行了

考虑对于一个完美匹配,Bob(先手)按匹配边走就可以了

对于不完美的最大匹配,Alice可以把棋放在“不一定是最大匹配”的地方,让Bob走非匹配边,自己走匹配边

现在就是要考虑如何求这个“不一定是最大匹配”的点

跑完dinic,从S开始跑未满流的边,跑到左边的且非S的点就是“不一定是最大匹配”的

T开始跑未满流的边,跑到右边且非T的点就是“不一定是最大匹配的”

为什么正确可以通过交错路定理来证明一下

时间复杂度是O(您用的二分图匹配算法 + 棋盘大小)

100 + 100 + 0 = 200?

T3前30随便写可是没时间写了...

话说是不是上午时间不够啊

如果再给我半个小时就是100 + 100 + 30 = 230了(再次大众分

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. inline int read() {
  4. int x = ,f = ;
  5. char ch = getchar();
  6. for(; !isdigit(ch); ch = getchar())if(ch == '-')f = -f;
  7. for(; isdigit(ch); x = * x + ch - '',ch = getchar());
  8. return x * f;
  9. }
  10. const int maxn = 2e5 + ,inf = ;
  11. int n,m,N;
  12. int fa[maxn],bot[maxn],top[maxn],dx[maxn];
  13. int ST[][maxn];
  14. int son[maxn][];
  15. int f[maxn],d[maxn];
  16.  
  17. struct block {
  18. int h,pos;
  19. } hs[maxn];
  20. bool cmp(const block &a,const block &b) {
  21. if(a.h == b.h)return a.pos < b.pos;
  22. return a.h < b.h;
  23. }
  24. struct info {
  25. int h,type;
  26. bool operator < (const info &a)const {
  27. if(h == a.h)return type < a.type;
  28. return h < a.h;
  29. }
  30. };
  31.  
  32. std::vector<info> vec[maxn];
  33.  
  34. inline int find(int x) {
  35. return x == fa[x] ? x : fa[x] = find(fa[x]);
  36. }
  37.  
  38. int main() {
  39. int T = read();
  40. while(T--) {
  41. n = read(),m = read();
  42. N = n;
  43. memset(dx,,sizeof(dx));
  44. memset(fa,,sizeof(fa));
  45. memset(f,,sizeof(f));
  46. memset(d,,sizeof(d));
  47. int S,T,sum,sz,tmp;
  48. for(int i=; i<n; i++) {
  49. hs[i].h = read();
  50. hs[i].pos = i;
  51. }
  52. std::sort(hs + ,hs + n,cmp);
  53. bot[] = inf;
  54. for(int i=; i<=n; i++)top[i] = i,fa[i] = i;
  55. for(int i=; i<n; i++) {
  56. int fx = find(hs[i].pos),fy = find(hs[i].pos + );
  57. bot[++N] = hs[i].h;
  58. ST[][N] = ;
  59. ST[][top[fx]] = N;
  60. ST[][top[fy]] = N;
  61. son[N][] = top[fx],son[N][] = top[fy];
  62. fa[fy] = fx;
  63. top[fx] = N;
  64. }
  65. for(int i=; i<=N; i++)vec[i].clear();
  66. for(int i=; i<=; i++)
  67. for(int j=; j<=N; j++)
  68. ST[i][j]=ST[i-][ST[i-][j]];
  69. int x,y,k;
  70. for(int i=; i<=m; i++) {
  71. x = read(),y = read(),k = read();
  72. for(int j=; j>=; j--)
  73. if(bot[ST[j][x]] <= y)x = ST[j][x];
  74. vec[x].push_back((info) {y,k});
  75. dx[x] += !k;
  76. }
  77. for(int i=; i<=N; i++)std::sort(vec[i].begin(),vec[i].end());
  78. for(int i=; i<=N; i++) {
  79. if(!vec[i].empty()) {
  80. sz = vec[i].size();
  81. S = ;
  82. d[i] = sum = dx[i] + ( i > n ? f[son[i][]] + f[son[i][]] : );
  83. while(S < sz) {
  84. T = S;
  85. tmp = (vec[i][T].type ? : -);
  86. while(T + < sz && vec[i][T+].h == vec[i][T].h)
  87. ++T,tmp += (vec[i][T].type ? : -);
  88. sum += tmp;
  89. d[i] = std::max(d[i],sum);
  90. S = T + ;
  91. }
  92. f[i] = sum;
  93. }
  94. if(i > n) {
  95. d[i] = std::max(d[i],dx[i] + d[son[i][]] + d[son[i][]]);
  96. f[i] = std::max(f[i],f[son[i][]] + f[son[i][]]);
  97. }
  98. }
  99. printf("%d\n",d[N]);
  100. }
  101. }

T1(压行太严重就用了Astyle)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int _MAX = ,MAX_POINT = ,MAXE = ,inf = ;
  4. const int dx[] = {,,-,,};
  5. const int dy[] = {,,,,-};
  6. int ans[MAX_POINT];
  7. int m,n;
  8. int S = ,T = MAX_POINT - ;
  9. char s[_MAX][_MAX];
  10. int pos[_MAX][_MAX],col[MAX_POINT],vis[MAX_POINT];
  11. struct DINIC
  12. {
  13. int first[MAX_POINT],cnt;
  14. int next[MAXE],to[MAXE],caps[MAXE];
  15. int deep[MAX_POINT];
  16. DINIC(){cnt = ;}
  17. void add(int x,int y,int f)
  18. {
  19. next[++cnt] = first[x];
  20. to[cnt] = y;
  21. caps[cnt] = f;
  22. first[x] = cnt;
  23. }
  24. void insert(int x,int y,int f)
  25. {
  26. add(x,y,f);
  27. add(y,x,);
  28. }
  29. bool BFS()
  30. {
  31. queue<int> q;
  32. memset(deep,,sizeof(deep));
  33. deep[S] = ;
  34. q.push(S);
  35. while(!q.empty())
  36. {
  37. int x = q.front(); q.pop();
  38. for(int i = first[x]; i; i = next[i])
  39. if(caps[i] && !deep[to[i]])
  40. {
  41. deep[to[i]] = deep[x] + ;
  42. q.push(to[i]);
  43. if(to[i] == T) return true;
  44. }
  45. }
  46. return false;
  47. }
  48. int dfs(int x,int f)
  49. {
  50. if(x == T) return f;
  51. int temp = f;
  52. for(int i = first[x]; i; i = next[i])
  53. if(caps[i] && deep[to[i]] == deep[x] + && temp)
  54. {
  55. int w = dfs(to[i],min(caps[i],temp));
  56. if(!w) deep[to[i]] = ;
  57. caps[i] -= w;
  58. caps[i^] += w;
  59. temp -= w;
  60. }
  61. return f - temp;
  62. }
  63. }G;
  64.  
  65. int ctt;
  66. void DFS(int x,int f)
  67. {
  68. vis[x] = ;
  69. if(col[x] == f && x != S && x != T)ans[++ctt] = x;
  70. for(int i = G.first[x]; i; i = G.next[i])
  71. if(G.caps[i] == f && !vis[G.to[i]])DFS(G.to[i],f);
  72. }
  73. void solveGraph()
  74. {
  75. for(int i = ; i <= m; i++)
  76. for(int j = ; j <= n; j++)
  77. {
  78. if(s[i][j] == '#') continue;
  79. if(!((i + j)&))G.insert(S,pos[i][j],),col[pos[i][j]] = ;
  80. else
  81. {
  82. G.insert(pos[i][j],T,);
  83. continue;
  84. }
  85. for(int k = ; k <= ; k++)
  86. {
  87. int fx = i + dx[k],fy = j + dy[k];
  88. if(fx < || fy < || fx > m || fy > n) continue;
  89. if(s[fx][fy] == '.')G.insert(pos[i][j],pos[fx][fy],);
  90. }
  91. }
  92. while(G.BFS())G.dfs(S,inf);
  93. DFS(S,);memset(vis,,sizeof(vis));DFS(T,);
  94. }
  95. int main()
  96. {
  97. scanf("%d%d",&m,&n);
  98. for(int i = ; i <= m; i++)
  99. scanf("%s",s[i] + );
  100. int cnt = ;
  101. for(int i = ; i <= m; i++)
  102. for(int j = ; j <= n; j++)
  103. pos[i][j] = ++cnt;
  104. solveGraph();
  105. printf("%d\n",ctt);
  106. sort(ans + ,ans + ctt + );
  107. for(int i = ; i <= ctt; i++)printf("%d %d\n",(ans[i] - ) / n + ,(ans[i] - ) % n + );
  108. return ;
  109. }

T2

集训Day2的更多相关文章

  1. WC集训DAY2笔记 组合计数 part.1

    目录 WC集训DAY2笔记 组合计数 part.1 基础知识 组合恒等式 错排数 卡特兰数 斯特林数 伯努利数 贝尔数 调和级数 后记 补完了几天前写的东西 WC集训DAY2笔记 组合计数 part. ...

  2. 2019暑期金华集训 Day2 线性代数

    自闭集训 Day2 线性代数 高斯消元 做实数时,需要找绝对值最大的作为主元,以获取更高精度. 在欧几里得环(简单例子是模合数)意义下也是对的.比如模合数意义下可以使用辗转相除法消元. 欧几里得环:对 ...

  3. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  4. 2022寒假集训day2

    day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...

  5. 考前停课集训 Day2 非

    因为太长了 所以一天一天分开发 Day2 昨天晚上没开黑车 没脱衣服就睡了 可能是我难受了…… 新的一天. 早上好. 我没去晨跑,早上先和团长集合了,没看见rkbudlo来 于是就先吃饭了 去机房的时 ...

  6. 长沙雅礼中学集训-------------------day2

    怎么说呢,今天的题特别的神奇,因为emmmmmm,T1看不懂(一直到现在还没有理解明白期望概率什么的),T2题面看不懂+扩展欧几里得求逆元怎么求我忘了,T3哇,终于看懂一题了,然而写了个50分的程序但 ...

  7. HZNU-ACM寒假集训Day2小结 二分答案

    Day2 ---二分 这里直接给出模板 两种对应不同的情况 可以借助数轴理解 int bsearch_1(int l, int r) { while (l < r) { ; if (check( ...

  8. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  9. FJ省队集训DAY2 T2

    思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...

随机推荐

  1. HDOJ Oulipo 1686【KMP】

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. TPM:dTPM(硬件)和fTPM(固件模拟的软件模块)

    转:Bitlocker.TPM和系统安全 自从微软在Windows Vista首次引入Bitlocker以来,它已经越来越多的出现在我们的周围.尤其是企业用户,Bitlocker的保护已经变得不可缺少 ...

  3. 将C#文档注释生成.chm帮助文档(转)

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  4. Struts2学习五----------指定多个配置文件

    © 版权声明:本文为博主原创文章,转载请注明出处 指定多个配置文件 - 在Struts2配置文件中使用include可指定多个配置文件 实例 1.项目结构 2.pom.xml <project ...

  5. C语言 结构体篇

    结构体:是一种构造类型 它是由若干成员组成的 其中每一个成员都可以是一个基本数据类型或者又是一个构造类型 定义结构体变量后,系统就会为其自动分配内存 为了便于更大的程序便于修改和使用  常常将结构体类 ...

  6. 使用jquery改动表单的提交地址

    基本思路: 通过使用jquery选择器得到相应表单的jquery对象,然后使用attr方法改动相应的action 演示样例程序一: 默认情况下,该表单会提交到page_one.html 点击butto ...

  7. JAVA使用并行流(ParallelStream)时要注意的一些问题

    https://blog.csdn.net/xuxiaoyinliu/article/details/73040808

  8. 相机标准之onvif---开放型网络视频接口论坛onvif 简介

    什么是ONVIF ? ONVIF:原意为 开放型网络视频接口论坛,即 Open Network Video Interface Forum ,是安讯士.博世.索尼等三家公司在2008年共同成立的一个国 ...

  9. js异步请求发展史和yield

    万恶的回调 对前端工程师来说,异步回调是再熟悉不过了,浏览器中的各种交互逻辑都是通过事件回调实现的,前端逻辑越来越复杂,导致回调函数越来越多,同时 nodejs 的流行也让 javascript 在后 ...

  10. Linq Group By 多个字段

    var counts = dal.QueryStatisticsCount(condition); var result = from p in counts group p by new { Auc ...