还没有写完APIO2015的题目,打算今天写一写。

T1:

按位DP,DP时要保证已确定的位为0。

前4组设f[n][k]表示把前n个分成k组是否合法。

最后一组设g[n]表示把前n个最少分为多少组才符合题意。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
typedef long long ll;
int n,A,B,f[][],g[maxn];
ll t,S[maxn];
int check(int x) {
if(A==) {
g[]=;
rep(i,,n) {
g[i]=<<;
rep(j,,i-) if(!((S[i]-S[j])&t)) g[i]=min(g[i],g[j]+);
}
return g[n]<=B;
}
memset(f,,sizeof(f));
f[][]=;
rep(i,,n) rep(k,,B) rep(j,,i-) if(!((S[i]-S[j])&t)&&f[j][k-]) f[i][k]=;
rep(i,A,B) if(f[n][i]) return ;
return ;
}
int main() {
n=read();A=read();B=read();
rep(i,,n) S[i]=S[i-]+read();
ll ans=;
for(int i=;i>=;i--) {
t^=(1ll<<i);
if(!check(i)) ans^=(1ll<<i),t^=(1ll<<i);
}
printf("%lld\n",ans);
return ;
}

T3:

k=1时排序求中位数。

k=2时设垮桥的所有两点坐标分别为x1i,x2i。设桥修在了p1,p2的位置,对于每对点(x1,x2),当(x1+x2)/2接近p1时肯定走p1,(x1+x2)/2接近p2时肯定走p2。故将所有点对按x1+x2升序排序,这样肯定存在一条分割线,使得分割线左侧的走左边一座桥,分割线右侧的走右边一座桥。这样我们实现一个可以支持插入和查询中位数的数据结构即可。Treap什么的就行了,但我DB地用了动态开节点的线段树。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define rep(s,t) for(int i=s;i<=t;i++)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
inline char getc() {
char c=getchar();
while(!isalpha(c)) c=getchar();
return c;
}
const int maxn=;
typedef long long ll;
struct Point {
int x1,x2;
bool operator < (const Point& ths) const {return x1+x2<ths.x1+ths.x2;}
}A[maxn];
int k,n,tmp[maxn];
ll ans,mn=(1ll<<),f[maxn],g[maxn],sumv[];
int ls[],rs[],s[],ToT,root;
void insert(int& o,int l,int r,int pos) {
if(!o) o=++ToT,s[o]=ls[o]=rs[o]=sumv[o]=;
s[o]++;sumv[o]+=pos;if(l==r) return;
int mid=l+r>>;
if(pos<=mid) insert(ls[o],l,mid,pos);
else insert(rs[o],mid+,r,pos);
}
int kth(int o,int l,int r,int k) {
if(l==r) return l;
int k2=s[ls[o]],mid=l+r>>;
if(k2>=k) return kth(ls[o],l,mid,k);
return kth(rs[o],mid+,r,k-k2);
}
ll tot,sum;
void query(int o,int l,int r,int ql,int qr) {
if(!o) return;
if(ql<=l&&r<=qr) {
tot+=s[o];sum+=sumv[o];
return;
}
int mid=l+r>>;
if(ql<=mid) query(ls[o],l,mid,ql,qr);
if(qr>mid) query(rs[o],mid+,r,ql,qr);
}
ll query(int o) {
if(!o) return ;
int v=kth(o,,,s[o]/);
ll ret=;
tot=sum=;query(o,,,,v);ret+=tot*v-sum;
tot=sum=;query(o,,,v,);ret-=tot*v-sum;
return ret;
}
int main() {
k=read();n=read();int t=;
rep(,n) {
char t1,t2;int x1,x2;
t1=getc();x1=read();t2=getc();x2=read();
if(t1==t2) ans+=abs(x1-x2);
else A[++t]=(Point){x1,x2};
}
n=t;sort(A+,A+n+);ans+=n;
if(k==) {
t=;
rep(,n) tmp[t++]=A[i].x1,tmp[t++]=A[i].x2;
sort(tmp,tmp+t);
rep(,t-) ans+=abs(tmp[t/]-tmp[i]);
printf("%lld\n",ans);
return ;
}
ToT=root=;
rep(,n) {
insert(root,,,A[i].x1);insert(root,,,A[i].x2);
f[i]=query(root);
}
ToT=root=;
for(int i=n;i;i--) {
g[i]=query(root);
insert(root,,,A[i].x1);insert(root,,,A[i].x2);
}
rep(,n) mn=min(mn,f[i]+g[i]);if(!n) mn=;
printf("%lld\n",ans+mn);
return ;
}

APIO2015的更多相关文章

  1. APIO2015题解

    分组赛讲课讲了APIO2015的题,于是回去就做完了 稍微写一点题解吧 bzoj4069 逐位处理的简单题,然后就是bool型dp 然后a=1 的时候可以把一位状态干掉 当一维状态单调且是bool型d ...

  2. bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑

    http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...

  3. [APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举

    [APIO2015]巴厘岛的雕塑  题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行 ...

  4. 【BZOJ4071】[Apio2015]巴邻旁之桥 Treap

    [BZOJ4071][Apio2015]巴邻旁之桥 Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 ...

  5. 洛谷 P3644 [APIO2015]八邻旁之桥 解题报告

    P3644 [APIO2015]八邻旁之桥 题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域\(A\)和区域\(B\). 每一块区域沿着河岸都建了恰好\(1000000001\)栋的建筑 ...

  6. bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图

    [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 644  Solved: 238[Submit][Status][D ...

  7. bzoj 4069 [Apio2015]巴厘岛的雕塑 dp

    [Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 494  Solved: 238[Submit][Status][Dis ...

  8. uoj #111. 【APIO2015】Jakarta Skyscrapers

    #111. [APIO2015]Jakarta Skyscrapers 印尼首都雅加达市有 NN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 00 到 N−1N−1.除了这 NN 座摩 ...

  9. bzoj4069【APIO2015】巴厘岛的雕塑

    4069: [Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 192  Solved: 89 [Submit][Stat ...

随机推荐

  1. Ubuntu上如何安装Java,Eclipse,Pydev,Python(自带,不用装),BeautifulSoup

    如何安装Java,如果出于编程的需要安装Java,需要安装的是JDK,而不仅仅是JRE,下面说说如何在Ubuntu下如何安装JDK:只有两步,1.下载并解压,2.配置环境变量1.下载并解压:下载地址: ...

  2. php方法 隐藏手机号中间四位

    $num = "13966778888"$str = substr_replace($num,'****',3,4);

  3. 轻松架设时时监控工具Cacti

    Cacti是一套基于PHP,MySQL,SNMP及 RRDTool开发的网络流量监测图形分析工具.通过snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂 ...

  4. 已知局域网IP地址,如何查看mac

    arp -a 加对方IP是查对方的MAC地址 转自: http://zhidao.baidu.com/link?url=8sRdpGcjfGQ-C1F9zNub49Mxe3DAR-RCAHDkHvKC ...

  5. linux下查看文件夹的大小

    du -sh du -sh dir_name/ du -sm * | sort -n //统计当前目录大小 并安大小排序 转自:http://www.jb51.net/LINUXjishu/77450 ...

  6. 【分布式存储】GlusterFS failing to mount at boot with Ubuntu 14.04

    GlusterFS failing to mount at boot with Ubuntu 14.04   Previously I asked about mounting GlusterFS a ...

  7. host

    #Google Services START209.116.186.241 0.docs.google.com209.116.186.241 0.drive.google.com209.116.186 ...

  8. MySQL下载安装、配置与使用(win7x64)

    用过MySQL之后,不论容量的话,发现比其他两个(sql server .oracle)好用的多,一下子就喜欢上了.下面给那些还不知道怎么弄的童鞋们写下具体的方法步骤. 工具/原料 电脑 win7 6 ...

  9. TinyXML 在vs2010 VC++使用

    1.下载TinyXML  http://www.grinninglizard.com/tinyxml/  解压缩,将以下六个文件复制到您的工程项目文件(跟您的cpp文件在一个目录下)中 tinyxml ...

  10. 【读书笔记】读《JavaScript DOM 编程艺术-第2版》

    1.DHTML DHTML曾被认为是HTML/XHTML.CSS和JavaScript相结合的产物,就像今天的HTML5那样,但把这些东西真正凝聚在一起的是DOM.如果真的需要来描述这一过程的话,“D ...