noip模拟18
\(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\)

放眼望去前十被我弃掉的 \(t2\) 基本都上85了……
开考就以为 \(t2\) 是个大毒瘤模拟,而且不会读入,根本没多想
还好 \(t1\)、\(t3\) 挂分不多,要不然又是考很砸的一场
A. 导弹袭击
考场上看见像凸包,连推柿子带胡猜了好几种都不对
正解是这样的:
柿子是 \(\displaystyle t=\frac{A}{a_i}+\frac{B}{b_i}\)
那么应该把每个点的横纵坐标取个倒数,所以 \(t=Ax+By\)
那么 \(\displaystyle y=-\frac{A}{B}x+\frac{t}{B}\)
转化成了斜率优化经典式,斜率为负要使截距最大,那么维护下凸包即可
这道题比较卡精度,把斜率式换一下,写成:
\]
还有一个小优化,如果一个导弹两个速度都小,那么一定不优,直接排除掉即可
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n,sta[maxn],tp,mx;
bool vis[maxn],flag[maxn];
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
struct P{
int x,y,id;
}a[maxn];
bool cmp(P a,P b){
return a.x==b.x?a.y>b.y:a.x>b.x;
}
double slope(int i,int j){
return 1.0*a[i].x*a[j].x*(a[i].y-a[j].y)/(1.0*a[i].y*a[j].y*(a[i].x-a[j].x));
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
a[i].x=read();
a[i].y=read();
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
mx=0;
for(int i=1;i<=n;i++){
if(a[i].y>mx){
vis[i]=true;
mx=a[i].y;
}
}
sta[++tp]=1;
for(int i=2;i<=n;i++){
if(!vis[i])continue;
if(slope(i,sta[tp])>0)continue;
// cout<<i<<" ";
while(tp>1&&slope(i,sta[tp])<slope(sta[tp-1],sta[tp]))tp--;
sta[++tp]=i;
}
for(int i=1;i<=tp;i++){
flag[a[sta[i]].id]=true;
for(int j=sta[i]+1;j<=n&&a[j].x==a[sta[i]].x&&a[j].y==a[sta[i]].y;j++)flag[a[j].id]=true;
}
for(int i=1;i<=n;i++){
if(flag[i])printf("%d ",i);
}
return 0;
}
/*
7
6 6
5 7
3 13
4 12
2 13
12 4
3 13
*/
B. 炼金术士的疑惑
第一眼看上去什么奇奇怪怪的东西以为是个大模拟,再加上奇奇怪怪的读入我很有自信读人写不出来,于是这道题基本没想,就最后十分钟水了个15分的暴力
正解是高斯消元,把每个方程式都可以看成一些未知数加减的方程,答案也是一个要求得数的方程
那么把系数写成矩阵进行高斯消元,并把答案的系数也顺便消掉
由于保证有解,最后一行未知数系数一定会被消成零,那么此时等号右边的数的相反数即为答案
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=300;
const double eps=1e-10;
int n,m,tot,op;
double a[maxn][maxn],val[maxn],x;
string s;
char c[10];
map<string,int>mp;
double fabs(double x){
if(x<0)return -x;
return x;
}
void gauss(){
for(int i=1;i<=n-1;i++){
int mx=i;
for(int j=i+1;j<=n-1;j++){
if(fabs(a[j][i])>fabs(a[mx][i]))mx=j;
}
swap(a[i],a[mx]);
if(fabs(a[i][i])<eps)continue;
double chu=a[i][i];
for(int j=i;j<=m;j++){
a[i][j]/=chu;
}
for(int j=1;j<=n;j++){
if(i==j)continue;
chu=a[j][i]/a[i][i];
for(int k=i;k<=m;k++){
a[j][k]-=a[i][k]*chu;
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<a[i][j]<<" ";
// }
// cout<<endl;
// }
}
}
int main(){
cin>>n;
int t=n;
for(int i=1;i<=n+1;i++){
op=1;
while(1){
cin>>x;
cin>>s;
if(mp.find(s)==mp.end()){
mp[s]=++tot;
a[i][tot]=x*op;
}
else{
a[i][mp[s]]=x*op;
}
scanf("%s",c+1);
if(c[1]=='=')op=-1;
if(c[1]=='H'&&c[2]=='=')break;
}
if(i!=n+1)cin>>val[i];
}
m=tot+1;
for(int i=1;i<=n;i++){
a[i][m]=val[i];
}
n++;
gauss();
a[n][m]=-a[n][m];
// cout<<a[n][m]<<endl;
if(a[n][m]>=-0.09&&a[n][m]<=0)cout<<"0.0";
else printf("%.1lf",a[n][m]);
return 0;
}
/*
2
1 C + 1 O2 = 1 CO2 H= -393.5
1 CO + 0.5 O2 = 1 CO2 H= -283.0
2 C + 1 O2 = 2 CO H= ?
*/
C. 老司机的狂欢
考场上想到二分,想到了按 \(x\) 轴排序后 \(dp\),但是转移状态条件太复杂,没有优化空间
由于二分完时间已知,那么每个人的终点位置已知,那么如果两人相撞,一定形成逆序对,于是转化成 \(LIS\) 问题。
后半部分才是最毒瘤的,因为排过序,所以不能贪心地从上一个转移,题解介绍了神奇的倍增法
由于 \(LIS\) 的最优转移形成了一棵树,从根节点到这个节点的链即为答案的字典序,那么要比较字典序即是比较链上最小值,排除 \(LCA\) 以上的部分,从分叉处开始比较
这是经典的树上倍增问题
代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
const int maxn=2e5+5;
int n,k,f[maxn],sta[maxn],tp,c1[maxn],tot,lsh[maxn],b[maxn];
bool flag;
struct Driver{
int x,a,id;
}d[maxn];
bool cmp(Driver a,Driver b){
return a.x<b.x;
}
int ask1(int x){
int ans=0;
for(;x;x-=x&-x)ans=max(ans,c1[x]);
return ans;
}
void add1(int x,int w){
for(;x<=tot;x+=x&-x)c1[x]=max(c1[x],w);
return ;
}
bool check(int t){
memset(c1,0,sizeof c1);
int mx=0;
for(int i=1;i<=n;i++){
lsh[i]=b[i]=2*d[i].x+d[i].a*t*t;
}
sort(lsh+1,lsh+n+1);
tot=unique(lsh+1,lsh+n+1)-lsh-1;
for(int i=1;i<=n;i++){
b[i]=lower_bound(lsh+1,lsh+tot+1,b[i])-lsh;
}
for(int i=1;i<=n;i++){
int x=ask1(b[i]-1)+1;
add1(b[i],x);
mx=max(mx,x);
}
if(mx>=k){
if(mx>k)flag=true;
else flag=false;
return true;
}
return false;
}
struct Node{
int dis,id;
Node(){}
Node(int x,int y):dis(x),id(y){}
}c[maxn];
int fa[maxn][25],minn[maxn][25];
bool operator < (const Node &aa,const Node &bb){
if(aa.dis!=bb.dis)return aa.dis<bb.dis;
int xx=aa.id;
int yy=bb.id;
int mina=aa.id,minb=bb.id;
for(int i=20;i>=0;i--){
if(fa[xx][i]!=fa[yy][i]){
mina=min(mina,minn[xx][i]);
minb=min(minb,minn[yy][i]);
xx=fa[xx][i];
yy=fa[yy][i];
}
}
return mina>minb;
}
Node ask(int x){
Node ans=Node(0,0);
for(;x;x-=x&-x)ans=max(ans,c[x]);
return ans;
}
void add(int x,Node w){
for(;x<=tot;x+=x&-x)c[x]=max(c[x],w);
return ;
}
void solve(int t){
for(int i=1;i<=n;i++){
lsh[i]=b[i]=2*d[i].x+d[i].a*t*t;
}
sort(lsh+1,lsh+n+1);
tot=unique(lsh+1,lsh+n+1)-lsh-1;
for(int i=1;i<=n;i++){
b[i]=lower_bound(lsh+1,lsh+tot+1,b[i])-lsh;
// cout<<b[i]<<" ";
}
for(int i=1;i<=n;i++){
Node x=ask(b[i]-1);
fa[d[i].id][0]=minn[d[i].id][0]=x.id;
for(int j=1;j<=20;j++){
fa[d[i].id][j]=fa[fa[d[i].id][j-1]][j-1];
minn[d[i].id][j]=min(minn[fa[d[i].id][j-1]][j-1],minn[d[i].id][j-1]);
}
// cout<<i<<" "<<x.id<<" "<<x.dis<<endl;
Node y=Node(x.dis+1,d[i].id);
add(b[i],y);
}
int x=ask(n).id;
while(x){
sta[++tp]=x;
x=fa[x][0];
}
sort(sta+1,sta+tp+1);
for(int i=1;i<=tp;i++){
printf("%d\n",sta[i]);
}
return ;
}
signed main(){
// freopen("my.out","w",stdout);
n=read();
k=read();
for(int i=1;i<=n;i++){
d[i].x=read();
d[i].a=read();
d[i].id=i;
}
sort(d+1,d+n+1,cmp);
int l=0,r=86400,last=0;
while(l<r){
int mid=l+r+1>>1ll;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<l<<endl;
if(flag){
puts("-1");
return 0;
}
solve(l);
return 0;
}
/*
4 3
-69 2
75 -2
-85 1
96 -1
*/
\(\color{white}{\mathbb{拣尽寒枝不肯栖,寂寞沙洲冷。}}\)
noip模拟18的更多相关文章
- NOIP模拟 18
这次时间分配不合理,沉迷大模拟无法自拔 虽然A了但是根本就没给T3留时间555 T3如果有时间看看数据范围应该可以想到QJ掉20分的555 T1 引子 打这题的时候感觉自己在做图像处理.. 然后调了各 ...
- Noip模拟18 2021.7.17 (文化课专场)
T1 导弹袭击(数学) 显然,我们要找到最优的A,B使得一组a,b优于其他组那么可以列出: $\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B} ...
- NOIP模拟18 T2
不知道为什么很多人拒绝这题打搜索...其实搜索在充分剪枝后时间是非常优秀的,不管数据怎样基本都可跑出 首先一个显然结论:对于某种状态,他抓到的小精灵一定是一个连续的区间. 因此我们可以枚举这个区间的左 ...
- NOIP 模拟 $18\; \rm 老司机的狂欢$
题解 \(by\;zj\varphi\) 一道很有趣的题,我用的动态开点线段树和倍增 首先对于第一问,不难想到要二分,二分时间,因为时间长一定不会比时间短能跑的人多 那么如何 check,先将所有老司 ...
- NOIP 模拟 $18\; \rm 炼金术士的疑惑$
题解 \(by\;zj\varphi\) 高斯消元 根据高中化学知识,求解方程的就是一直方程凑出来的,焓值也一样 那么对于要求的方程和一直方程,我们做一次高斯消元,以每个物质为未知数,因为它保证有解, ...
- NOIP 模拟 $18\; \rm 导弹袭击$
题解 \(by\;zj\varphi\) 一道凸包题 对于每个导弹,它的飞行时间就是 \(tim=\frac{A}{a_i}+\frac{B}{b_i}\) 我们设 \(x=\frac{1}{a_i} ...
- NOIP模拟 17.8.18
NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
随机推荐
- 不想用Spring全家桶?试试这个国产JFinal框架
前言 逃离北上广从广州回老家南宁,入职这家公司用的技术是JFinal,借此机会得以学习这个国产的MVC框架,经过一段时间的学习,基于之前的经验搭建一个通用项目jfinal-demo jfinal-de ...
- python算法练习(1)抓交通肇事犯
抓交通肇事犯 1.问题描述 一辆卡车违反交通规则,撞人后逃跑.现场有三人目击该事件,但都没有记住车号,只记下了车号的一些特征.甲说:牌照的前两位数字是相同的:乙说:牌照的后两位数字是相同的,但与前两位 ...
- DC-7 靶机渗透测试
DC-7 渗透测试 冲冲冲,好好学习 .对管道符的理解加深了好多.最后提权时,遇到了点麻烦.想不懂一条命令为啥能执行生效,耗了一整天才算解决掉. 操作机:kali 172.66.66.129 靶机:D ...
- noi linux 2.0 体验
一.起因 下午,我打开 noi 官网准备报名 csp j/s,一看官网展板:"noi linux 2.0 发布" 我就兴奋了起来.(9 月 1 日起开始使用, 也就意味着 csp ...
- Android面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的pdf
在笔者面试这一个月,看了不少文章,也刷了不少面试题,但真正有深度,适合4年及以上Android高工的内容少之又少 在面试准备阶段,笔者准备了三个月左右的时间,结合相关资料及源码,完成了一系列的深度学习 ...
- 1.9 货仓选址问题——Python
题目描述 在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN. 现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品. 为了提高效率,求把货仓建在何处,可以使得货仓到每家商店 ...
- Java compareTo() 方法(转载)
Java compareTo() 方法 compareTo() 方法用于两种方式的比较: 字符串与对象进行比较. 按字典顺序比较两个字符串. 语法: int compareTo(Object o)// ...
- awk-08-综合例子
分析nginx日志 1.统计访问IP次数 2.统计访问IP大于10次的 3.统计访问IP次数,并取出前几的访问数 4.统计时间段访问最多的IP 5.统计访问最多的10个页面 6.统计每个 URL 数量 ...
- LDAP未授权访问学习
LDAP未授权访问学习 一.LDAP 介绍 LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP ...
- 常见web中间件漏洞(三)Nginx漏洞
nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,有 开源,内存占用少,并发能力强,自由模块化,支持epoll模型,可限制连接数,支持热部署,简单 ...