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 ...
随机推荐
- linux私有ftp搭建与创建新用户
一.私有ftp搭建 以后补充 1. 搭建 2.修改配置文件 二.创建新用户 在linux搭建好私有ftp后,默认存放目录是 /var/ftp/ 我们有时候需要给外部公司之类的用,但又不想让他们直接在 ...
- 《深入分析Java Web技术内幕》读后感(Session、cookie)
第10章 P263 理解Cookie 理解Session Session如何工作的
- 2、CDH组件安装
一.zookeeper 1.安装 继续->完成: 二.HDFS 1.安装 继续->完成: 三.yarn.hive 1.安装yarn 继续->完成: 2.安装hive 继续->完 ...
- HashMap为什么是线程不安全的
HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点.对链表而言,新加入的节点会从头结点加入. 我们来分析一下多线 ...
- C# 中的迭代器 yield关键字 提高性能和可读性
展示一个例子 IList<string> FindBobs(IEnumerable<string> names) { var bobs = new List<string ...
- go实现冒泡排序和快速排序
项目结构 冒泡排序算法,源文件bubblesort.go package bubblesort // 冒泡排序 func BubbleSort(values []int) { for i := 0; ...
- Go语言入门——数组、切片和映射
按照以往开一些专题的风格,第一篇一般都是“从HelloWorld开始” 但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了. ...
- Go语言调度器之盗取goroutine(17)
本文是<Go语言调度器源代码情景分析>系列的第17篇,也是第三章<Goroutine调度策略>的第2小节. 上一小节我们分析了从全局运行队列与工作线程的本地运行队列获取goro ...
- poj1088滑雪最短路径
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 97281 Accepted: 36886 Description ...
- 一些unity资源
雨凇解包 http://www.xuanyusong.com/archives/3618 http://www.cnblogs.com/lixiang-share/p/5840444.html u3d ...