P4751 H’s problem(h) 
时间: 1000ms / 空间: 655360KiB / Java类名: Main

背景

冬令营入学测试

描述

小H是一个喜欢逛街的女孩子,但是由于上了大学,DDL越来越多了,她不能一直都处于逛街的状态。为了让自己能够更加沉迷于学习,她规定一次逛街只逛T个单位的时间。

小H从1号店出发,从1号店走到第i号店需要花费ai的时间,这些店形成了一条直线,也就是说小H从第i号店走到第i+1号店需要花费的时间为a{i+1}-ai。若小H选择了第i号店并且进去逛,则会消耗bi的时间。对于第i家店,小H都对它有自己的看法。具体地,可以用ci来表示小H是否喜欢这家店。如果ci=1,则表示小H喜欢i号店,否则若ci=0,则表示小H不喜欢这家店。

小H想尽可能逛更多的店,但是她也有属于自己的目标,也就是说逛至少k家喜欢的店,在这个基础上,能逛的店越多越好。

小H现在想知道自己最多能逛多少店,当然若小H无论如何也逛不到k家喜欢的店,那么你输出-1就行了。

输入格式

第一行3个数n,T,k。

接下来一行n个数表示ai。

接下来一行n个数表示bi。

接下来一行n个数表示ci。

请在此填写输入格式

输出格式

输出一个数表示答案。

请在此填写输出格式

备注

输入样例

4 11 1

0 1 2 10

1 1 1 1

0 0 0 1

输出样例

1

数据范围

对于20%的数据n<=20。

对于40%的数据n<=1000。

对于100%的数据n<=100000,1<=T<=10^9,0<=k<=n,a1=0,a1<a2<…<an<=10^9,1<=bi<=10^9,0<=ci<=1,数据有梯度。


不知道为什么写错了不管了 我用的treap

标程动态开点的线段树也有的点TLE了....

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define lc t[x].l
#define rc t[x].r
const int N=1e5+;
typedef long long ll;
int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
struct node{
int l,r,size,w,rnd;
ll sv,sum,v;
}t[N];
int sz,root;
inline void update(int x){
t[x].size=t[lc].size+t[rc].size+t[x].w;
t[x].sum=t[lc].sum+t[rc].sum+t[x].sv;
}
inline void lturn(int &x){
int c=rc;rc=t[c].l;t[c].l=x;
update(x);update(c);x=c;
}
inline void rturn(int &x){
int c=lc;lc=t[c].r;t[c].r=x;
update(x);update(c);x=c;
}
void ins(int &x,int v){
if(!x){
x=++sz;
t[x].v=t[x].sv=t[x].sum=v;
t[x].rnd=rand();t[x].l=t[sz].r=;
t[x].w=t[x].size=;
return;
}
t[x].size++;t[x].sum+=v;
if(v==t[x].v) {t[x].w++;t[x].sv+=t[x].v;}
else if(v<t[x].v){
ins(lc,v);
if(t[lc].rnd<t[x].rnd) rturn(x);
}else{
ins(rc,v);
if(t[rc].rnd<t[x].rnd) lturn(x);
}
}
void print(int x){
if(lc) print(lc);
printf("tree %d %d %d %d %d %d\n",x,t[x].v,t[x].sv,t[x].sum,t[x].size,t[x].w);
if(rc) print(rc);
}
inline ll que(int x,ll k){
if(x==) return ;
if(k<=t[lc].sum) return que(lc,k);
else if(k<=t[lc].sum+t[x].sv){
return t[lc].size+(k-t[lc].sum)/t[x].v;
}return t[lc].size+t[x].w+que(rc,k-t[lc].sum-t[x].sv);
}
int n,T,k,a[N],b[N],c[N],ans=-;
priority_queue<int,vector<int>,greater<int> > q;
void solve(){
for(int i=;i<=n;i++){
if(c[i]==){
q.push(b[i]); T-=b[i];
if(q.size()>k){
int _=q.top();q.pop();T+=_;
ins(root,_);
}
}else ins(root,b[i]);
//printf("hi %d %d %d %d\n",i,a[i],ans,que(root,T-a[i]));
if(q.size()==k&&T-a[i]>=) ans=max((ll)ans,k+que(root,T-a[i]));
}
//print(root);
printf("%d",ans);
}
int main(){
n=read();T=read();k=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) b[i]=read();
for(int i=;i<=n;i++) c[i]=read();
solve();
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof a)
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
ld eps=1e-;
ll pp=;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll read(){
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
//head
#define M 5000000
#define N 110000
ll T,sum1[M];
int sum2[M],lson[M],rson[M],k,kk,n,a[N],b[N],c[N],num,sum,ans,root;
void add(int &u,int l,int r,int x){
if(!u){
u=++num;
sum1[u]=sum2[u]=lson[u]=rson[u]=;
}
sum1[u]+=x;sum2[u]++;
if(l==r)return;
int mid=(l+r)/;
if(x<=mid) add(lson[u],l,mid,x);
else add(rson[u],mid+,r,x);
}
int find(int u,int l,int r,int t){
if(!u)return r;
if(sum1[u]<=t){sum+=sum2[u];return r;}
if(l==r){ return r-;
}
int mid=(l+r)/;
if(sum1[lson[u]]<=t){
sum+=sum2[lson[u]];
return find(rson[u],mid+,r,t-sum1[lson[u]]);
}
else return find(lson[u],l,mid,t);
}
int find2(int u,int l,int r,int t){
if(!u || sum2[u]==)return ;
if(l==r)return l;
int mid=(l+r)/;
if(t<=mid){
int tt=find2(lson[u],l,mid,t);
if(tt)return tt;
}
find2(rson[u],mid+,r,t);
return ;
}
ll Sum(int u,int l,int r,int x){
if(!u)return ;
if(x<l)return ;
if(x>=r)return sum1[u];
int mid=(l+r)/;
return Sum(lson[u],l,mid,x)+Sum(rson[u],mid+,r,x);
}
int d[N];
priority_queue<int> q1;
int main(){
//freopen("h10.in","r",stdin);
//freopen("h10.out","w",stdout);
// freopen("55.out","w",stdout);
n=read();T=read();kk=k=read();
rep(i,,n)a[i]=read();
rep(i,,n)b[i]=d[i]=read();
rep(i,,n)c[i]=read();
sort(d+,d+n+);
ll ss=;
// rep(i,1,30)ss+=d[i];
ans=-;
rep(i,,n){
// cout<<i<<endl;
T-=a[i]-a[i-];
if(c[i]){
k--;
q1.push(b[i]);
T-=b[i];
if(k<){
int tt=q1.top();
T+=tt;
q1.pop();
++k;
add(root,,,tt);
}
}
else add(root,,,b[i]); if(k== && T>=){
sum=;
int t=find(root,,,T);
if(sum1[root]>T){
int t2=find2(root,,,t+);
if(t2)sum+=(T-Sum(root,,,t))/t2;
}
ans=max(ans,sum+kk);
} }
cout<<ans<<endl;
return ;
}

标程

清北学堂入学测试P4751 H’s problem(h)的更多相关文章

  1. Tyvj2017清北冬令营入学测试

    P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背 ...

  2. 清北冬令营入学测试[ABCDEF]

    http://tyvj.cn/Contest/861 [1.2.2017] 像我这种蒟蒻只做了前6道还有道不会只拿了暴力分 A 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太 ...

  3. 清北学堂例题 LUOGU2519 【HAOI2011】PROBLEM A

    题目描述 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 输入格式 第一行一个整数n,接下来n行每行两个整数,第i+1行 ...

  4. 清北学堂例题 LUOGU2523【HAOI2011】problem c

    题目描述 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1 ...

  5. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  6. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  7. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  8. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  9. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

随机推荐

  1. 关于erlang的binary

    引自:http://cryolite.iteye.com/blog/1547252 1. binary数据是可以在不同进程间共享的 当然这些进程都在同一Erlang节点上. 这与普通term不同,后者 ...

  2. ThinkPHP框架基础

    ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...

  3. D - Digging(01背包,贪心)

    D - Digging Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit St ...

  4. 一个初学者的辛酸路程-Python基础-3

    前言 不要整天沉迷于学习-. 字典 一.我想跟你聊聊字典 1.为何要有字典? 大家有没有想过为什么要有字典?有列表不就可以了吗? 也许大家会这么认为,我给大家举个例子,大家就明白了. 比如说,我通讯录 ...

  5. asp下sha1加密函数

    sha1.asp文件 <script language="javascript" type="text/javascript" runat="s ...

  6. Redis使用详细教程

    Redis使用详细教程 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1.取最新N个 ...

  7. HDU - 1045 Fire Net(搜索)

    Description Suppose that we have a square city with straight streets. A map of a city is a square bo ...

  8. mysql分页的问题

    用过mysql的人肯定知道,mysql提供了原生的分页功能-----LIMIT关键字.LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须是 ...

  9. VBS一键配置VOIP脚本(其中包括VBS操作JS网页中的按钮事件--直接执行确认按钮中的脚本代码)

    Dim ws,fso,IESet IE = WScript.createobject("InternetExplorer.Application")Set ws = WScript ...

  10. Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)

    有在Linux系统中安装软件的经历的人都知道,在Linux系统中手动安装软件不想在Windows下安装软件那么方便,直接双击,然后下一步下一步就可以把软件成功的装入到系统中,而在Linux系统中,安装 ...