今天的考试真的是天崩地裂,写了的三个题全炸。。。然而谁叫我弱+不注意细节呢???真的要扇耳光。。。

T1:
题意:一段区间的高度为这个区间中高度的最小值,给定n个宽度,求每个宽度的期望高度

40% :算出长度为x的区间的所有的最小值的取值的和,除以总的方案数(n-x+1),用ST表预处理可以n^2;(记得开long long)

100%:对于每个点求出他取最小值的区间,即用两遍单调栈求出左,右边第一个小于他的值。。。记为l[i],和r[i],这一步和影魔很像;

对于当前这一个点,考虑以他为最小值,能贡献给多少个区间。。。

记l1=i-l[i]+1,l2=r[i]-i+1;

对于长度L在[1,min(l1,l2)]的区间,可以贡献L*a[i];

对于长度L在[min(l1,l2)+1,max(l1,l2)],可以贡献min(l1,l2)*a[i];

对于长度L在[max(l1,l2)+1,r[i]-l[i]+1],可以贡献(r[i]-l[i]+1-L+1)*a[i];

(算对长度为L的区间的贡献就是看长度为L的区间在[l[i],r[i]]内移动能包含i点多少次);

然后涉及多次修改和一次询问,考虑序列差分。。。然而这是一个优秀的差分。。。

发现修改有两种,一个是一段区间加上相同的值,另一个是和每个点本身的长度有关。。。

所以建两个差分数组,一个记录正常的差分,一个记录L前的系数,这样第三个情况需要拆成两个修改来维护。。。

其实说了这么多,代码还是很短的。。。

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define int long long
using namespace std;
typedef long long ll;
const int N=2000000;
int gi(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
int n,m,a[N],q[N],tail,l[N],r[N],ans[N],cf1[N],cf2[N];
main(){
freopen("fence.in","r",stdin);
freopen("fence.out","w",stdout);
scanf("%lld",&n);for(int i=1;i<=n;i++) a[i]=gi();
tail=0;q[++tail]=0;
for(int i=1;i<=n;i++){
while(tail>0&&a[i]<=a[q[tail]]) tail--;
l[i]=q[tail]+1;q[++tail]=i;
}
tail=0;q[++tail]=n+1;
for(int i=n;i>=1;i--){
while(tail>0&&a[i]<a[q[tail]]) tail--;
r[i]=q[tail]-1;q[++tail]=i;
}
for(int i=1;i<=n;i++){
int l1=i-l[i]+1,l2=r[i]-i+1;
cf1[1]+=a[i];cf1[min(l1,l2)+1]-=a[i];
cf2[min(l1,l2)+1]+=a[i]*min(l1,l2);cf2[max(l1,l2)+1]-=a[i]*min(l1,l2);
cf2[max(l1,l2)+1]+=a[i]*(r[i]-l[i]+2),cf2[r[i]-l[i]+2]-=a[i]*(r[i]-l[i]+2);
cf1[max(l1,l2)+1]-=a[i],cf1[r[i]-l[i]+2]+=a[i];
}
for(int i=1;i<=n;i++) cf1[i]+=cf1[i-1],cf2[i]+=cf2[i-1],ans[i]=cf1[i]*i+cf2[i];
scanf("%lld",&m);while(m--){int x=gi();printf("%.5f\n",ans[x]*1.0/(n-x+1));}
return 0;
}

T2:

题意:由于题面描述过于生动,令人影响深刻,所以不再描述。。。

做法:考虑到要尽量在v大的那天开,且一天就要开完,且前面可以养精蓄锐留到v大的那天来开。。。

所以考虑维护一个v递减的单调栈来对决策进行调整,在弹栈的过程中分情况讨论一下调整即可。。。

if(life[i]+life[q[tail]]<=E) life[i]+=life[q[tail],Ans-=v[q[tail]]*life[q[tail]];//把第q[tail]天的精力留到第i天

if(life[i]+life[q[tail]]>E) Ans-=(E-life[i])*v[q[tail]],life[i]=E;//和上面同理,yy一下

然后有一个史前巨坑:R>E,如果没有R=min(R,E)就会光荣baoling。。。。

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define int long long
using namespace std;
typedef long long ll;
const int M=1000050;
int T,E,R,N,v[M],life[M],q[M],tail,Ans;
main(){
freopen("power.in","r",stdin);
freopen("power.out","w",stdout);
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&E,&R,&N);R=min(R,E);
for(int i=1;i<=N;i++) scanf("%lld",&v[i]);
memset(life,0,sizeof(life));tail=0;Ans=0;
q[++tail]=1;life[1]=E;Ans=life[1]*v[1];
for(int i=2;i<=N;i++){
life[i]=R;
while(tail>0&&v[q[tail]]<v[i]){
if(life[i]+life[q[tail]]>E) Ans-=(E-life[i])*v[q[tail]],life[i]=E;
else Ans-=life[q[tail]]*v[q[tail]],life[i]+=life[q[tail]];
tail--;
}
Ans+=life[i]*v[i];q[++tail]=i;
}
printf("%lld\n",Ans);
}
return 0;
}

T3:弃坑了。。。

T4:

题意:关路灯,见codevs。。。

我真的是太弱了,这种DP都打不出来。。。

dp[i][j][0]表示关完了区间[i,j]的灯,然后在区间的左端点的最少花费。。。

dp[i][j][1]表示关完了区间[i,j]的灯,然后在区间的右端点的最少花费。。。

然后用功率的前缀和表示其他区间的能耗情况。。。

然后转移就是4种:

从左到左,从右到左,从右到右,从左到右。。。每次至移动一位来转移。。。

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define RG register
#define Min(a,b) (a<b?a:b)
const int N = 1050;
using namespace std;
typedef long long ll;
inline int gi(){
RG char ch=getchar();RG int x=0;
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
ll d[N],w[N],dp[N][N][2];
int main(){
freopen("light.in","r",stdin);
freopen("light.out","w",stdout);
int n=gi(),m=gi(); RG int i,j; ll z;
for (i=1; i<=n; ++i) d[i]=gi(),w[i]=w[i-1]+gi();
memset(dp,56,sizeof(dp));
dp[m][m][0]=dp[m][m][1]=0;
for (i=m; i; --i)
for (j=m; j<=n; ++j){
z=w[n]-w[j]+w[i-1];
dp[i-1][j][0]=Min(dp[i-1][j][0],dp[i][j][0]+(d[i]-d[i-1])*z);
dp[i-1][j][0]=Min(dp[i-1][j][0],dp[i][j][1]+(d[j]-d[i-1])*z);
dp[i][j+1][1]=Min(dp[i][j+1][1],dp[i][j][0]+(d[j+1]-d[i])*z);
dp[i][j+1][1]=Min(dp[i][j+1][1],dp[i][j][1]+(d[j+1]-d[j])*z);
}
printf("%lld",Min(dp[1][n][0],dp[1][n][1]));
return 0;
}  

7.18 DP考试解题报告的更多相关文章

  1. 18.4.1 考试解题报告 P71

    题目:https://files.cnblogs.com/files/lovewhy/problem.pdf 偷偷摘来dalao题面. P71竞赛时间:???? 年?? 月?? 日??:??-??:? ...

  2. 洛谷 P4964 绫小路的特别考试 解题报告

    P4964 绫小路的特别考试 题目背景 这世界上「胜利」便是一切.无关乎过程. 要付出多少牺牲都无所谓.只要最后我「胜出」那就行了. 题目描述 一场新的特别考试来临了,这次的考试内容是(wan e d ...

  3. 洛谷 P1158 导弹拦截(不是那个DP) 解题报告

    P1158 导弹拦截 题目描述 经过1111年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截.当工作半径为0时,则能够拦截与它位置恰好相同的导弹. ...

  4. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  5. 【NOIP2015】提高组D1 解题报告

    P1978神奇的幻方 Accepted 描述 幻方是一种很神奇的 N ∗ N 矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时 ...

  6. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  7. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  8. poj1173 解题报告

    poj1173 解题报告2013-07-21 13:31 by 期待 ., 42 阅读, 0 评论, 收藏, 编辑 http://poj.org/problem?id=1173 发现此题资料甚少,斗胆 ...

  9. 夏令营提高班上午上机测试 Day 4 解题报告

    我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...

随机推荐

  1. JSP7(Cookie与javamail)

    一.cookie是什么意思? 英文直接翻译过来的意思呢就是小甜品 Cookie英文意指饼干,不过在电脑术语中它可不像饼干那么简单.简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务 ...

  2. DIV+CSS特殊符号的处理方法

    :    :;    ;<    <=    =>    >?    ?@    @^    ^_    _`    `{    {|    |}    }~    ~---  ...

  3. Python之可变类型与不可变类型

    Python常见的数据类型有:数字 字符串 元组 列表 字典 不可变类型:数字 字符串 元组 可变类型: 列表 字典 a = 100 b = [100] def num1(x): x += x pri ...

  4. openstack高可用haproxy配置

    #openstack高可用haproxy配置openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #openstack高可 ...

  5. Js特殊字符转义之htmlEscape()方法

    为了防止XSS攻击,常常需要将用户输入的特殊字符进行转义,原生js貌似还没有直接对其专业的方法,最近再读Js高级程序设计的时候刚好看到,碰巧项目中也刚好需要使用次方法,于是就之家搬来用了. 网上关于转 ...

  6. TeamTalk安装测试

    TeamTalk介绍 项目框架 TeamTalk是蘑菇街的开源项目,github维护的最后时间是2015但是仍然是一款值得学习的好项目,麻雀虽小五脏俱全,本项目涉及到多个平台.多种语言,简单关系如下图 ...

  7. 大数据学习系列之三 ----- HBase Java Api 图文详解

    版权声明: 作者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 个人博客出处:http ...

  8. 【NOIP2012提高组】同余方程

    https://www.luogu.org/problem/show?pid=1082 方程可化为ax+by=1. 用扩展欧几里得算法得到ax'+by'=gcd(a,b)的一组解后,可得x=x'/gc ...

  9. 深入理解 Promise

    自从ES6流行起来,Promise 的使用变得更频繁更广泛了,比如异步请求一般返回一个 Promise 对象,Generator 中 yield 后面一般跟 Promise 对象,ES7中 Async ...

  10. Dos命令的巧用

    豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可以轻易的办到很多事 ...