【2018.10.22】图图的游戏 / 图图的设计 / 图图的旅行

题目

我是一个小沙比,爆零本领强~

T1

看起来是一道很捞的、做过无数遍的区间最大值。

直接$O(n^3)$做一做就完了……

具体做法就是预处理每行的前缀和,然后二重循环枚举一个固定的列区间,再用单调队列的思想,从第一行不停向下扩展行区间,如果矩阵内总和$\gt k$ 了就从行区间顶部不停删行,删到矩阵内总和$\le k$ 为止。每当矩阵总和满足限制时,更新矩阵面积最大值即可。

当然如果你很想大战$T1$的话,可以写个$O(n^2*log(n^2))$的主席树?

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define N 501
 8 using namespace std;
 9 inline int read(){
10     int x=0; bool f=1; char c=getchar();
11     for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=0;
12     for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^‘0‘);
13     if(f) return x;
14     return 0-x;
15 }
16 int n,m,e[N][N],sum[N][N],x,ans;
17 int main(){
18     n=read()+1,m=read();
19     int i,j,k,go;
20     for(i=1;i^n;++i)
21         for(j=1;j^n;++j)
22             sum[i][j]=sum[i][j-1]+read();
23     for(i=1;i^n;++i){
24         for(j=i;j^n;++j){
25             x=0, go=1;
26             for(k=1;k^n;++k){
27                 x+=sum[k][j]-sum[k][i-1];
28                 while(x>m) x-=sum[go][j]-sum[go][i-1], ++go;
29                 ans=max(ans,(j-i+1)*(k-go+1));
30             }
31         }
32     }
33     printf("%d\n",ans);
34     return 0;
35 }

T2

这是一道考验水平的$dp$题(机房最高分$70$)

0~30pts:

你写的开心就好

40~50pts:

不知道

60~90pts:

由于是一条链,所以可以考虑链上$dp$,从前往后推。

设$f(i)$为从根到$i$号节点中,让每个点都得到补给所需的总代价的最小值。

易推$f(i)=$\min\{f(j-1)+$

100pts:

这个dp有点新式……

设$f(i,j)$为以$i$号节点为根的子树中,离点$i$最近的机场设在了节点$j$时,子树中所有点都得到补给所需的总代价的最小值。

然后转移是这样的

T3

  1 #include<bits/stdc++.h>
  2 #define ll long long
  3 #define N 152505
  4 const ll inf=1ll<<62;
  5 using namespace std;
  6 inline int read(){
  7     int x=0; bool f=1; char c=getchar();
  8     for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=0;
  9     for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^‘0‘);
 10     if(f) return x;
 11     return 0-x;
 12 }
 13 int n,s,t,x[N],y[N],z[N],l[N],r[N];
 14 int root,L,R,u; ll Dis;
 15 struct SegTree{
 16     struct T{
 17         int son[2];
 18         ll dis,tag; //min,max
 19         bool del;
 20     }tr[N<<3];
 21     int cnt;
 22     inline void pushup(int o){
 23         tr[o].dis = min(tr[tr[o].son[0]].dis, tr[tr[o].son[1]].dis);
 24         //printf("pushup:%lld %lld\n",tr[tr[o].son[0]].dis, tr[tr[o].son[1]].dis);
 25     }
 26     inline void pushdel(int o){
 27         tr[o].del = tr[tr[o].son[0]].del & tr[tr[o].son[1]].del;
 28     }
 29     void build(int &o,int l,int r){
 30         o=++cnt;
 31         tr[o].tag=inf, tr[o].del=0;
 32         if(l==r){tr[o].dis=inf; tr[o].son[0]=tr[o].son[1]=0; return;}
 33         int mid=(l+r)>>1;
 34         build(tr[o].son[0],l,mid), build(tr[o].son[1],mid+1,r);
 35         pushup(o);
 36     }
 37     inline void pushdown(int o){
 38         if(tr[o].tag<inf){
 39             int lc=tr[o].son[0], rc=tr[o].son[1];
 40             if(!tr[lc].del) tr[lc].dis=min(tr[lc].dis,tr[o].tag), tr[lc].tag=min(tr[lc].tag,tr[o].tag);
 41             if(!tr[rc].del) tr[rc].dis=min(tr[rc].dis,tr[o].tag), tr[rc].tag=min(tr[rc].tag,tr[o].tag);
 42             tr[o].tag=inf;
 43         }
 44     }
 45     void update(int o,int l,int r){
 46         if(tr[o].del) return;
 47         if(L<=l && r<=R){
 48             tr[o].dis=min(tr[o].dis,Dis), tr[o].tag=min(tr[o].tag,Dis);
 49             return;
 50         }
 51         pushdown(o);
 52         int mid=(l+r)>>1;
 53         if(L<=mid) update(tr[o].son[0],l,mid);
 54         if(R>mid) update(tr[o].son[1],mid+1,r);
 55         pushup(o);
 56     }
 57     void Delete(int o,int l,int r){
 58         if(l==r){tr[o].dis=inf; tr[o].del=1; return;}
 59         pushdown(o);
 60         int mid=(l+r)>>1;
 61         if(u<=mid) Delete(tr[o].son[0],l,mid);
 62         else Delete(tr[o].son[1],mid+1,r);
 63         //printf("Delete:%d %d %lld\n",l,r,tr[o].dis);
 64         pushup(o); //printf("Delete:%d %d %lld\n",l,r,tr[o].dis);
 65         pushdel(o);
 66     }
 67     void query(int o,int l,int r){ //查询最小值的最小下标
 68         //printf("query:%d %d %lld\n",l,r,tr[o].dis);
 69         if(l==r){u=l, Dis=tr[o].dis; return;}
 70         pushdown(o);
 71         int mid=(l+r)>>1;
 72         //printf("query:%d %d %lld %lld %lld\n",l,r,tr[o].dis,tr[tr[o].son[0]].dis,tr[tr[o].son[1]].dis);
 73         if(tr[o].dis==tr[tr[o].son[0]].dis && !tr[tr[o].son[0]].del) query(tr[o].son[0],l,mid);
 74         else if(tr[o].dis==tr[tr[o].son[1]].dis && !tr[tr[o].son[1]].del) query(tr[o].son[1],mid+1,r);
 75     }
 76 }S;
 77 ll ans[N];
 78 void Dij(){
 79     L=R=s, Dis=0;
 80     S.cnt=0;
 81     S.update(root,1,n);
 82     int i;
 83     for(int i=1;i<=n;++i){
 84         S.query(root,1,n);
 85         ans[u]=Dis;
 86         //printf("%d %lld %d %d\n",u,ans[u],l[u],r[u]);
 87         if(u==t) break;
 88         Dis+=z[u];
 89         L=l[u],R=r[u];
 90         S.update(root,1,n);
 91         S.Delete(root,1,n);
 92     }
 93 }
 94 int main(){
 95     //freopen("trip9.in","r",stdin);
 96     //freopen("trip.out","w",stdout);
 97     n=read(),s=read(),t=read();
 98     int i;
 99     for(i=1;i<=n;++i) x[i]=read();
100     for(i=1;i<=n;++i) y[i]=read();
101     for(i=1;i<=n;++i) z[i]=read();
102     for(i=1;i<=n;++i){
103         l[i]=lower_bound(x+1,x+n+1,x[i]-y[i])-x,
104         r[i]=upper_bound(x+1,x+n+1,x[i]+y[i])-x-1;
105         //cout<<i<<‘ ‘<<x[i]<<‘ ‘<<y[i]<<‘ ‘<<l[i]<<‘ ‘<<r[i]<<‘\n‘;
106     }
107     S.build(root,1,n);
108     Dij();
109     printf("%lld\n",ans[t]);
110     return 0;
111 }
112 /*
113 7 3 7
114 -1 0 1 2 3 5 10
115 11 0 1 1 4 10 2
116 3 1 1 1 2 4 5
117 */

原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/2018_10_22.html

时间: 2024-09-30 06:57:27

【2018.10.22】图图的游戏 / 图图的设计 / 图图的旅行的相关文章

2018/10/22 运行java,运行第一个源程序

昨天晚上写的全部没了,不过照样感谢昀哥老铁的各种援助之手,以及女友阿姣的外卖. java 到windows ,linux,mac这些系统上运行考验先建立虚拟机jvm,Jvm包含在jdk里,虚拟机可以在系统上运行,不过相对时间稍微慢一点,不过总体可以节约大量的时间. jdk是java的开发工具包(也包括jre) jre是java的运行环境 通过java 和 javac来检验系统是否可以识别,安装是否正确. 在后面打java,javac,之后控制台都可以识别到命令. 修改文件名,可以按住F2,删除电

10个最好的信息图创建工具(流程图、交互图、简历图等)

你是否经常看到别人创建的专业信息图而眼红呢?来看看这十个工具吧,你也一样能够创建牛逼的图表哦! 1. Visual.Ly 这是一个很好用的应用,你能够用它来高速创建自己定义的信息图.你不须要不论什么设计相关的知识. 2.StatSilk 这个工具有 web 和桌面两个版本号,能够让你简易的分析数据.它能够让你创建很好看的地图,表格,图形以及各种视觉元素来展示数据.通过 StatPlanet 的 Flash 模板你能够创建 Flash 地图! 3.Infogr.Am 这个工具能够让你高速的创建静态

4.9 省选模拟赛 圆圈游戏 树形dp set优化建图

由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const int MAXN=100010; int n,m,len; struct wy { ll x,y,r,w; inline int friend operator <(wy a,wy b){return a.r<b.r;} }t[MAXN]; int f[MAXN]; int lin[MAXN],ver

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

团队项目第三周-设计类图

设计类图:

iOS界面设计切图小结

iOS界面设计切图小结 APR 12TH, 2013 1.基本尺寸 (1)界面 实际设计时按: iPhone4.4s:640px*960px iPhone5: 640px*1136px iPad:1536px*2048px (2) 图标: 1024px*1024px 圆角180px 提交1024px*1024px 方角 png格式图片 2.图形部件及字体 (1) 为显示清晰 所有图形部件尺寸必须为偶数 样式中阴影.发光.描边的数值也必须为偶数 (2) 为方便用户点击 所有可点击的部件需大于88p

如何用EA设计ER图

我们开发系统从文档开始,而EA就是替我们开发文档的好工具,结束了我们从概念设计到逻辑设计中的很多问题,完善我们的文档. 现在就给大家说说怎样在EA中设计概念模型ER图: 首先打开EA-"新建项目"后就会让你选择模板: 之后,就是选择工具: 之后就是主窗体是这样的: 我的机房收费系统对概念设计的ER是这样的: 大家可以加上属性值,因为加上属性值后,可能会显得很乱,所以,我的这个图上没有属性. 概念设计就到这里了,大家要是觉得EA的功能就这样就没有了,就大错特错了,EA还可以将概念设计转换

团队博客 第三周 设计类图

这次我们组选择的实践项目是图书馆管理系统,主要功能是实现用户登录页面以及简单的对话功能,所以功能比较简单,这次实践项目主要有五个业务类和一个测试类,业务类包括用户类.图书馆员类.读者类.教师类.学生类,测试类中只有一个main方法,用来测试各个类的方法.       用户类主要实现用户的一些基本信息,包括年龄,姓名,性别,以及输入的用户名,用户密码等一些基本信息.当然对于读者类,教师类,学生类也是类似的定义,最后给出的main方法主要实现用户界面的基本设置,包括界面的规模和具体的对话框.由于这次

视差贴图(Parallax Mapping)与陡峭视差贴图(Steep Palallax Mapping)

视差贴图(Parallax Mapping) Demo下载 视差贴图目前已经被广泛运用了,只需要增加一种模型表面的深度纹理信息之后,就能近似的模拟模型的凹凸,在不需要灯光,不需要环境反射的情况下,可以比较真实的模拟真实世界. 先来看一下视差贴图与其他贴图的区别 可以看出 Parallax Mapped 和Steep Parallax Mapped 实现的效果要好很多. 下面的图片更好的表现了视差贴图的好处 原理: 根据用户的观察角度来将纹理坐标偏移,就是把模型表面较高的位置来遮挡位置较低的位置.