2017.10.4 QBXT 模拟赛
T1
维护一个单调栈
#include <iostream>
#include <cstdio>
#define N 500000
#define rep(a,b,c) for(int a=b;a<=c;++a)
#define Rep(a,b,c) for(int a=b;a>=c;--a)
using namespace std;
typedef long long LL;
int n,top,stack[N],num[N];
LL ans,h[N],a[N],R[N];
int main()
{
cin>>n;
rep(i,,n)
{
cin>>h[i]>>a[i],num[i]=i;
for(;h[stack[top]]<h[i]&⊤top--)
{
R[i]+=a[num[stack[top]]];
ans=max(ans,R[i]);
}
stack[++top]=i;
}
top=;
Rep(i,n,)
{
for(;h[stack[top]]<h[i]&⊤top--)
{
R[i]+=a[num[stack[top]]];
ans=max(ans,R[i]);
}
stack[++top]=i;
}
cout<<ans<<endl;
return ;
}
T2
二分
二分矩形的边长,然后我们再试着枚举左边界,通过左边界我们就可以知道右边界,同样通过右边界我们也可以知道左边界,然后我们再在通过左右边界来判断里面的糖果数是否足够,当然我们的上下也是有边界的,我们在当前左右所加的这个矩形里,如果糖果数不够c那么直接返回false,反之,我们在来判断一下在这个区间里每个糖果的y坐标排序,然后将这个糖果的y与他的前c个糖果的y比较,如果小于等于mid的话,说明在这样的长度里我们可以找到c个糖果。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
struct node {int x,y;} a[];
int C,n,L,R,mid,b[],o,i;
int cmp(node i,node j) {return i.x<j.x;}
int CMP(int i,int j) {return i<j;}
bool WORK(int l,int r)
{
if (r-l+<C) return false; o=;
for (int i=l; i<=r; i++) b[++o]=a[i].y;
sort(b+,b+o+,CMP);
for (int i=C; i<=o; i++)
if (b[i]-b[i-C+]<=mid) return true;
return false;
}
bool OK(int x)
{
int l=;
for (int i=; i<=n; i++)
{
if (a[i].x-a[l].x>x)
{
if (WORK(l,i-)) return true;
while (a[i].x-a[l].x>x) l++;
}
}
if (WORK(l,n)) return true;
return false;
}
int main()
{
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
scanf("%d%d",&C,&n);
for (i=; i<=n; i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+,a+n+,cmp);
L=; R=; mid=(L+R)/;
while (L<=R)
{
if (OK(mid)) {R=mid-; mid=(L+R)/;} else
{
L=mid+;
mid=(L+R)/;
}
}
cout<<L+;
return ;
}
T3
解析几何
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm> using namespace std;
const long double INF=(long double)*;
long double L,R,mid,ans,hh[];
int r,rr,i,n,MAX,X,Y,cnt,vv[],vv2[];
struct node2 {int t; long double l;} s[],S[];
struct node {int t,v;} t[];
int cmp(node i,node j) {return i.v<j.v || i.v==j.v && i.t>j.t;}
struct Node {long double x;int y,z;} p[];
int CMP(Node i,Node j) {return i.x<j.x;}
long double work(int x,long double y) {return (long double)t[x].v*y-hh[x];}
int main()
{
freopen("chase.in","r",stdin);
freopen("chase.out","w",stdout);
while ()
{
scanf("%d",&n);
// if (n==0) return 0;
MAX=;
for (i=; i<=n; i++)
{
scanf("%d%d",&t[i].t,&t[i].v);
MAX=max(MAX,t[i].t);
}
sort(t+,t+n+,cmp); int MIN=t[n].t;
for (i=n-; i>=; i--)
{
if (t[i].t>MIN) vv[i]=; else
MIN=t[i].t,vv[i]=;
}
for (i=; i<=n; i++) hh[i]=(long double)t[i].t*t[i].v;
r=; s[].l=MAX; s[].t=; s[].l=INF; vv[n]=;
for (i=; i<=n; i++)
if (!vv[i])
{
while (r && work(i,s[r].l)>=work(s[r].t,s[r].l)) r--;
if (!r) {r=; s[].l=MAX; s[].t=i; continue;}
L=s[r].l; R=s[r+].l; mid=(L+R)/2.0;
for (int I=; I<=; I++)
{
if (work(i,mid)>=work(s[r].t,mid)) {R=mid; mid=(L+R)/2.0;} else {L=mid; mid=(L+R)/2.0;}
}
s[++r].l=mid; s[r].t=i; s[r+].l=INF;
}
rr=; S[].l=MAX; S[].l=INF; S[].t=n;
MIN=t[].t;
for (i=; i<n; i++)
if (t[i].t<MIN) vv2[i]=; else
MIN=t[i].t,vv2[i]=;
for (i=n-; i>=; i--)
if (!vv2[i])
{
while (rr && work(i,S[rr].l)<=work(S[rr].t,S[rr].l)) rr--;
if (!rr) {rr=; S[].l=MAX; S[].t=i; continue;}
L=S[rr].l; R=S[rr+].l; mid=(L+R)/2.0;
for (int I=; I<=; I++)
{
if (work(i,mid)<=work(S[rr].t,mid)) {R=mid; mid=(L+R)/2.0;} else {L=mid; mid=(L+R)/2.0;}
}
S[++rr].l=mid; S[rr].t=i; S[rr+].l=INF;
}
cnt=;
for (i=; i<=r; i++) {p[++cnt].x=s[i].l; p[cnt].y=; p[cnt].z=s[i].t;}
for (i=; i<=rr; i++) {p[++cnt].x=S[i].l; p[cnt].y=; p[cnt].z=S[i].t;}
sort(p+,p+cnt+,CMP); X=Y=; ans=INF;
for (i=; i<=cnt; i++)
{
if (p[i].y==) X=p[i].z; else Y=p[i].z;
// printf("%.5f\n",(double)p[i].x);
if (X && Y) ans=min(ans,work(X,p[i].x)-work(Y,p[i].x));
}
printf("%.2f\n",fabs((double)ans));
return ;
}
}
2017.10.4 QBXT 模拟赛的更多相关文章
- 2017.10.7 QBXT 模拟赛
题目链接 T1 容斥原理,根据奇偶性进行加减 #include<iostream> #include<cstdio> using namespace std; typedef ...
- 2017.10.3 QBXT 模拟赛
题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...
- 2017.10.6 QBXT 模拟赛
题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...
- 2017.10.5 QBXT 模拟赛
题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...
- 2017.10.2 QBXT 模拟赛
题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...
- 2017.10.1 QBXT 模拟赛
题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2017.10.28 QB模拟赛 —— 下午
题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...
- 2017.10.28 QB模拟赛 —— 上午
题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set 死慢.. #include <cstdio> int t; long long p; int ma ...
随机推荐
- ObservableCollection排序
ObservableCollection没有自带的sort排序功能,那么可以写一个扩展方法: public static void Sort<T>(this ObservableColle ...
- FASTX-Toolkit组件用法
FASTX-Toolkit组件用法 Command Line Arguments FASTQ-to-FASTA FASTQ/A Quality Statistics FASTQ Quality cha ...
- 2019年第十届蓝桥杯国赛总结(JavaA组)
JavaA组国二,可以报销了~ JA死亡之组可不是盖的,rank12的排名还是拿不到国一啊(只有五个.. 出成绩的一刻波澜不惊,毕竟去年有国一了不慌哈哈哈 不过对我来说这个结果还算意料之外吧,毕竟大三 ...
- NOIP2015提高组 跳石头 ACM-ICPC2017香港 E(选择/移除+二分答案)
跳石头 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN ...
- ubuntu18.04安装opencv 3.4.1
github 地址: https://github.com/opencv/opencv 安装依赖 sudo apt-get install build-essential sudo apt--dev ...
- QxOrm 1.2.9 下载 以及编译方法 简介.
QxOrm 是一个基于QT开发的数据库方面的ORM库,功能很强大,是QT C++数据开发方面的好工具. 目前已经更新1.3.1 .但 不幸的是 它的官网http://www.qxorm.com/ 莫名 ...
- css border实现三角形
实现过程: 正常的border <div class="box"></div> .box { background: #ddd; width: 100px; ...
- php curl采集,服务器gzip压缩返回数据怎么办
一般服务器不会胡乱返回gzip压缩的数据,一般是客户端请求的头部里包含你浏览器能接受的压缩方式, Accept-Encoding:gzip,deflate,sdch 这里是gzip .deflat ...
- PHP SOAP 提交XML
<?php $xmldata = <<<EOT <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap. ...
- AGC001 C - Shorten Diameter【枚举】
一开始没看到要保证最后是树--所以一定要从叶子开始删 枚举重心,如果k是偶数,那么按当前重心提起来deep大于k/2的全都要切掉,这样枚举重心然后取min即可 奇数的话就是枚举直径中间的边,然后从两边 ...