cf 424
Office Keys
首先显然有随人位置的递增,钥匙的位置也要递增,这样考虑两张做法:
1.$f(i,j)$ 表示前i个人,钥匙到第j个最少用的最大时间,然后$O(nK)$ dp
2.二分时间,对于每一个人选择当前能选择的最左面的钥匙 $O((n+K) logn)$
#include <bits/stdc++.h> #define LL long long const int N = ; using namespace std; int n,m,pre[N],a[N],b[N]; int Abs(int x)
{
if(x<) return -x;
return x;
} int p; bool check(int tim)
{
int j = ;
for(int i=;i<=n;i++)
{
while(j<=m && Abs(a[i]-b[j])+(LL)Abs(b[j]-p) > tim) j++;
if(j>m) return ;
else j++;
}
return ;
} int main()
{
int maxv = ;
scanf("%d%d%d",&n,&m,&p);
maxv = p;
for(int i=;i<=n;i++) scanf("%d",&a[i]), maxv = max(maxv ,a[i]);
for(int i=;i<=m;i++) scanf("%d",&b[i]), maxv = max(maxv, b[i]);
sort(a+,a+n+);
sort(b+,b+m+);
int l=, r=;
for(int i=;i<=n;i++) l = max(l, Abs(p-a[i]));
for(int i=;i<=n;i++) r = max(r, Abs(b[i]-a[i]) + Abs(p-b[i]));
while(r-l>)
{
int mid = (l+(LL)r)>>1LL;
if(check(mid)) r = mid;
else l = mid;
}
for(int i=l;i<=r;i++)
if(check(i))
{
cout<<i<<endl;
break;
}
return ;
}
Cards Sorting
方法1:直接用splay模拟。
方法2:考虑每次删掉当前最小数的代价是上一个最小数和它之间的循环dist,BIT或链表即可。
(取自CF)
#include <bits/stdc++.h> const int N = ;
#define INF 0x3f3f3f3f
#define LL long long using namespace std; struct node
{
node *ch[];
int v, sum, minv;
int cmp(int x)
{
if(ch[]->sum + == x) return -;
return x > ch[]->sum;
}
node* init(int x);
void update()
{
sum = ch[]->sum + ch[]->sum + ;
minv = min(v, min(ch[]->minv, ch[]->minv));
}
}spT[N], Null, *root; int tot=; node* node::init(int x)
{
v=x;
minv=x;
ch[]=ch[]=&Null;
sum=;
return this;
} node* build(int src[],int l,int r)
{
if(l==r) return spT[++tot].init(src[l]);
int mid=(l+r)>>;
node* tmp=spT[++tot].init(src[mid]);
if(l<mid) tmp->ch[]=build(src,l,mid-);
if(mid<r) tmp->ch[]=build(src,mid+,r);
tmp->update();
return tmp;
} void rot(node* &o,int x)
{
node* tmp=o->ch[x];
o->ch[x]=tmp->ch[x^];
tmp->ch[x^]=o;
o->update();
o=tmp;
o->update();
} void splay(node* &o,int k)
{
int t=o->cmp(k);
if(t==-) return;
if(t) k-=o->ch[]->sum+;
int t1=o->ch[t]->cmp(k);
if(~t1)
{
if(t1) k-=o->ch[t]->ch[]->sum+;
splay(o->ch[t]->ch[t1],k);
if(t1==t) rot(o,t);
else rot(o->ch[t],t1);
}
rot(o,t);
} int find_min(node *&o,int minv,int now)
{
if(o->ch[]->minv == minv) return find_min(o->ch[],minv,now);
else
{
if(o->v == minv) return now+o->ch[]->sum;
return find_min(o->ch[],minv,now+o->ch[]->sum+);
}
} int n,a[N]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
Null.minv = INF;
a[]=INF;
a[n+]=INF;
root = build(a,,n+);
int len = n+;
LL ans = ;
for(int i=;i<=n;i++)
{
int tmp = find_min(root,root->minv,);
ans += (LL)tmp;
splay(root,);
splay(root->ch[],tmp+);
node* tp = root->ch[]->ch[];
root->ch[]->ch[] = &Null;
root->ch[]->update();
root->update(); splay(tp,tp->sum);
tp = tp->ch[];
len--; splay(root,len-tp->sum);
splay(root->ch[],len-tp->sum-);
root->ch[]->ch[] = tp;
root->ch[]->update();
root->update();
}
cout << ans << endl;
return ;
}
Bamboo Partition
显然要满足的条件等价于
$\sum_{i=1}^n { [\frac{a_i + d - 1}{d}] \cdot d - a_i} \leq K$
$F(d) = \sum_{i=1}^n { [\frac{a_i - 1}{d}] + 1} \cdot d \leq K + \sum {a_i}$
固定 $\sum_{i=1}^n { [\frac{a_i - 1}{d}] + 1}$,从而 $F(d)$ 单调。
对于前者直接找出所有得数相同的 $d$ 的区间,逐一计算即可。
复杂度$O(n^2 \sqrt {a_i} )$
通过调参可以 $O(n \sqrt {a_{max} n})$
#include <bits/stdc++.h> #define LL long long const int N = ; using namespace std; int n,tot,a[N];
LL K;
vector<int> v; int main()
{
cin>>n>>K;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
K += (LL)a[i];
int j=;
int tmp = a[i]-;
if(tmp>)
{
for(int i=;i<=tmp;i=j+)
j = tmp/(tmp/i), v.push_back(i);
v.push_back(tmp+);
}
}
v.push_back();
sort(v.begin(),v.end());
v.resize(distance(v.begin(), unique(v.begin(), v.end())));
LL ans = , sum;
for(int i=;i<(int)v.size() - ;i++)
{
int l = v[i], r = v[i+]-;
sum = ;
for(int j=;j<=n;j++) sum += (a[j]-1LL)/l + 1LL;
LL tmp = min(K/sum, (LL)r);
if(tmp>=l) ans = tmp;
}
LL l = v[v.size()-];
LL tmp = K/n;
if(tmp >= l) ans = tmp;
cout << ans << endl;
}
cf 424的更多相关文章
- CF Round #424 Div.2 D
n个人拿K个钥匙中的n个然后到办公室(点p) 问最少需要的时间是多少 先排序 如果j<=i 则必须拿这个钥匙 dp[i][j]=max(dp[i-1][j-1],abs(p-b[j])+abs( ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- CF memsql Start[c]UP 2.0 A
CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...
- CF memsql Start[c]UP 2.0 B
CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...
- CF #376 (Div. 2) C. dfs
1.CF #376 (Div. 2) C. Socks dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...
随机推荐
- C++编译错误 2001 1120
无法解析的外部符号"symbol" 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 该错误信息之后为错误 LNK1120. 可能的原因 : 在将托管库或 W ...
- hdu5387(2015多校8)--Clock(模拟)
题目链接:点击打开链接 题目大意:给出一个时间,问在钟表上这个时间的时候.时针和分针的角度,时针和秒针的角度.分针和秒针的角度.假设不是整数以分数的形式输出. 假设依照最小的格来算,那么: 1s对于秒 ...
- Fedora25 下 OpenCV2.4.12 的安装
你必须非常努力,才能看起来毫不费力.---------------感谢原作者的分享. opencv官网上面给出的 linux 下安装方式,基本上都是通过编译源码,即下载代码, cmake->ma ...
- 分布式开源调度框架TBSchedule原理与应用
主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...
- 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash
[BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...
- 安卓Android手机直播推送同步录像功能设计与实现源码
本文转自:http://blog.csdn.net/jyt0551/article/details/58714595 EasyPusher是一款非常棒的推送客户端.稳定.高效.低延迟,音视频同步等都特 ...
- jvm -Xms -Xmx
1 -Xms -X表示这是一个“-X”参数,m即memory,s即start,这个是jvm初始可以使用的整个堆的大小. 2 -Xmx x表示max,jvm最大可以使用的整个堆的大小. 3 oracle ...
- mysql-test-run.pl
wget https://raw.githubusercontent.com/mysql/mysql-server/5.7/mysql-test/mysql-test-run.pl
- 高速排序及优化(Java版)
高速排序(Quicksort)是对冒泡排序的一种改进. 高速排序由C. A. R. Hoare在1962年提出. 一次高速排序具体过程: 选择数组第一个值作为枢轴值. 代码实现: package Qu ...
- HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
[题目链接]:pid=2444">click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则 ...