开考前刚起床,所以一边考一边吃饭,然后整场都很迷。。。

A. u

考场

半天才搞懂“下三角区域”指哪个区域,手模样例确认后打了 \(O(qn^2)\) 的裸暴力,然后就不会做了。

看数据范围猜一下正解复杂度是 \(O(qlogn^2)\),开O2的话也许能卡过 \(O(qlog^2n)\),于是往线段树上想,后看到初始值为0,求最终矩阵的元素异或和,又开始想Trie树,30min后决定放弃。延续线段树的思路,把三角形拆到每一行,建 \(n\) 棵树状数组维护。大概10min就码完了。感觉的确和 hhy 在实中模拟赛时说的:“就像背课文一样”,于是失去了智力,写了树状数组单点修改、求区间最值都没想到差分(只有最后的一次询问。拆到行上差分可以做到 \(O(qn)\))。最后挂了对拍就没再管。

得分

期望:\(O(qnlogn)\) 47pts

实际:数据不保证三角形在矩阵范围内(但我的对拍保证了),RE到20pts

正解

二维差分。

用一个左上到右下的二维数组维护三角形要加的 \(s\),这样从 s[i][j]+=s[i-1][j-1] 就能推出每一列上要加的数,再从上到下递推就能解决Subtask5。剩下的部分容斥或开一个从左到右的差分数组消掉多加的 \(s\) 即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int N = 2e3 + 1;
  5. int n,q;
  6. LL a[N][N],b[N][N];
  7. LL c[N][N],ans;
  8. int main() {
  9. ios::sync_with_stdio(false);cin.tie(0);
  10. cin>>n>>q;
  11. while( q-- ) {
  12. int r,c,l,s;
  13. cin>>r>>c>>l>>s;
  14. a[r][c] += s, a[r+l][c+l] -= s;
  15. b[r+l][c] -= s, b[r+l][c+l] += s;
  16. }
  17. for(int i = 1; i <= n; ++i)
  18. for(int j = 1; j <= n; ++j)
  19. a[i][j] += a[i-1][j-1], b[i][j] += b[i][j-1];
  20. for(int i = 1; i <= n; ++i)
  21. for(int j = 1; j <= n; ++j)
  22. c[i][j] = c[i-1][j] + a[i][j] + b[i][j], ans ^= c[i][j];
  23. cout<<ans;
  24. return 0;
  25. }

B. v

考场

看到期望就头疼,更别提加上状压了。

直接开始写暴力。先枚举 \(x\) ,再状压dp出最优决策。

其实dp的写法比较接近正解,但时间复杂度似乎和暴力差不多。。。

Subtask3&4可以骗分。

得分

\(O(C_n^k2^n)\)

22pts

正解

大力深搜

需要吸氧。(这次给c++11和O2)

  1. #include <cstdio>
  2. #include <map>
  3. using namespace std;
  4. #define RI register int
  5. const int MX = 1 << 25;
  6. int n,m;
  7. int st;
  8. double f[MX|1];
  9. map<int,double> g;
  10. // 记忆化小数用int,大数map(卡常)。注意int数组大小
  11. #define del(u,p) (((u>>1) & (~((1<<(p-1))-1))) | (u & ((1<<(p-1))-1)))
  12. /*
  13. O(1)删去u中第p位
  14. u & ((1<<(p-1))-1)):取出前p-1位
  15. ((u>>1) & (~((1<<(p-1))-1)):u>>1后取p位及以后
  16. */
  17. #define w(u,p) ((u & (1<<(p-1))) ? 1 : 0)
  18. // 计算u中第p位是否是白球
  19. double dfs(int k, int u) { // 剩余操作k次,当前状态u
  20. if( !k ) return 0;
  21. if( u <= MX && f[u] != -1 ) return f[u];
  22. if( g.find(u) != g.end() ) return g[u];
  23. RI kk = n - (m - k);
  24. double res = 0;
  25. for(RI i = 1; i <= kk>>1; ++i) // 利用对称性剪掉一半的枝
  26. res += max(dfs(k-1, del(u,i))+w(u,i), dfs(k-1, del(u,kk-i+1))+w(u,kk-i+1)) * 2;
  27. if( kk & 1 ) res += dfs(k-1, del(u,(kk>>1)+1)) + w(u,(kk>>1)+1); // for中无法计算kk为奇数时的中位数
  28. res /= kk;
  29. if( u <= MX ) f[u] = res;
  30. else g[u] = res;
  31. return res;
  32. }
  33. int main() {
  34. scanf("%d%d",&n,&m);
  35. for(RI i = 0; i < n; ++i) {
  36. char ch = getchar();
  37. while(ch!='W'&&ch!='B')ch=getchar();
  38. if( ch == 'W' ) st |= 1<<i;
  39. }
  40. st |= 1<<n;
  41. /*
  42. int中高位0会被忽略,但本题中会造成记忆化出错。
  43. 如010和0010在int中一样,但本题中代表剩余球的状态不同。
  44. 因此在最高位的下一位补一个1,这样就变成了1010和10010。
  45. */
  46. for(RI i = 0; i <= MX; ++i) f[i] = -1;
  47. printf("%.9lf",dfs(m,st));
  48. return 0;
  49. }

C. w

考场

一点思路都没有

但前两题双爆炸所以不想放弃这个题。想了近1h发现的性质,只有一个是有用的:每条边至多翻一次。先后想到了树剖、树上差分(然而并没有想起T1可差分)、树形dp。

最后还是写了骗分,链上的贪心没有写完。

正解

树形dp。状态比较新颖:除了以u为根的子树,还要保存u与fa连边的状态

由于以操作数、路径长度为关键字求最小,pair就很方便。

操作数为所选路径的集合中,奇数度点的个数的一半。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MP(x,y) make_pair(x,y)
  4. typedef pair<int,int> PII;
  5. const PII inf = MP(0x3f3f3f3f,0x3f3f3f3f);
  6. const int N = 1e5 + 1;
  7. PII operator+(PII a, PII b) { return MP(a.first+b.first,a.second+b.second); }
  8. int n,head[N],to[N<<1],w[N<<1],nxt[N<<1];
  9. PII f[N][2]; // f[u][0/1]: u是否翻转到父亲的边,得到的奇数度的点的个数最小值,以及边的个数(路径长度和)
  10. inline void adde(int x, int y, int z, int mm) {
  11. to[mm] = y, w[mm] = z;
  12. nxt[mm] = head[x], head[x] = mm;
  13. }
  14. void dfs(int fa, int u, int op) {
  15. PII x = inf, y = MP(0,0); // x: u的儿子有一条翻到u; y: 没有
  16. for(int i = head[u]; i; i = nxt[i]) {
  17. int v = to[i];
  18. if( v == fa ) continue;
  19. dfs(u, v, w[i]);
  20. PII xx = min(x+f[v][0], y+f[v][1]), yy = min(x+f[v][1], y+f[v][0]); // 按定义更新x,y
  21. x = xx, y = yy;
  22. }
  23. if( op == 1 ) f[u][0] = inf; // 一定翻
  24. else f[u][0] = min(MP(x.first+1,x.second),y);
  25. // u与儿子的一条连边翻则u为一个新的奇数度点
  26. if( !op ) f[u][1] = inf; // 一定不翻
  27. else f[u][1] = min(MP(x.first,x.second+1), MP(y.first+1,y.second+1));
  28. // 从儿子伸过来:奇数度点数不变,路径长度+1
  29. // 新开:操作数+1,路径长度+1
  30. }
  31. int main() {
  32. scanf("%d",&n);
  33. for(int i = 1; i < n; ++i) {
  34. int a,b,c,d;
  35. scanf("%d%d%d%d",&a,&b,&c,&d);
  36. c = d==2 ? -1 : c^d; // -1/0/1:不管/不翻/翻
  37. adde(a, b, c, i<<1), adde(b, a, c, i<<1|1);
  38. }
  39. dfs(0, 1, 2);
  40. printf("%d %d",f[1][0].first>>1,f[1][0].second);
  41. return 0;
  42. }

20201219 u,v,w的更多相关文章

  1. 9.27 csp-s模拟测试53 u+v+w

    T1 u 拿到题感觉他很水,但到死没想到正解,只会骗部分分(我太弱了) 考虑用两个差分数组维护,不同的是最后更新答案是$a[i][j]+=a[i-1][j-1]$,首先考虑在斜着加的起点,就是竖着的直 ...

  2. MT【330】u,v,w法

    已知$a^2+b^2+c^2=1$求$abc(a+b+c)$的最小值.(2018辽宁预赛解答压轴题) 不妨设$a+b+c=3u,ab+bc+ca=3v^2,abc=w^3$,令$u^2=tv^2$要求 ...

  3. 偏流角为什么是arcsin(w/V)

    偏流角为什么是arcsin(w/V) 2015-10-22 风螺旋线   回答这个问题要从速度三角形说起(需要了解一点三角函数,但很基础,不用担心). 传统的速度三角形如下图所示: (背一段书) DA ...

  4. _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

    #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...

  5. XIII Open Cup named after E.V. Pankratiev. GP of America

    A. Explosions 注意到将炸弹按坐标排序后,每个炸弹直接引爆和间接引爆的都是连续的一段区间,因此只需要求出每个炸弹能间接炸到的最左和最右的炸弹即可. 建立图论模型,炸弹$i$向炸弹$j$连单 ...

  6. Light OJ 1019 - Brush (V)(图论-dijkstra)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1019 题目大意:Tanvir想从节点1的位置走到节点n的位置, 输出最短距离, ...

  7. XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix

    A. Accommodation Plan 对于已知的$K$个点,离它们距离都不超过$L$的点在树上是一个连通块,考虑在每种方案对应的离$1$最近的点统计. 即对于每个点$x$,统计离它距离不超过$L ...

  8. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof

    A. City Wall 找规律. #include<stdio.h> #include<iostream> #include<string.h> #include ...

  9. XV Open Cup named after E.V. Pankratiev. GP of Central Europe (AMPPZ-2014)--B.Petrol

    多源最短路+并查集 #include <bits/stdc++.h> using namespace std; #define rep(i, j, k) for (int i = int( ...

随机推荐

  1. SuperEdge 高可用云边隧道有哪些特点?

    作者 作者李腾飞,腾讯容器技术研发工程师,腾讯云TKE后台研发,SuperEdge核心开发成员. 背景 在边缘集群中,边缘端和云端为单向网络,云端无法主动连接边缘端,常见的解决方案是边缘端主动和云端( ...

  2. Ubuntu开启SSH端口并且搭建Vulhub环境

    1.下载好ubuntu.开启SSH: * sudo apt update * sudo apt install openssh-server * sudo systemctl status ssh 用 ...

  3. Docker入门第五章

    常用其他命令 后台启动容器 #命令 docker run -d 镜像名! [root@lvshihao /]# docker run -d centos 757173133e8e73985f024dc ...

  4. Redis缓存哪些事儿

    一提到Redis缓存,我们不得不了解的三个问题就是:缓存雪崩.缓存击穿和缓存穿透.这三个问题一旦发生,会导致大量的请求直接请求到数据库层.如果并发压力大,就会导致数据库崩溃.那p0级的故障是没跑了. ...

  5. 十进制转十六进制 BASIC-10

    十进制转十六进制 import java.util.Scanner; public class 十进制转十六进制 { /* 十六进制数是在程序设计时经常要使用到的一种整数的表示方式. * 它有0,1, ...

  6. HttpClient执行post请求

    public class Httpclient_post { private ResourceBundle bundle; private String url; private BasicCooki ...

  7. ApiPost进阶教程(1) — 在ApiPost中使用脚本

    什么是APIPOST脚本 APIPOST脚本是基于JavaScript语言的代码片段,可实现在接口请求或集合测试时添加动态行为. 脚本可实现的功能 测试(断言)请求返回结果的正确性(后置脚本). 动态 ...

  8. 网关服务Kong和konga介绍安装使用教程

    介绍 Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用.易扩展的,由Mashape公司开源的API Gateway项目.Kong是基于NGINX和Apache Cassa ...

  9. mongoose报错:DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead

    参考:mongoose报错:DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead mo ...

  10. 从0开始搭建一个IoC容器(C#版)

    网址:https://blog.csdn.net/wangyahua1234/article/details/100619695 目录 1. IoC简介 2. Tiny版IoC的功能 3. Tiny版 ...