6.7--6.8 记一夜回到解放前。。。

这大概是进信息组以来考得最萎的一次了,宛如一夜回到解放前。。。

没有一道题完整地打对了,下面对做题情况做一个检讨

T1:理解错题意了,QAQ;

T2:逆推的时候没有想到很好的计算方法,但测1e18发现我的计算方法只会少了一点,就天真的while加了一下,于是T飞了;

T3:一开始打了一个n^3的DP,然后打了一个n^2贪心对拍,结果把n^3暴力交上去了

T4:想成区间型DP了,但是要保证不下降所以转移和状态记录很困难,最后5分钟草草地打了一个暴搜,结果连暴力分都没拿全

T5:是原题,莫名其妙的打了一个离散化,结果离散化的数组开小了

T6:当时觉得是一个巨码农的细节题,就放弃去做T4了

这一次考试:第一有的题是真的不会做,第二是是会做的分并没有全部拿到,写萎的现象很严重

这一次暴露了对一些问题解决上的缺陷:DP,贪心以及有代码难度的暴搜题,对于简单题一遍打对能力较弱

以后要训练基础题的切题能力,刷洛谷之类的OJ,要保证较简单的题目的分拿稳。基础和代码能力尚弱也是目前做省选难度题速度较慢的主要原因

下面发一下订正的题的题解:

T2:主要是讲一下怎么逆推回去

原来是每20个里面去掉一个,所以原来的每一个20现在就只剩下了19

if(dis[x]%19==0) 那么dis[y]=dis[x]*(20/19);<恰好有(dis[x]/19)份20,无零头>

if(dis[x]%19) dis[y]=dis[x]/19+1+dis[x];<有(dis[x]/19)份20,还有一份是不足20的零头扣的也要加上>

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<queue>
#define RG register
using namespace std;
typedef long long ll;
const int N=500050;
const ll Inf=1e18+10;
int gi(){
  int x=0,flag=1;
  char ch=getchar();
  while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) flag=-1;ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
  return x*flag;
}
int mark[N],n,m,k,head[N],to[N],nxt[N],cnt,vis[N],S,T;
long long dis[N];
void lnk(RG int x,RG int y){
  to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
}
struct data{
  int x;long long d;
  bool operator <(const data b) const{return d>b.d;}
};
priority_queue <data> q;
int main(){
  freopen("transport.in","r",stdin);
  freopen("transport.out","w",stdout);
  n=gi(),m=gi(),k=gi();
  for(RG int i=1;i<=n;i++){
    int x=gi(),y=gi();mark[x]=y;
  }
  for(RG int i=1;i<=m;i++){
    int x=gi(),y=gi();
    lnk(x,y);lnk(y,x);
  }
  S=gi(),T=gi();
  for(RG int i=1;i<=n;i++) dis[i]=Inf;
  dis[T]=k;q.push((data){T,k});
  while(!q.empty()){
    int x=q.top().x;q.pop();
    if(vis[x])continue;vis[x]=1;
    for(RG int i=head[x];i;i=nxt[i]){
      int y=to[i];
      if(mark[x]){
	if(dis[y]>dis[x]+1) dis[y]=dis[x]+1,q.push((data){y,dis[y]});
      }
      else{
	int ans;
	if(dis[x]%19==0) ans=dis[x]/19*20;
	else ans=dis[x]/19+1+dis[x];
	if(dis[y]>ans) dis[y]=ans,q.push((data){y,dis[y]});
      }
    }
  }
  printf("%lld\n",dis[S]);
  return 0;
}

T3:

考虑按左端点排序后每次O(n)的贪心调整策略,用一个单调队列并不断调整;

如果两个区间发生矛盾则优先考虑右端点小的并弹掉右端点大的,因为这样对后面的影响最小且不会影响前面的。。。

首先我们可以去掉一些永远不可能构成答案的区间<即完整覆盖了别的区间的区间,选被他覆盖的区间显然不差于选他自己>

通过这一步操作之后<可以用单调队列实现>我们可以发现变成了一堆左端点小的右端点也一定小的区间;

类似这样:

|______|

|______|

|_______|

|________|

那么我们从一个区间出发的最优策略就是每次走到左端点大于该区间右端点的第一个区间,然后一直执行此操作;

然后我们考虑询问区间,那么肯定是找第一个左端点大于等于l的区间开始(因为这个区间同时意味着右端点最小)

在保证不跳出区间的范围内尽量的移动,这种带条件的序列上的快速移动一般用倍增优化,然后就可以AC

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define RG register
using namespace std;
typedef long long ll;
const int N=200050;
int gi(){
  int x=0,flag=1;
  char ch=getchar();
  while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) flag=-1;ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
  return x*flag;
}
struct data{
  int l,r;
}q[N],p[N];
inline bool check(RG int l,RG int r,RG int L,RG int R){
  if(L<=l&&l<=R) return 1;
  if(L<=r&&r<=R) return 1;
  if(l<=L&&L<=r) return 1;
  if(l<=R&&R<=r) return 1;
  return 0;
}
inline bool cmp(const data &a,const data &b){
  if(a.l==b.l) return a.r<b.r;
  else return a.l<b.l;
}
int n,Q,tail,L[N],f[20][N],step[20][N];
inline void pre(){
  tail=0;p[0].l=-1000,p[0].r=-500;
  for(RG int i=1;i<=n+1;i++){
    if(!check(p[tail].l,p[tail].r,q[i].l,q[i].r)) p[++tail]=q[i];
    else if(q[i].r<p[tail].r){
      while(q[i].r<p[tail].r) tail--;
      p[++tail]=q[i];
    }
    else if(q[i].r>=p[tail].r&&q[i].l!=p[tail].l) p[++tail]=q[i];
  }
}
int main(){
  freopen("query.in","r",stdin);
  freopen("query.out","w",stdout);
  n=gi(),Q=gi();
  for(RG int i=1;i<=n;i++){
    q[i].l=gi(),q[i].r=gi();
  }
  q[n+1].l=1e9+1,q[n+1].r=1e9+2;
  sort(q+1,q+1+n+1,cmp);pre();
  for(RG int i=1;i<=tail;i++) L[i]=p[i].l;
  for(RG int i=1;i<tail;i++){
    f[0][i]=upper_bound(L+1,L+tail+1,p[i].r)-L;
    step[0][i]=1;
  }
  q[0].l=1e9+1,q[0].r=1e9+2;
  for(RG int j=1;j<=16;j++){
    for(RG int i=1;i<=tail;i++){
      f[j][i]=f[j-1][f[j-1][i]];
      step[j][i]=step[j-1][i]+step[j-1][f[j-1][i]];
    }
  }
  for(RG int i=1;i<=Q;i++){
    RG int l=gi(),r=gi();
    RG int x=upper_bound(L+1,L+tail+1,l-1)-L;
    RG int ans=0;
    if(l<=p[x].l&&p[x].r<=r){
      ans=1;
      for(RG int j=16;j>=0;j--){
	if(f[j][x]&&l<=p[f[j][x]].l&&p[f[j][x]].r<=r){
	  ans+=step[j][x];x=f[j][x];
	}
      }
    }
    printf("%d\n",ans);
  }
  return 0;
}

T4:

两种方法:

1.f[i][j]表示从1到i这个位置花费j次合并为一个不降序列的最后一个元素的最小值<最后一个元素最小对后面的转移更优>

然后加一个前缀和优化;

转移:f[i][k+i-j-1]=min{sum[i]-sum[j]}(sum[i]-sum[j]>=f[j][k]时转移,即把j+1到i合并后加到以j结尾的不降序列上,合并了i-(j+1)次)

2.f[i][j]表示从1到i这个位置不降序列长度为j的最后一个元素的最小值<同理>

转移:f[i][k+1]=min{sum[i]-sum[j]}(sum[i]-sum[j]>=f[j][k],即把j+1到i合并后加入到以j结尾的长度为k的不降序列上,不降序列的长度加了1)

对于这种方法,f[i][j]表示的合并次数为i-j;

这两种方法通过巧妙的设计把不降序列的最后一位记录了下来,方便转移

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=100050;
const int Inf=19260817;
int gi()
{
  int x=0,flag=1;
  char ch=getchar();
  while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) flag=-1;ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
  return x*flag;
}
int a[N],f[350][350],sum[N],n;
int main(){
  freopen("seq.in","r",stdin);
  freopen("seq.out","w",stdout);
  n=gi();for(int i=1;i<=n;i++) a[i]=gi(),sum[i]=sum[i-1]+a[i];
  for(int i=1;i<=n;i++)
    for(int j=0;j<=n;j++)
      f[i][j]=Inf;
  f[0][0]=0;
  for(int i=1;i<=n;i++)
    for(int j=0;j<i;j++)
      for(int k=0;k<=j;k++){
	int h=sum[i]-sum[j];
	if(h>=f[j][k]){
	  f[i][k+i-j-1]=min(f[i][k+i-j-1],h);
	}
      }
  for(int i=0;i<=n;i++)
    if(f[n][i]!=Inf){
      printf("%d\n",i);return 0;
    }
  return 0;
}
时间: 2024-08-10 16:17:25

6.7--6.8 记一夜回到解放前。。。的相关文章

Win10全亮色主题概念设计:一夜回到Windows 95

微软在Win10系统融合了此前Windows Phone中的大量内容,包括设计元素,在一个Win10核心的基础上,Windows10 PC和Win10 Mobile最统一的,相似度最高,Win10 UWP通用应用平台是跨设备核心,允许开发者和用户获得一致体验. 但Win10系统中重要的特性也包括个性化,这曾经是Windows Phone主打亮点功能,形式虽然单一,但组合很多.在最新的Win10一周年更新中,设置选项里也有很多主题选择,包括更改主题颜色.背景选择.Windows聚焦锁屏等等. 不过

五十万年薪的人是怎么过日子的?

五十万年薪的人是怎么过日子的?修改 由于各行各业及自己本身原有基础不一样,可能大家的回答没有横向可比性,希望大家能够在回答中包含以下信息:1 自己年龄,从事的行业岗位,属于什么职级2 受过的教育水平3 父母能够在你刚开始工作时提供多大帮助4 自己在哪线城市工作 关于生活状态的其他问题:你认为怎样的生活状态是最理想的?年收入50元的人是怎么过日子的?一万年薪的人都是怎么过日子的?十万年薪的人都是怎么过日子的?百万年薪的人都是怎么过日子的?千万年薪的人都是怎么过日子的?修改 举报9 条评论 分享 •

比特币基础(一)

最近很多人都在问我,到底什么才是区块链,区块指的是啥(居民区?行政区?@[email protected] ),怎么就把区块给链上了,链上又能做什么,一个链子怎么又搞出一堆听不懂的币出来了,这个币我怎么没见过...... 区块链都快变成问题链了.其实我很能理解大家的这种焦虑,在这么一个万众创新的时代,每天都有很多新名词产生,每段时间都会有个所谓的风口.从早期的团购,到后来的花式共享经济,再到AI,大数据,不管是创业的不创业都能对其评头论足几句,因为它们大部分是看得见摸得着的.当你坐在滴滴专车里面

通货膨胀与投资陷阱

第一部分:通货膨胀 1.   什么是通货膨胀? 通货膨胀的意思就是流通的货币过多,超过经济运行的需求,导致钱不值钱,钱的购买力下降了,相应地物价就上涨了.这个我们都有体会,也很好理解,就是钱越来越不值钱了.同样的钱能买的东西越来越少了.你5岁的时候存了10块钱,想着长大买100辣条一口气吃掉爽一把,没想到长大之后只能买10包了~还是木有过瘾,这就是金钱的时间价值.(不记得的同学要去复习一下<财富的载体-时间>这篇晚分享啦~) 再正经举个例子 假设整个中国市场上只有100个西瓜,同时市场上流通着

Tizen让三星走向神坛OR心碎一地

笔者按:在那些充满勾心斗角.阴谋诡计的宫斗大片中,总是不乏这样的桥段--原本自以为非常可靠.值得信任的人,最后却变成最大的反派,成为主角最大的敌人.可谓一念成佛,一念成魔.人犹如此,更何况形势更加复杂的企业之间? 对于三星来说,2014年绝对是非常尴尬的一年.以往擅长的机海战术在今年却不灵了--旗舰Galaxy S5相较上代产品几乎没有任何亮点可言.中低端机型乏善可陈.Note 4还得9月份发布并和iPhone 6展开几乎不可能胜利的竞争--可言说,在移动终端方面,2014年注定是三星失意的一年

可行性分析报告

可行性分析研究报告1 引言 1.1编写目的 跟随当下利用P图软件对图片进行修改的趋势,与当下流行相结合,利用对图像处理方面的知识建立相关图像处理技术与功能,使用户能够更多的使用该类软件功能对图像进行个人需求的处理.1.2背景 说明:当今社会中的图片美化软件,具有图片特效.美容.拼图.场景.边框.饰品等功能.这些图片处理软件主要是处理以像素构成的数字图像,由于这些软件中具有众多的编辑与绘图功能,可以有效的对图像进行处理.由于这些软件能够与当下流行相结合,且简单.易用.不需要任何的专业的图像处理技术

【玩转React】关于React你需要知道的事儿

前言 随着前端技术的迅猛发展,各种前端框架也随势崛起,但归根结底,支撑每一款web框架流行的强大因素都是它能更好地服务于业务. React 自然也不例外,它的开发者当初正在开发Facebook的一个广告系统,由于不满足于当下任何的 MVC 框架,所以就自己写了一套 UI 框架,于是乎大名鼎鼎的 React 就由此诞生了. React 的出现无疑为 web 开发带来了颠覆性的改变,多少开发者夜以继日只为体验一把 React 带来的快感.本文就将带领大家一起领略一番 React 的理念.特色与情怀.

上班的第五百零三天

最近家里要做风水,又要出一笔钱了,而出钱的人往往就是我.虽然我有姐姐和弟弟,但是他们平时都是大手笔花,所以都没存什么钱.因此,每次家里有事都是眼巴巴地看着我,我知道这也是我该做的,但是每次都是这样,真的是挺无奈的.毕业到现在,两年了,每个月给50%的工资做家用,好不容易存了点钱,这次又要全部拿出来了,一夜回到解放前. 现在每天住家里,上班有老妈给我准备好便当,下班回家有西瓜吃,其实是挺不错的日子的.日子过久了,有种莫名的束缚感,似乎已经无法脱身了,有点窒息.很多时候都挺羡慕背进离乡去拼世界的人的

Visual Studio 2013环境下操作vc6/vc7/vc8等低版本平台项目【编译|生成|调试】

现代化的开发环境,微软一直在推出更新换代,我们所处的技术环境在日新月异的变化:不过在中国多数人们一边疲惫的追赶着时代的步伐,一边坚守着自己所获悉所掌握的那些紧吧吧的知本.对技术工具的掌握并非他们所想要,人人都是想借助工具作用以实现目标.所以,对于一段时间来而言,谁赶出了作品,谁就赢得了先机从此吸聚一大批人力来驱动其事业的成长.只是不过,如果只是赶出了一时间的作品,而从此只就其上迭代运作而不再从外吸纳新鲜的技术气氛,那可能解体终有一日. 从VC6到VC2008,再到2010.2013,到现在已经是