T1

Description

  • 给出一个\(N*N(N≤600)\)的非负矩阵\(B=(b_{ij})\),和一个\(1*N\)的非负矩阵\(C=(c_{ij})\)。\(A=(a_{ij})\)是一个\(1*N\)的\(01\)矩阵,令矩阵\(D=(d_{ij}) (A*B-C)*A^T\),则\(D\)是一个\(1*1\)的矩阵。要求构造\(A\)矩阵最大化\(D\)矩阵的元素值,输出得到的\(D\)矩阵。

    Solution

  • 化下式子就知道答案为:\(\sum_{i=1}^n A_i[(\sum_{j=1}^n A_jB_{ij})-C_i]\)。
  • 这样的话,可以想象有一张\(N\)个点的完全图,第\(i\)个点的点权为\(C_i\),边\(<i,j>\)的权为\(B_{ij}\)。那问题就转化为在这张图上找一个子图,使得子图内边权和减点权和最大。
  • 可以yy成一种神奇的二元关系,然后转化为最小割模型。这里提供一种建图:对于点\(i\),我们从源点\(S\)向它连一条容量为\(\sum_{j=1}^n B_{ij}\)的边,从它向汇点\(T\)连一条容量为\(C_i\)的边;然后对于一个点对\(i≠j\),从\(i\)向\(j\)连一条容量为\(B_{ij}\)的边。这样用\(\sum B\)减去最小割即为答案。
  • 上述建图法的正确性是比较显然的。我们假设一开始全选,\(ans=\sum B\);然后考虑选点\(i\)的代价是\(C_i\)(即让\(ans-=C_i\)),不选点\(i\)的代价是\(\sum_{j可不选} B_{ij}+\sum_{j必选}B_{ji}\)。显然这种代价和即为答案。实际上,我们只要建出一个满足这些代价的图即可(因而有无数种建图方法)。

    Code

#include <cstdio>
#include <algorithm>
#define min(x,y) (x<y?x:y)
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;const int N=666,M=2*N*N,inf=0x7fffffff;
int n,S,T,x,oub[N],la[N],ans,cur[N],dis[N],GAP[N];
struct edge{int v,l,ne;}e[M];void link(int x,int y,int z)
{static int tot=1;e[++tot]=(edge){y,z,la[x]}, la[x]=tot;e[++tot]=(edge){x,0,la[y]}, la[y]=tot;
}int flow(int x,int res)
{if(x==T) return res;int i,have=0;for(i=cur[x]; i; i=e[i].ne)if(e[i].l&&dis[x]==dis[e[i].v]+1){cur[x]=i;int now=flow(e[i].v,min(res-have,e[i].l));e[i].l-=now, e[i^1].l+=now;if((have+=now)==res) return have;}cur[x]=la[x];if(!--GAP[dis[x]]) dis[S]=T+1;GAP[++dis[x]]++;return have;
}int main()
{scanf("%d",&n), T=n+1;fo(i,1,n) fo(j,1,n){scanf("%d",&x), oub[i]+=x, ans+=x;if(i^j) link(i,j,x);}fo(i,1,n) link(S,i,oub[i]), scanf("%d",&x), link(i,T,x);GAP[0]=T+1;while(dis[S]<=T) ans-=flow(S,inf);printf("%d",ans);
}

T2

Description

  • 一个平面直角坐标系上,有\(N(≤7000)\)个点,标号为1到N,其中第i个点的坐标为(x[i], y[i])。   
  • 求满足以下两个条件的点列{p[i]}的数目(假设{p[i]}的长度为M):   
    1) 对任意1 <= i < j <= M,必有y[p[i]] > y[p[j]];   
    2) 对任意3 <= i <= M,必有x[p[i-1]] < x[p[i]] < x[p[i-2]]或者x[p[i-2]] < x[p[i]] < x[p[i-1]]。   
  • 求满足条件的非空序列{p[i]}的数目,结果对一个整数\(Q(\in[1,1000000000])\)取模。

    Solution

  • 一道灵光一闪后就是普及难度的题目。
  • 可以先将点按x坐标排序,然后DP。设f[i][0/1]表示考虑到第i个点,它的下一个点在它左边/右边的答案。那我们可以从小到大枚举i,再从i-1到1枚举一个j,比较y[i]和y[j],若y[i]<y[j]则用f[i][0]转移f[j][1],否则用f[j][1]转移f[i][0]。
  • 画个图就很明了了。由于我们一定是从y小的转移向y大的,所以是没有后效性的;而且由于我们按x坐标排了序,在用一个f转移前,已经考虑完了中间的(比如用f[i][0]转移f[j][1],我们已经考虑完了所有j<j'<i的f[j'][1]对f[i][0]的贡献了),因而也是正确的。
  • 时间复杂度\(O(n^2)\)。

    Code

#include <cstdio>
#include <algorithm>
#define P(x,y) (x+=y)%=Q
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;const int N=7010;
int n,Q,f[N][2],ans;
struct dot{int x,y;}p[N];bool cmp(const dot&a,const dot&b) {return a.x<b.x;}int main()
{scanf("%d%d",&n,&Q);fo(i,1,n) scanf("%d%d",&p[i].x,&p[i].y);sort(p+1,p+n+1,cmp);fo(i,1,n){f[i][0]=f[i][1]=1;fd(j,i-1,1) p[j].y>p[i].y ? P(f[j][1],f[i][0]) : P(f[i][0],f[j][1]);}fo(i,1,n) P(ans,f[i][0]), P(ans,f[i][1]);printf("%d",(ans-n+Q)%Q);
}

T3

Description

  • 给出一棵\(N(≤100000)\)个带权点的有根树,每个点的孩子是从左到右有序的。一棵树的价值为所有叶节点的权值和减去每对相邻叶节点的路径上(不含那两个叶节点)的最大点权值。剪枝的本质是将某些结点的子树全部删去,使自己作为新的叶结点。
  • 对树进行一些剪枝,使树的价值最大。剪枝的方式为:如果一个结点的孩子都是叶结点,就可以将它所有的孩子剪去。

    Solution

  • 也是一道水题。。。没切真是耻辱
  • 记lc(x)为从x出发,沿最左节点走下去形成的链,称为左链;rc(x)为右链。那每次肯定是有一对相邻的兄弟节点u、v,用一个rc(u)的答案更新lc(v)的答案。(当然反过来也可以,因为把整棵树左右翻转后的答案是不变的)
  • 暴力转移即可,因为一个点至多只会在一条左链和一条右链上,因此是\(O(n)\)的。
  • 转移时用一个单调队列优化一下。

    Code

#include <cstdio>
#define max(x,y) (x>y?x:y)
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;const int N=11e4,inf=0x3f3f3f3f;
int n,w[N],t,p,pa[N],tot,to[N],ne[N],la[N],ls[N],rs[N],f[N],top,h[N],m[N],h1[N],h2[N],ans;void work(int x,int y)
{h1[0]=-inf;for(top=0; x; x=rs[x]){h[++top]=x;m[top+1]=max(m[top],w[x]);h1[top]=max(h1[top-1],f[x]);h2[top]=f[x]-m[top];}h2[top+1]=-inf;fd(i,top,1) if(h2[i]<h2[i+1]) h2[i]=h2[i+1];for(int k=0,d=m[1]; y; y=ls[y]){while(k<top&&d>m[k+1]) k++;f[y]=w[y]+max(h1[k]-d,h2[k+1]);if(d<w[y]) d=w[y];}
}void dfs(int x,bool l,bool r)
{int ly=0;for(int i=la[x],y; y=to[i]; ly=y,i=ne[i]) {if(ly) m[1]=w[x],work(ly,y);dfs(y,l&&!ly,r&&rs[x]==y);}if(l&&f[x]<w[x]) f[x]=w[x];if(r&&f[x]>ans) ans=f[x];
}int main()
{scanf("%d",&n);fo(i,1,n){scanf("%d%d",&w[i],&t);fo(j,1,t){scanf("%d",&p);to[++tot]=p, ne[tot]=la[i], la[pa[p]=i]=tot;if(j==1) rs[i]=p;if(j==t) ls[i]=p;}f[i]=-inf;}dfs(1,1,1);printf("%d",ans);
}

转载于:https://www.cnblogs.com/Iking123/p/11347964.html

【纪中集训】2019.08.13【省选组】模拟3相关推荐

  1. 纪中集训2020.01.13【NOIP普及组】模拟赛C组总结————My First Time Write Summary

    纪中集训2020.01.13[NOIP普及组]模拟赛C组总结 题目编号 标题 0 [NOIP普及组模拟]取值( numbers.pas/cpp) 1 [NOIP普及组模拟]数对(pairs.pas/c ...

  2. 【纪中集训2019.3.25】芬威克树

    题目 描述 ​ ​ 第一段代码正确第用\(k\)进制\(BIT\)维护了前缀和: ​ 第二段代码由于写错了\(line \ 4\),所以意义发生了改变: ​ 维护第二段代码执行\(ADD(x,v)\) ...

  3. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  4. 【纪中集训2019.3.20】铁路

    题意 描述 现在有一颗树形状的双向铁路,每条边的行驶时间是\(1\): 给出\(m\)条列车行驶的路径\(s_{i}\to t_{i}\),问列车相遇的对数(无序对): \(i和j\)号列车相遇当且仅 ...

  5. 【纪中集训2019.3.26】动态半平面交

    题目 描述 : 给出强制在线参数\(k\),树的大小\(n\),和每个点的点权\(a_i\); 有\(m\)个询问,每个询问是$u ,d $ 的形式: 表示询问\(u\)为根的子树中,和\(u\)的距 ...

  6. 【纪中集训2019.3.30】星辰大海

    题目 描述 ​ 有\(n\)个点\(p_1 ,p_2 , \cdots ,\,p_n\) : ​ 现在\(p_1\)不见了,可能的横纵坐标范围是\([-10^6,10^6]\): ​ 同时需要保证每三 ...

  7. 【纪中集训2019.3.15】恶熊咆哮

    题目 描述 有\(n\)只熊,初始时坐标为\((x_i,y_i)\): 这些熊会按照标号依次吼叫,当第\(i\)只熊吼叫,其他熊会移动: \((x_i,y_i)\)会移动到\((x_i \pm 1,y ...

  8. 2019寒假纪中集训总结学期总结(流水账)

    学期总结 这学期上了初三,学校的初.高中校区对调,我们的班主任也由一个生物老师换成了一个化学老师. 之前的班主任比较年轻,跟我们这群学生有这很好的感情,亦师亦友,陪伴我们度过了几乎没有中考压力的初一. ...

  9. [2021.8纪中集训Day14]

    文章目录 1312. 老曹的忧郁 题目 思路 代码 1313. 老曹骑士 题目 思路 代码 1314. 稳定的数字 题目 思路 代码 封锁阳光大学 题目 题目描述 输入格式 输出格式 输入输出样例 说 ...

  10. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

最新文章

  1. Linux系统程序包管理工具 RPM
  2. SQL Server 2008, 2008 R2, 2012 and 2014 完全支持TLS1.2加密传输
  3. C++库文件导出可见性
  4. HDU 2993 MAX Average Problem(斜率优化DP)
  5. 嵌入式开发中关键字_IO 和 volatile的用法
  6. mac svn工具_Cornerstone 4 for mac(svn管理工具)
  7. 分析影响流媒体服务器性能的硬件瓶颈
  8. Linux 技巧: 从命令行创建像素标尺
  9. 借助mapshaper的简化来修复geojson的拓扑错误
  10. 如何加密PDF文件?多种实用方法介绍
  11. JavaWeb教程———Ajax
  12. java jframe 图标_java怎么修改jframe图标?
  13. html图片轮播效果加链接,HTML首页怎么加图片轮播?
  14. [CSDN] 微软雅黑可能导致的博客侵权问题
  15. 360视频简介及ERP投影
  16. 华为云D-Plan解决方案为企业数智升级注入AI新动力
  17. 我的世界服务器无限刷东西指令,我的世界无限刷物品命令方块指令 | 手游网游页游攻略大全...
  18. 怎么选择触摸液晶广告机?
  19. H3C CAS 5.0 虚拟机备份与还原
  20. 安装Office 2016 出现 Office 16 Click-to-Run Extensibility Component

热门文章

  1. 让OpenShift Serivce Mesh自动对服务注入sidecar
  2. 如何使用泛型在新的可空上下文中启动健壮的C#项目?
  3. (八)构建一个Docker容器来训练Deep Fake Autoencoders
  4. 深度学习框架 TensorFlow.NET 0.1.0,完善变量更新操作
  5. js 滚动条自动滚动到最底部
  6. input file 上传图片时,文件格式限制
  7. 用 js判断 一个数是否是素数(质数)_小学五年级下册数学公式打印版,孩子寒假预习用的上!...
  8. 分布式系统原理_终于有架构大牛把分布式系统概念讲明白了,竟然用了足足800页...
  9. dmz区服务器系统激活,dmz主机搭建服务器
  10. php 通讯协议,通讯协议作用