考前

从小饭桌出来正好遇到雨下到最大,有伞但还是湿透了

路上看到一个猛男搏击暴风雨

到了机房收拾了半天才开始考试

ys 他们小饭桌十分明智地在小饭桌看题,雨下小了才来

考场

状态很差。

开题,一点想法都没有

T1 尝试推出 \(\frac AB\) 的范围,结果因为忘记不等式同乘负数要编号卡了好久。看最终的式子有点像凸包,但不知道怎么用

一看 T2 人都傻了,现场学习盖斯定律,仔细想想 whk 怎么算这个东西,想起来一次周练 5 道题错了 4 个。靠 \(n,m\le200\) 和样例解释猜出是高斯消元,回头再看吧

T3 莫名熟悉,但并不影响我只会暴力。甚至没想到二分答案

不记得什么时候开始写的了,只记得 T1 调了好久,打了一堆补丁,要是没有大样例绝对爆 \(0\) 了。T3 的暴力写的比较顺,\(k=1\) 的分也好拿,但 \(k=n\) 的没什么思路。

16.50 开始看 T2,手模高斯消元确认无误后开始写,但忘了很多,一直到 \(17.30\) 才写完,过了所有样例。

继续想 T3 \(k=n\) 的做法,还是不会,打了随机化贪心,竟然过了样例?!

res

rk3 30+85+30

T1 还是少个特判

T2 高斯消元板子挂了

T3 暴力挂了一个点,但随机化贪心过了一个。。。

感觉这场策略有点问题,应该先写 T2 正解(毕竟不难写)。T1 浪费了不少时间,反而 T2 没写多久,如果考场上没写出高斯消元就爆 \(0\) 了,连骗分都没时间写。

rk1 yzf 100+80+0

rk4 王天泽 20+95+5

rk12 wcr 10+0+70

导弹袭击

时间 \(t=\frac Aa+\frac Bb\),把 \((\frac 1a,\frac 1b)\) 看做点,变形得到 \(y=-\frac ABx+\frac tB\),要求一个 \(A,B\) 使 \(t\) 最小,即存在 \(\frac AB\) 使这个一次函数在 \((\frac 1a,\frac 1b)\) 处截距最小,这样的点构成了一个左下凸包(斜率为负),单调栈维护即可。

注意 \(a,b\) 很大而分子为 \(1\),因此精度掉的很多,那么只在算斜率时转成 long double,其他时候用 int

注意去重和先排掉一定不优的答案(\(a,b\) 都比另一个小 \(a,b\))

int
const int N = 3e5+5;
int n;
struct Node {
int a,b,id;
} p[N]; const LD eps = 1e-15;
int tp,stk[N];
bool vis[N],ans[N]; bool equ(LD x,LD y) { return fabs(x-y) < eps; }
LD K(int i,int j)
{ return (LD)p[i].a*p[j].a*(p[i].b-p[j].b)/p[i].b/p[j].b/(p[i].a-p[j].a); } signed main() {
read(n);
For(i,1,n) read(p[i].a,p[i].b), p[i].id = i;
sort(p+1,p+n+1,
[](const Node &x,const Node &y){return x.a!=y.a?x.a>y.a:x.b>y.b;});
int mxb = 0;
For(i,1,n)
if( p[i].b <= mxb ) vis[i] = 1;
else mxb = p[i].b;
stk[++tp] = 1;
For(i,2,n) {
if( vis[i] || (tp && K(stk[tp],i) > 0) ) continue;
while( tp > 1 && K(stk[tp],i)+eps < K(stk[tp],stk[tp-1]) ) --tp;
stk[++tp] = i;
}
for(int t; t = stk[tp], tp; --tp) {
ans[p[t].id] = 1;
for(int i = t+1; i <= n && p[i].a==p[t].a&&p[i].b==p[t].b; ++i)
ans[p[i].id] = 1;
}
For(i,1,n) if( ans[i] ) write(i,' ');
return ioclear();
}
double(yzf 的考场代码)
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
int ret=0;char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')ret=(ret<<3)+(ret<<1)+(c^48),c=getchar();
return ret;
}
const int maxn=3e5+5;
const double eps=1e-30;
int n;
struct point
{
double x,y;int num;
const bool operator <(const point &a)const{if(x!=a.x)return x>a.x;return y>a.y;}
const bool operator ==(const point &a)const{return x==a.x&&y==a.y;}
friend bool judge(point a,point b,point c){return c.x*a.y*(a.x-b.x)*(b.y-c.y)<c.y*a.x*(a.y-b.y)*(b.x-c.x);}
}p[maxn];
bool used[maxn];int sta[maxn],top;
int ans[maxn],cnt;
int main()
{
n=read();
for(int i=1;i<=n;i++)p[i].x=read(),p[i].y=read(),p[i].num=i;
sort(p+1,p+n+1);
for(int i=1;i<=n;i++)
{
if(top&&p[sta[top]]==p[i])continue;
if(top&&p[i].y<=p[sta[top]].y)continue;
while(top>=2&&judge(p[sta[top-1]],p[sta[top]],p[i]))used[sta[top--]]=0;
used[sta[++top]=i]=1;
}
for(int i=2;i<=n;i++)
if(p[i]==p[i-1]&&used[i-1])used[i]=1;
for(int i=1;i<=n;i++)if(used[i])ans[++cnt]=p[i].num;
sort(ans+1,ans+cnt+1);
for(int i=1;i<=cnt;i++)printf("%d ",ans[i]);
return 0;
}

炼金术士的疑惑

官方题解有严格证明。

感性理解:

把每个物质的内能看做未知量,显然 \(\Delta H\) 与方程式可以一起消,那么消元时对要求解的方程一起操作,等要求解的方程各系数都消成 \(0\) 时取常数项的相反数就是答案

code
const int N = 205;
int n; const double eps = 1e-8;
int m;
double a[N][N];
map<string,int> mp; void debug() {
For(i,1,n+1) {
For(j,1,m+1) cout<<a[i][j]<<' ';
cout<<endl;
}
cout<<endl;
} bool equ(double x,double y) { return fabs(x-y) < eps; }
bool check() {
For(i,1,m) if( !equ(a[n+1][i],0) ) return 0;
return 1;
} signed main() {
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
For(i,1,n+1) {
for(int f = 1;;) {
double x; string y; cin>>x>>y;
if( !mp.count(y) ) mp[y] = ++m;
a[i][mp[y]] = f*x;
cin>>y;
if( y == "=" ) f = -1;
else if( y == "H=" ) break;
}
if( i != n+1 ) cin>>a[i][201];
}
m = 200;
For(i,1,m) {
int p = i;
For(j,i+1,n) if( fabs(a[j][i]) > fabs(a[p][i]) ) p = j;
if( p != i ) swap(a[i],a[p]);
rFor(j,m+1,i) a[i][j] /= a[i][i];
For(j,1,n+1) if( j != i )
rFor(k,m+1,i) a[j][k] -= a[j][i] * a[i][k];
if( check() ) break;
}
printf("%.1Lf",equ(a[n+1][m+1],0) ? 0 : -a[n+1][m+1]);
return 0;
}

老司机的狂欢

考虑二分答案。

将司机按初始位置排序,check 时先求出结束位置,在对结束位置求 LIS(LIS 中的司机不会相遇),若 LIS 长度小于 \(k\) 则缩小答案。时间复杂度 \(O(n\log n\log86400)\)。

确定答案后再求 LIS,若长度大于 \(k\) 则为 \(-1\),否则考虑构造字典序最小的方案。

转移时对于 LIS 长度相同的位置,如果从前往后一个一个比显然会 TLE,但我们可以用倍增加速这个过程。(如果把转移看成一颗树,那就相当于在倍增求 LCA 的过程中算两种方案不同的部分中各自最小的位置)

写的时候注意边界、编号

code
const int N = 1e5+5;

template<class T>
class BIT {
private:
int n,ind,tag[N];
T zero,t[N];
int lowbit(int x) { return x&-x; }
public:
void init(int x,T y) { n = x, zero = y; ++ind; }
void add(int i,T x) {
for(; i <= n; i += lowbit(i)) {
if( tag[i] != ind ) t[i] = zero, tag[i] = ind;
t[i] = max(t[i],x);
}
}
T query(int i) {
T res = zero;
for(; i; i -= lowbit(i)) {
if( tag[i] != ind ) t[i] = zero, tag[i] = ind;
res = max(res,t[i]);
}
return res;
}
}; int n,k;
struct Driver {
LL x,a;
int id;
} d[N]; int fa[N][17],mn[N][17];
LL p[N],mp[N];
bool ans[N];
BIT<int> bit1;
struct Node {
int dep,pos;
Node (int dep=0,int pos=0):dep(dep),pos(pos){}
};
bool operator < (const Node &x,const Node &y) {
if( x.dep != y.dep ) return x.dep < y.dep;
int u = x.pos, v = y.pos, mnu = u, mnv = v;
rFor(i,16,0) if( fa[u][i] != fa[v][i] ) {
mnu = min(mnu,mn[u][i]), u = fa[u][i];
mnv = min(mnv,mn[v][i]), v = fa[v][i];
}
return mnu > mnv;
}
BIT<Node> bit2; void lsh(int t) {
For(i,1,n) p[i] = mp[i] = 2*d[i].x+d[i].a*t*t;
sort(mp+1,mp+n+1), mp[0] = unique(mp+1,mp+n+1)-mp-1;
For(i,1,n) p[i] = lower_bound(mp+1,mp+mp[0]+1,p[i])-mp;
}
int check(int t) {
lsh(t);
bit1.init(n,0);
For(i,1,n) bit1.add(p[i],bit1.query(p[i]-1)+1);
return bit1.query(n);
} signed main() {
read(n,k);
For(i,1,n) read(d[i].x,d[i].a), d[i].id = i;
sort(d+1,d+n+1,[](const Driver &x,const Driver &y){return x.x<y.x;});
int l = 0, r = 86400;
while( l < r ) {
int mid = l+r+1>>1;
if( check(mid) < k ) r = mid-1;
else l = mid;
}
write(l);
if( check(l) > k ) { write(-1); return iocl(); }
memset(mn,0x3f,sizeof mn);
lsh(l);
bit2.init(n,Node(0,0));
For(i,1,n) {
Node pre = bit2.query(p[i]-1);
int u = d[i].id;
fa[u][0] = mn[u][0] = pre.pos;
For(j,1,16) fa[u][j] = fa[fa[u][j-1]][j-1],
mn[u][j] = min(mn[u][j-1],mn[fa[u][j-1]][j-1]);
bit2.add(p[i],Node(pre.dep+1,u));
}
for(int i = bit2.query(n).pos; i; i = fa[i][0]) ans[i] = 1;
For(i,1,n) if( ans[i] ) write(i);
return iocl();
}

20210717 noip18的更多相关文章

  1. [考试总结]noip18

    发现之前咕掉了这个考试的总结. 今天就把它给补上. 这也是一个炸裂的一场 开局以为 \(T1\) 可做,然而事实证明我又错了... 莽了一个随机化上去,轻松过了所有样例... 以为稳了 然而挂掉了.. ...

  2. noip18

    T1 来自cf原题 考场直接暴力枚举 \(A,B\),15pts. 正解: 首先时间的表达式,\(T=\frac{A}{a_{i}}+\frac{B}{b_{i}}\),然后以\(\frac{1}{a ...

  3. 动态dp初探

    动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...

  4. 调用免费API查询全年工作日、周末、法定节假日、节假日调休补班数据

    前言 日常开发中,难免会用到判断今天是工作日.周末.法定节假日.节假日调休补班做一些业务处理,例如:仅在上班时间给用户推送消息.本文记录调用免费API查询全年工作日.周末.法定节假日.节假日调休补班数 ...

  5. Spring 的循环依赖问题

    什么是循环依赖 什么是循环依赖呢?可以把它拆分成循环和依赖两个部分来看,循环是指计算机领域中的循环,执行流程形成闭合回路:依赖就是完成这个动作的前提准备条件,和我们平常说的依赖大体上含义一致.放到 S ...

  6. Java 中节省 90% 时间的常用的工具类

    前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...

  7. Javas数组03——数组的使用

    Javas数组--数组的使用 1.普通的for循环 2.for-each循环 3.数组做方法入参 4.数组做返回值 例子1--普通for循环  package array; ​ public clas ...

  8. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  9. 基于Spring MVC + Spring + MyBatis的【医院就诊挂号系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/21727306 一.语言和环境 1.实现语言: JAVA语言. 2.环境要求: MyE ...

随机推荐

  1. raven靶机

    仅供个人娱乐 靶机信息 Raven 下载地址:https://www.vulnhub.com/entry/raven-1,256/ 一.主机探测 端口信息 目录扫描 80端口 根据页面开始搜寻有用的信 ...

  2. TypeScript学习笔记(三)泛型、模块化和命名空间

    目录 一.泛型 1. 泛型函数 2. 泛型类 3. 泛型接口 写法一 写法二 两种写法的区别 二.模块化 1. export写法一 2. export写法二 3. 为引入的方法或变量起别名 4. ex ...

  3. Cell Reports | 上海瑞金医院糜坚青等揭示组蛋白酰化/乙酰化修饰比率调控BRD4基因组分布

    ​ 景杰生物 | 报道 组蛋白翻译后修饰,被认为构成一类超越基因序列的"组蛋白密码",控制着遗传信息的组织层次及其在染色质层面的解读.组蛋白赖氨酸乙酰化是研究最早的一类组蛋白修饰, ...

  4. 如何看待Android开发的“前景和内卷”

    我们首先来意淫一波 5G时代Android即将崛起,Android将与物联网强强联合,配合上5G信息高速传递的模式,再搭配物联网号召的"万物互通"的旗号,同时各位Android开发 ...

  5. Android程序员提加薪被拒,刷2000题跳槽涨薪50%!

    为什么想跳槽? 简单说一下当时的状况,我在这家公司做了两年多,这两年多完成了一个大项目,作为开发的核心主力,开发压力很大,特别是项目上线前的几个月是非常辛苦,几乎每晚都要加班到12点以后,周末最多只有 ...

  6. js中其他数据类型的值转为字符串的相关总结

    有这样一个面试题: 此题考查的是其他类型的值转换为字符串后的结果 下面我们就由此来总结一下其他类型的值转为字符串后的值都是什么? 从上面的实例可以看出,基本数据类型的值转换成字符串都如我们预期的那样. ...

  7. CSS Grid 布局(Grid Layout)完全指南 #flight.Archives003

    Title/ CSS Grid 布局(Grid Layout)完全指南 #flight.Archives003 序 : 写完这篇文章后,我准备一直做下去了,包括flight的各个分区,也看到前方的路. ...

  8. 记录一次mysql的安装之旅

    mysql作为日常开发中常用到的数据库,对每个程序员来说至关重要,今天就跟着我来进行一次mysql的安装之旅吧. 一.安装 1.安装包的方式 1.1.获取安装包 对mysql有过接触的人来说,都知道m ...

  9. Postman API 接口测试、Jenkin 持续集成测试

    Postman 是一个创建和使用API的应用,Postman 对于Web开发者来说非常有用,Postman 带来的便利有很多,诸如: RESTFul接口测试不依赖其他端,进度不受影响 测试脚本即文档, ...

  10. linux的iptables设置

    添加规则 -A 在链末尾追加一条规则 -I 在链开头或某序号前插入一条规则 查看规则 -L 列出所有规则 -n 数字显示地址和端口信息 -v 详细信息 -line-numbers 显示规则序号 删除规 ...