比赛地址:http://jzoj.net/senior/#contest/home/2852

题目

jzoj 6290. 倾斜的线

http://jzoj.net/senior/#contest/show/2852/0

jzoj 6305. 最小值

http://jzoj.net/senior/#contest/show/2852/1

jzoj 6307. 安排

http://jzoj.net/senior/#contest/show/2852/2


过程

今天爆炸了……真是开心 ψ(`∇´)ψ
第一题一看数据,哇!暴力有50分耶!我知足了极限也只有 1 0 5 10^5 105,肯定是 l o g log log的解法啦!
冥冥之中,我总觉得是排序
但是我好像连直线的斜率都不会求啊!
没关系,我们可以猜结论,联系DP斜率优化一次函数的知识,我们可以猜出
k = y 1 − y 2 x 1 − x 2 k=\frac{y_1-y_2}{x_1-x_2} k=x1​−x2​y1​−y2​​
(虽然一开始我以为 k = x 1 − x 2 y 1 − y 2 k=\cfrac{x_1-x_2}{y_1-y_2} k=y1​−y2​x1​−x2​​,但是发现过不了样例后就改了,这就是猜结论的隐患)
接着对于平面直角坐标系上的每个点,我们都作一条经过它的斜率为 P / Q P/Q P/Q的直线:

对于A点而言,最接近斜率的点是C;对于B点而言,最接近的是D……
它们都是与直线纵坐标之差最小的点,因此可以猜出结论:

对于一个点而言,与它所连直线斜率最接近 P / Q P/Q P/Q的点必定是与经过它,斜率为 P / Q P/Q P/Q的直线纵坐标值差最小的点。

于是排个序, O ( n ) O(n) O(n)判断就可以了。总时间复杂度 O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2​n)。

第二题显然是DP。
我设 g i g_i gi​表示点 i 处是区间右端点的最大价值和,接着就可以 O ( n 2 ) O(n^2) O(n2)转移了。
这样显然会TLE,因此考虑优化。
通常这种题目都是用斜率优化或是单调队列,然而我怎么也没有想到如何优化。
最后脑子糊糊的,感觉可以用单调栈,于是就敲了起来。
结果弄了很久也没有弄出来,好不容易过了样例,我注意到A,B,C,D可能是负数,于是就出了个负数的数据。
然后惊奇的发现输出经一模一样!
试了几个都是如此,感觉这个方法不行啊!于是打了 O ( n 2 ) O(n^2) O(n2)的DP交了上去,接着验证——还是一样的!
神奇!
比赛结束前两分钟才发现是读入优化没判负号……
险些爆〇了。

第三题什么神仙?!

总分:65+30+0=95(T1炸掉了)。


题解

T1

我比赛时的做法其实就是正解,只是精度爆炸了而已。

计算一下:

48840271/140346761 = 0.34799713689153111271303225872095
241818102/694885321 = 0.34799713663832020996166646611319

原来是因为我判断两个long double是否相同时是if(x-y>1e-9),把这个值改成1e-14就好了。

T2

正解就是单调栈优化DP(真香)。
可以按最小值把原序列划分成几段,用单调栈来维护这些段。
段内的值用一个数组存一下就好了,至于用哪一个更新答案,用前缀数组来维护。

T3

怎么又是老虎和蒜头……
作者一开始就知道这题很难了:

键盘可以吃吗?
百度一下,发现还有烹饪教程(麻婆键盘):

哎呀,想太多了。
其实这题是一道很新奇的题目。
发现A→B=A→C→B,因此可以把A排序变成C,再把C变成B。
由于操作可逆,我们可以把过程变成把A,B都排序。
这样就可以分开处理了。
17%的做法是直接暴力求逆序对,交换。
这样操作数最多是 n 2 n^2 n2的,绝对不会超过345678,因此这种方法是对的。
由逆序对的思路容易联想到归并排序(逆序对不就这么求的嘛!),考虑如何归并排序。
我们现在有两个有序序列(画工丑陋,不必在意):

取 [ l , m i d ] [l,mid] [l,mid]的后x个和 [ m i d + 1 , r ] [mid+1,r] [mid+1,r]的前x个,使得 [ l , m i d ] [l,mid] [l,mid]的后x个都大于 [ m i d + 1 , r ] [mid+1,r] [mid+1,r]的前x个(x要尽可能多取):

然后想办法让这两个序列交换位置(方法后面会提到):

接着再处理右上部分和左下部分就可以了,这样最后会把它们分别合成一个序列,合起来就可以了。
实现的话就是用归并排序向下处理,快速排序将两个序列并成一个序列。
实现起来细节多多。
真·神仙!


总结

比赛的时候要勇于猜结论,多注意细节!


代码

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define llf long double
#define e 1e-14
#define N 200005
struct node{ll x,y;}a[N];
char ch;ll P,Q;
llf solpe,ans=1e10,temp;
inline char gc()
{static char buf[500000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,500000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(ll &x)
{while(ch=gc(),ch<'0'||ch>'9');x=ch-'0';while(ch=gc(),ch>='0'&&ch<='9') x=x*10+ch-'0';
}
inline llf abss(llf k){return k>0?k:-k;}
inline bool cmp(node x,node y)
{return x.y*Q-x.x*P<y.y*Q-y.x*P;}
inline ll gcd(ll x,ll y)
{ll r;while(y)r=x%y,x=y,y=r;return x;
}
int main()
{freopen("slope.in","r",stdin);freopen("slope.out","w",stdout);ll n,i,j,x,y,p,q;read(n),read(P),read(Q);solpe=P/(llf)Q;for(i=1;i<=n;i++) read(a[i].x),read(a[i].y);sort(a+1,a+n+1,cmp);for(i=1;i<n;i++){x=a[i+1].x-a[i].x,y=a[i+1].y-a[i].y;if((x<0)!=(y<0)) continue;if(x<0) x=-x,y=-y;j=gcd(x,y),x/=j,y/=j;temp=abss(y/(llf)x-solpe);if(ans-temp>e) ans=temp,p=y,q=x;}printf("%lld/%lld\n",p,q);return 0;
}

T2

#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define N 200005
ll a[N],f[N],g[N],stack[N][2],pre[N];
char ch;
inline char gc()
{static char buf[500000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,500000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(ll &x)
{char ch;bool b=0;while(ch=gc(),ch!='-'&&(ch<'0'||ch>'9'));if(ch=='-') b=1,ch=gc();x=ch-48;while(ch=gc(),ch>='0'&&ch<='9') x=x*10+ch-48;if(b) x=-x;
}
int main()
{freopen("min.in","r",stdin);freopen("min.out","w",stdout);ll n,i,A,B,C,D,top=1,max;read(n),read(A),read(B),read(C),read(D);for(i=1;i<=n;i++) read(a[i]),f[i]=A*a[i]*a[i]*a[i]+B*a[i]*a[i]+C*a[i]+D;for(i=1;i<=n;i++){for(max=g[i-1];top&&a[stack[top][1]]>a[i];top--)if(max<stack[top][0]) max=stack[top][0];stack[++top][0]=max,stack[top][1]=i;if(top>1) pre[top]=pre[top-1]>max+f[i]?pre[top-1]:max+f[i];else pre[top]=max+f[i];g[i]=pre[top];}printf("%lld\n",g[n]);return 0;
}

T3

#include<cstdio>
using namespace std;
#define N 5005
int a[N],ans[2][345680][2],cnt[2];
int flag=1;
inline void swap(int &x,int &y){x^=y,y^=x,x^=y;}
void qsort(int l,int mid,int r)
{if(l>mid||mid>=r) return;int i=mid,j=mid+1,k,t;while(l<i&&j<r&&a[i-1]>a[j+1]) i--,j++;if(a[i]>a[j]){for(k=i,t=mid;k<t;k++,t--)ans[flag][++cnt[flag]][0]=k,ans[flag][cnt[flag]][1]=t,swap(a[k],a[t]);for(k=mid+1,t=j;k<t;k++,t--)ans[flag][++cnt[flag]][0]=k,ans[flag][cnt[flag]][1]=t,swap(a[k],a[t]);for(k=i,t=j;k<t;k++,t--)ans[flag][++cnt[flag]][0]=k,ans[flag][cnt[flag]][1]=t,swap(a[k],a[t]);if(l<mid) qsort(l,i-1,mid);if(mid+1<r) qsort(mid+1,j,r);}
}
void msort(int l,int r)
{int mid=l+r>>1;if(l<mid) msort(l,mid);if(mid+1<r) msort(mid+1,r);qsort(l,mid,r);
}
int main()
{freopen("swap.in","r",stdin);freopen("swap.out","w",stdout);int i,n;scanf("%d",&n);loop:for(i=1;i<=n;i++) scanf("%d",a+i);msort(1,n);if(flag){flag=0;goto loop;}printf("%d\n",cnt[1]+cnt[0]);for(i=1;i<=cnt[1];i++) printf("%d %d\n",ans[1][i][0],ans[1][i][1]);for(i=cnt[0];i;i--) printf("%d %d\n",ans[0][i][0],ans[0][i][1]);return 0;
}

2019.08.17【NOIP提高组】模拟 A 组 比赛总结相关推荐

  1. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  2. 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结

    2020.08.08[NOIP提高组]模拟:奶牛的图片 总结 Description Farmer John希望给他的 N ( 1 ≤ N ≤ 100 , 000 ) N(1\leq N\leq100 ...

  3. 2019.08.17【NOIP?提高组】模拟 A 组 总结

    (今天标题验证NOIP取消了吗...) 心态巨崩 考场:\(50 + 20 + 0 = 70\) T1: 考场上推式子,看能否有仅包含一个点的值. 然后推到后面推出来一个用\(abs(Q(y1-y2) ...

  4. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

    Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 ...

  5. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  6. 【二分,找规律】Day 14 提高组模拟C组 T1 小麦亩产一千八

    题目大意 给定斐波那契的第aaa项,求出第b" role="presentation">bbb项,默认第0项为1 解题思路 方法一:递推 找到规律后O(b)O(b) ...

  7. 2019.08.17 Webpack4 bilibi

    将这些依赖打包吗? es6转es5,将sass,less,转成css.文件优化:压缩代码体积,合并文件. 代码分割:公共模块的处理,路由懒加载功能.模块合并:功能模块分类 自动刷新 这些恨过的静态资源 ...

  8. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  9. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

最新文章

  1. pandas使用fillna函数将dataframe中缺失值替换为空字符串(replace missing value with blank string in dataframe)
  2. xgboost 的 get_fscore()
  3. SQL 查询语句总是先执行 SELECT?
  4. VUE计算属性关键词: computed
  5. 关于SAP CRM Organization Unit组织结构单元自动决定的一些调试
  6. 云顶之弈机器人法爆_云顶之弈10.16b机器人阵容推荐 云顶之弈10.16b机器人娱乐阵容玩法攻略...
  7. [html] img中的src加载失败时如何用默认图片来替换呢?
  8. [剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]
  9. 《Python Cookbook 3rd》笔记(4.1):手动遍历迭代器
  10. 图论算法(一)--最短路径的DFS/BFS解法(JAVA )
  11. SlickEdit完美解析Qt4
  12. Java 11 将至,不妨了解一下 Oracle JDK 之外的版本
  13. (转)Scala中协变(+)、逆变(-)、上界(:)、下界(:)简单介绍
  14. SQL server 表数据改变触发发送邮件
  15. 百旺如何看是否清卡_【问吧】如何查看是否清卡成功,出现这些问题,如何处理?...
  16. 打新股和打新债有什么区别?
  17. python车辆定位调度管理系统,基于django+twisted
  18. 数据仓库DW、ODS、DM概念及其区别
  19. csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作
  20. 我的世界服务器无限箱子,MC:服务器这个op漏洞,钻石堆满整个箱子,你不懂单机的乐趣...

热门文章

  1. 信访分析 大数据_【信访微观察】“大数据”有多火?化解信访矛盾也用上了它!...
  2. 一台电脑能运行两个mysql数据库_一台电脑可以同时装两个带有SQL数据库的软件吗...
  3. virsh查询虚拟机列表
  4. Three开发笔记(二)
  5. 导出cvs文件格式数据
  6. xenapp6.5上安装完smartauditor后,Appcenter检测失败
  7. 大数据时代之痛,你“裸奔”了吗?如何防止信息泄露
  8. flutter复制口令返回app监听粘贴板,类似App助力
  9. NSI 脚本 -注册表操作无法正常找到的问题
  10. excel poi导入,数字和日期格式校验