2019.08.17【NOIP提高组】模拟 A 组 比赛总结
比赛地址: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−x2y1−y2
(虽然一开始我以为 k = x 1 − x 2 y 1 − y 2 k=\cfrac{x_1-x_2}{y_1-y_2} k=y1−y2x1−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(nlog2n)。
第二题显然是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 组 比赛总结相关推荐
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结
2020.08.08[NOIP提高组]模拟:奶牛的图片 总结 Description Farmer John希望给他的 N ( 1 ≤ N ≤ 100 , 000 ) N(1\leq N\leq100 ...
- 2019.08.17【NOIP?提高组】模拟 A 组 总结
(今天标题验证NOIP取消了吗...) 心态巨崩 考场:\(50 + 20 + 0 = 70\) T1: 考场上推式子,看能否有仅包含一个点的值. 然后推到后面推出来一个用\(abs(Q(y1-y2) ...
- 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 ...
- JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...
- 【二分,找规律】Day 14 提高组模拟C组 T1 小麦亩产一千八
题目大意 给定斐波那契的第aaa项,求出第b" role="presentation">bbb项,默认第0项为1 解题思路 方法一:递推 找到规律后O(b)O(b) ...
- 2019.08.17 Webpack4 bilibi
将这些依赖打包吗? es6转es5,将sass,less,转成css.文件优化:压缩代码体积,合并文件. 代码分割:公共模块的处理,路由懒加载功能.模块合并:功能模块分类 自动刷新 这些恨过的静态资源 ...
- 第一届『Citric杯』NOIP提高组模拟赛 题解
[官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...
- JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树
梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...
最新文章
- pandas使用fillna函数将dataframe中缺失值替换为空字符串(replace missing value with blank string in dataframe)
- xgboost 的 get_fscore()
- SQL 查询语句总是先执行 SELECT?
- VUE计算属性关键词: computed
- 关于SAP CRM Organization Unit组织结构单元自动决定的一些调试
- 云顶之弈机器人法爆_云顶之弈10.16b机器人阵容推荐 云顶之弈10.16b机器人娱乐阵容玩法攻略...
- [html] img中的src加载失败时如何用默认图片来替换呢?
- [剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]
- 《Python Cookbook 3rd》笔记(4.1):手动遍历迭代器
- 图论算法(一)--最短路径的DFS/BFS解法(JAVA )
- SlickEdit完美解析Qt4
- Java 11 将至,不妨了解一下 Oracle JDK 之外的版本
- (转)Scala中协变(+)、逆变(-)、上界(:)、下界(:)简单介绍
- SQL server 表数据改变触发发送邮件
- 百旺如何看是否清卡_【问吧】如何查看是否清卡成功,出现这些问题,如何处理?...
- 打新股和打新债有什么区别?
- python车辆定位调度管理系统,基于django+twisted
- 数据仓库DW、ODS、DM概念及其区别
- csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作
- 我的世界服务器无限箱子,MC:服务器这个op漏洞,钻石堆满整个箱子,你不懂单机的乐趣...
热门文章
- 信访分析 大数据_【信访微观察】“大数据”有多火?化解信访矛盾也用上了它!...
- 一台电脑能运行两个mysql数据库_一台电脑可以同时装两个带有SQL数据库的软件吗...
- virsh查询虚拟机列表
- Three开发笔记(二)
- 导出cvs文件格式数据
- xenapp6.5上安装完smartauditor后,Appcenter检测失败
- 大数据时代之痛,你“裸奔”了吗?如何防止信息泄露
- flutter复制口令返回app监听粘贴板,类似App助力
- NSI 脚本 -注册表操作无法正常找到的问题
- excel poi导入,数字和日期格式校验