20190817考试反思

  考试多思考,认真对待每场考试。

  仍旧一个问题,考到一半就放弃了。主要是怕打不完,T2只码了个暴力,T1没有深度思考,只是在皮上画画写写,也许这种情况下已经没法思考了。下次考试看看能不能静下心来思考,不要慌。

  T1:很好的一道题,想到了要判是不是一些块把某一条路封死了,但是我一想它可能不是一条竖线上就觉得比较麻烦,横着错开比较难判,但是图论就是干这个的,你把所有点向上下边界建边,上边界到下边界的最大值最小的一条路径就是瓶颈,走的时候总会穿过一条最长的路径。这就不用看点与点是不是在一条竖线上,其实是我们不关心它的位置,我只关心点与点的距离,然后这样不关心在坐标轴位置的东西,图论建成边,就能只考虑相对位置了。

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int N=6020;
double d[N];
bool v[N];
int pr[N],n,m,k;
struct point{double x,y;}p[N];
inline int rd()
{
    int s=0,w=1;
    char cc=getchar();
    for(;cc<‘0‘||cc>‘9‘;cc=getchar())if(cc==‘-‘) w=-1;
    for(;cc>=‘0‘&&cc<=‘9‘;cc=getchar()) s=(s<<3)+(s<<1)+cc-‘0‘;
    return s*w;
}
inline double cal(int i,int j)
{
    if(i==k&&j==k-1) return 0x7fffffff;
    if(j==k&&i==k-1) return 0x7fffffff;
    if(i==k) return m-p[j].y;
    if(j==k) return m-p[i].y;
    if(i==k-1) return p[j].y;
    if(j==k-1) return p[j].y;
    point a=p[i],b=p[j];
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline void prim()
{
    for(int i=1;i<=k;i++) d[i]=0x7fffffff;
    memset(v,0,sizeof(v));
    d[k-1]=0;
    for(int i=1;i<=k;i++)
    {
        int x=0;
        for(int j=1;j<=k;j++)
            if(!v[j]&&(x==0||d[j]<d[x])) x=j;
        v[x]=1;
        for(int j=1;j<=k;j++)
        if(!v[j])
        {
            if(cal(x,j)<d[j])
            {
                d[j]=cal(x,j);
                pr[j]=x;
            }
        }
    }
}
int main()
{
    n=rd();m=rd();k=rd();
    for(int i=1;i<=k;i++)
    {
        double x=rd(),y=rd();
        p[i]=(point){x,y};
    }
    k+=2;
    prim();
    int tmp=k;
    double ans=-0x7fffffff;
    while(tmp!=k-1)
    {
        ans=max(ans,d[tmp]);
        tmp=pr[tmp];
    }
    printf("%.10lf\n",ans/2);
}
/*
g++ -std=c++11 1.cpp -o 1
./1
10 5 2
1 1
2 3
*/

683ms

  T2:听说是个套路,我用最坏$O(n^{2}logn)$的线段树卡过了。线段树维护单调栈先扔一发

  

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=200020,inf=1e9;
int p[N],f[N],c[N];
struct tree{int l,r,w,i,m;}tr[N*4];
inline int rd()
{
    int s=0,w=1;
    char cc=getchar();
    for(;cc<‘0‘||cc>‘9‘;cc=getchar()) if(cc==‘-‘)w=-1;
    for(;cc>=‘0‘&&cc<=‘9‘;cc=getchar()) s=(s<<3)+(s<<1)+cc-‘0‘;
    return s*w;
}
void build(const int k,const int l,const int r)
{
    if(l==r)
    {
        tr[k].w=inf;
        return;
    }
    int mid=l+r>>1;
    build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}
int query(const int k,const int x,const int y,const int l,const int r)
{
    const int mid=l+r>>1;
    if(l==x&&r==y) return tr[k].i;
    if(y<=mid) return query(k<<1,x,y,l,mid);
    else if(x>mid) return query(k<<1|1,x,y,mid+1,r);
    return max(query(k<<1,x,mid,l,mid),query(k<<1|1,mid+1,y,mid+1,r));
}
int ask(const int k,const int x,const int y,const int i,const int l,const int r)
{
    const int mid=l+r>>1;
    if(l==r)
    {
        if(tr[k].i<i) return inf;
        return tr[k].w;
    }
    if(y<=mid) return ask(k<<1,x,y,i,l,mid);
    else if(x>mid) return ask(k<<1|1,x,y,i,mid+1,r);
    if(i>tr[k<<1|1].i) return ask(k<<1,x,mid,i,l,mid);
    const int rmax=query(k,mid+1,y,l,r);
    return min(ask(k<<1,x,mid,rmax,l,mid),ask(k<<1|1,mid+1,y,i,mid+1,r));
}
void updata(const int k){tr[k].i=max(tr[k<<1].i,tr[k<<1|1].i);}
void add(const int k,const int id,const int i,const int l,const int r)
{
    const int mid=l+r>>1;
    if(l==r)
    {
        tr[k].i=i;
        tr[k].w=f[i];
        return;
    }
    if(id<=mid) add(k<<1,id,i,l,mid);
    else add(k<<1|1,id,i,mid+1,r);
    updata(k);
}
int main()
{
    const int n=rd();
    for(register int i=1;i<=n;i++) p[i]=rd();
    for(register int i=1;i<=n;i++) c[i]=rd();
    build(1,1,n+1);
    memset(f,0x3f,sizeof(f));
    f[0]=0;add(1,1,0,1,n+1);
    for(register int i=1;i<=n;i++)
    {
        const int maxi=0;
        f[i]=ask(1,1,p[i]+1,0,1,n+1)+c[i];
        add(1,p[i]+1,i,1,n+1);
    }
    register int ans=0x7fffffff,maxi=0;
    for(register int i=n;i>=1;i--)
    {
        if(p[i]>maxi)
        {
            ans=min(ans,f[i]);
            maxi=p[i];
        }
    }
    printf("%d\n",ans);
}
/*
g++ -std=c++11 1.cpp -o 1
./1
5
3 1 4 5 2
3 4 3 4 1
*/

3941ms

  T3:好题,斜率优化,维护下凸包,skyh好像用的栈,加上启发式合并复杂度很优秀,粘一发题解就跑,然而我在考场上觉得用真栈没什么必要,然后就打的链表模拟栈,链表记录某个元素在它和它的祖先链组成的单调栈中的上一个元素是谁。显然这样可以避免某些重复的情况,然后就可以用父亲更新儿子,显然答案的最优决策点是它的祖先链上在坐标系上形成的下凸包上离他最近的点,然后就用父亲的信息,一直往前跳就行了。但是考场上不会证复杂度,好像单调栈是$O(n)$的,好像可过??然后就死了。其实是一条链上$O(n)$然而精心构造的数据可能卡爆,考完突然被yxm提醒一下这个可以倍增。然后就A了。

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=200020,inf=1e9;
int p[N],f[N],c[N];
struct tree{int l,r,w,i,m;}tr[N*4];
inline int rd()
{
    int s=0,w=1;
    char cc=getchar();
    for(;cc<‘0‘||cc>‘9‘;cc=getchar()) if(cc==‘-‘)w=-1;
    for(;cc>=‘0‘&&cc<=‘9‘;cc=getchar()) s=(s<<3)+(s<<1)+cc-‘0‘;
    return s*w;
}
void build(const int k,const int l,const int r)
{
    if(l==r)
    {
        tr[k].w=inf;
        return;
    }
    int mid=l+r>>1;
    build(k<<1,l,mid);build(k<<1|1,mid+1,r);
}
int query(const int k,const int x,const int y,const int l,const int r)
{
    const int mid=l+r>>1;
    if(l==x&&r==y) return tr[k].i;
    if(y<=mid) return query(k<<1,x,y,l,mid);
    else if(x>mid) return query(k<<1|1,x,y,mid+1,r);
    return max(query(k<<1,x,mid,l,mid),query(k<<1|1,mid+1,y,mid+1,r));
}
int ask(const int k,const int x,const int y,const int i,const int l,const int r)
{
    const int mid=l+r>>1;
    if(l==r)
    {
        if(tr[k].i<i) return inf;
        return tr[k].w;
    }
    if(y<=mid) return ask(k<<1,x,y,i,l,mid);
    else if(x>mid) return ask(k<<1|1,x,y,i,mid+1,r);
    if(i>tr[k<<1|1].i) return ask(k<<1,x,mid,i,l,mid);
    const int rmax=query(k,mid+1,y,l,r);
    return min(ask(k<<1,x,mid,rmax,l,mid),ask(k<<1|1,mid+1,y,i,mid+1,r));
}
void updata(const int k){tr[k].i=max(tr[k<<1].i,tr[k<<1|1].i);}
void add(const int k,const int id,const int i,const int l,const int r)
{
    const int mid=l+r>>1;
    if(l==r)
    {
        tr[k].i=i;
        tr[k].w=f[i];
        return;
    }
    if(id<=mid) add(k<<1,id,i,l,mid);
    else add(k<<1|1,id,i,mid+1,r);
    updata(k);
}
int main()
{
    const int n=rd();
    for(register int i=1;i<=n;i++) p[i]=rd();
    for(register int i=1;i<=n;i++) c[i]=rd();
    build(1,1,n+1);
    memset(f,0x3f,sizeof(f));
    f[0]=0;add(1,1,0,1,n+1);
    for(register int i=1;i<=n;i++)
    {
        const int maxi=0;
        f[i]=ask(1,1,p[i]+1,0,1,n+1)+c[i];
        add(1,p[i]+1,i,1,n+1);
    }
    register int ans=0x7fffffff,maxi=0;
    for(register int i=n;i>=1;i--)
    {
        if(p[i]>maxi)
        {
            ans=min(ans,f[i]);
            maxi=p[i];
        }
    }
    printf("%d\n",ans);
}
/*
g++ -std=c++11 1.cpp -o 1
./1
5
3 1 4 5 2
3 4 3 4 1
*/

4179ms

原文地址:https://www.cnblogs.com/starsing/p/11371308.html

时间: 2024-10-08 15:08:18

20190817考试反思的相关文章

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

2019.8.5考试反思 暂时没有题解

又写反思了QwQ 趁着自己考试时大脑抽搐的后效作用还没有消退赶紧写下来. 第一眼看上去三道题都没有什么思路. T1直接就是一个40分暴力,T2大模拟,T3没仔细看. T1暴力码到一半,还没写完就看了看T2,有了一点大概思路. 回去码完T1,过了样例,然后开始美妙T2话说这时候好像他们T1正解都A了 打完模拟,想着可能可以用一下循环节减减枝,又觉得可能没多少就hack了自己. T3看起来像什么数据结构,求连续区间就是区间最大值-最小值=长度. 打了一棵线段树,发现好像可以直接$N^2$预处理但是我

模拟69/70 考试反思

模拟70th大庆. 留下此博客,反思心态,引以为戒. 69 --> 考试开始,心态渐渐平和,逐渐进入考试状态. T1映入眼帘,哦,数学题,那就推式子吧. 众所周知,推式子是一个漫长且无聊的过程,我绞尽脑汁呕心沥血,在考试开始二十分钟后,想到了一个DP. 那就开始打吧. 突然!就在我的不远处传来一阵惊呼声! 这一阵刺耳的奸笑声,使我汗毛耸立,虎躯一震! 什么?¥哥AC了?? 只见lsc双手指了指¥哥,脸上表情复杂. 我该死瞟了一眼¥哥屏幕,代码20行左右. 难道??T1只是一个傻×公式?? 好来吧

2019.7.19考试反思

嘛成绩不算太理想话说这几次成绩哪回理想了??? 不过从某些不要脸方面上来说的确是进步了. T1,这应该是这几次考试中我最接近正解的一次. dp处理get,前缀和优化get,组合数统计get. 然鹅脑子一抽,明知道lucas只实用于mod数小的情况却还是打了lucas. 为了这个lucas我甚至打了两百万阶乘然后愉快M掉看来最近药吃的还是少 往往忽略了最简单的方法也就是从组合数本身去想,因为i只到2000,绰绰有余. 不过调到AC也有很多细节估计我考试时调不出来 T2求无向图最小环,撕烤一下码了一

2019.7.22考试反思

心态逐渐平和... 一上来发现T2是原题,美滋滋开始打N3暴力,亲测可A没办法N2实在是太难调了 然后开了个大回来以后被告知T2要换掉 T1一开始看了有大概15分钟,死在了exgcd上不过估计我记得板子也推不出来嘤嘤嘤 然后卡了一会去看T2,30分什么的完全没有想,然后把它当作数学题来看,推了一会式子,组合数应该稳了. 码完以后去看T3,emmmm..打了大概1个多小时的大模拟. 又回去看T2,手%小样例过不去,重新推式子觉得好像跟卡特兰数有关系,结果发现有重复需要容斥,手动hack掉自己. 然

2019.7.27考试反思

前方低能,请战斗人员和非战斗人员靠近. 这次考试大概是正常水平偏低.... 就算这样反正前两次倒数第二机房反正是稳了可以考虑去抢一下第二机房房主 考试前一天专题就出来了,结果有bug,我把题解下载了我真的没看要不然我还能这分 达哥想了一个月出的题,应该会河鳝核善一点bgm核爆起 考试上来首先过了一遍题,T1不会,T2很迷,T3贼鸡儿像原题? 然后开始快快乐乐码T3,大概码了45分钟拿了75分. 滚回去看T1,手%都不会,看来我概率期望真的和shi一样,qj了一个点. 然后看T2,emmmmm,第

20190818考试反思

题不难,可我答的不够好. T1时间太长,忘了公式又推了半天.边码对拍边试公式,大概开考40分钟才A掉. T2想的太少,还是思路差一点拔高,大众分都能想到,应该能顺着想出来线段树思路. T3.....因为给的时间过少,set建边不会,摸索半天,大概30分钟才把边建出来,然后打的时候发现我的dfs思路死了就剩10min了,立马想到他tarjan+topu,然后10分钟码完了撞了一个变量名,爆0了. 这次考试大概比较简单,但是问题有 1.线段树的运用不够灵活,一般是能够化出来一个式子,把和变量有关的放

20190823考试反思

这次考试CE了. 原因是我改了一个longlong没编译,然后最后查出来的时候已经没时间了. 不CE的话应该rk7左右. 但是都是暴力分. T1:是一个规律题,给了5个样例,但我都没看出来,也是废了.我用背包A了 这个题首先是一道比较屎的背包都能想到. 但是转移会出错,原因在于:$f[j]|=f[(j-w[i]+k)%k]$这个东西转移顺序出问题了. 解决办法就是一个转移循环k次. 复杂度$O(nk^{2})$但是题目给了三个分档,k=100,k=1000,n,k=100000 首先100的肯定