可以在UOJ上提交可以在bzoj上提交(权限)

A. Bali Sculptures

对于前72%的数据,按位考虑,然后跑一点沙茶dp就行了。

dp:用f[x][y]表示前x位分为y段是否满足条件。

对于最后29%的数据,我们改一下dp方程。

dp:用f[x]表示前x位满足条件至少要分几段。

结论:傻逼题

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 2066
typedef long long ll;
int n,a,b,yy[SZ];
#define S 50
ll inn=0,sum[SZ];
bool dp2[SZ][SZ];
bool chk2()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) dp2[i][j]=0;
dp2[0][0]=1;
for(int i=0;i<n;i++) //分i段
{
for(int j=0;j<n;j++)
{
if(!dp2[i][j]) continue;
for(int k=j+1;k<=n;k++)
{
if(((sum[k]-sum[j])|inn)==inn) dp2[i+1][k]=1;
}
}
}
for(int i=a;i<=b;i++) if(dp2[i][n]) return 1;
return 0;
}
int dp1[SZ];
const int inf=1000000000;
bool chk1()
{
dp1[0]=0;
for(int i=1;i<=n;i++) dp1[i]=inf;
for(int j=0;j<n;j++)
{
if(dp1[j]==inf) continue;
for(int k=j+1;k<=n;k++)
{
if(((sum[k]-sum[j])|inn)==inn) dp1[k]=min(dp1[k],dp1[j]+1);
}
}
return dp1[n]<=b;
}
int main()
{
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++) scanf("%d",yy+i), sum[i]=sum[i-1]+yy[i];
inn=(1LL<<S)-1;
for(int i=S;i>=1;i--)
{
inn^=1LL<<(i-1);
if(!((a==1)?chk1():chk2())) inn^=1LL<<(i-1);
}
printf("%lld\n",inn);
}

B. Jakarta Skyscrapers

据说可以卡时过?然而UOJ有hack啊根本过不了

等知道正解了再来补

C. Palembang Bridges

一座桥的时候,容易发现要建在中位数的地方。

两座桥的时候,按照每个人的家和办公室位置和排序后,一定存在一个分割点使得前缀都走左边的桥,后缀都走右边的桥,这似乎挺显然的。

然后离散完随手树状数组+二分维护一下中位数啥的即可。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 666666
typedef long long ll;
int K,n,as[SZ],bs[SZ],ap[SZ];
ll ans=0;
int Abs(int x) {return (x>=0)?x:-x;}
ll a_1()
{
ll aa=0; int nn=0;
for(int i=1;i<=n;i++) ap[++nn]=as[i];
for(int i=1;i<=n;i++) ap[++nn]=bs[i];
sort(ap+1,ap+1+nn);
int md=ap[(nn+1)>>1];
for(int i=1;i<=nn;i++) aa+=Abs(ap[i]-md);
return aa;
}
typedef pair<int,int> pii;
pii zs[SZ];
bool cmp(pii a,pii b) {return a.first+a.second<b.first+b.second;}
#define SN 233333
struct Bits
{
ll bits[SZ];
ll sum(int x)
{
ll ans=0;
for(;x>=1;x-=x&-x) ans+=bits[x];
return ans;
}
ll sum(int l,int r) {return sum(r)-sum(l-1);}
void edit(int x,ll y)
{
for(;x<=SN;x+=x&-x) bits[x]+=y;
}
void clr() {for(int i=1;i<=SN;i++) bits[i]=0;}
}B1,B2;
ll zd[SZ],fd[SZ];
#define ls(x) (lower_bound(ap+1,ap+1+nn,x)-ap)
ll a_2()
{
ll aa=20000000000000000LL; int nn=0;
for(int i=1;i<=n;i++) ap[++nn]=as[i];
for(int i=1;i<=n;i++) ap[++nn]=bs[i];
sort(ap+1,ap+1+nn);
nn=unique(ap+1,ap+1+nn)-ap-1;
for(int i=1;i<=n;i++) zs[i].first=as[i], zs[i].second=bs[i];
sort(zs+1,zs+1+n,cmp);
B1.clr(); B2.clr();
for(int i=1;i<=n;i++)
{
int A=ls(zs[i].first),B=ls(zs[i].second);
B1.edit(A,1);
B2.edit(A,zs[i].first);
B1.edit(B,1);
B2.edit(B,zs[i].second);
int l=0,r=nn;
while(l<r)
{
int mid=(l+r)>>1;
int s=B1.sum(mid);
if(s<i) l=mid+1; else r=mid;
}
int mn=ap[l];
ll cans=B1.sum(l)*mn-B2.sum(l)+B2.sum(l,nn)-B1.sum(l,nn)*mn;
zd[i]=cans;
}
B1.clr(); B2.clr();
for(int i=n;i>=1;i--)
{
int A=ls(zs[i].first),B=ls(zs[i].second);
B1.edit(A,1);
B2.edit(A,zs[i].first);
B1.edit(B,1);
B2.edit(B,zs[i].second);
int l=0,r=nn;
while(l<r)
{
int mid=l+r>>1;
int s=B1.sum(mid);
if(s<n+1-i) l=mid+1; else r=mid;
}
int mn=ap[l];
ll cans=B1.sum(l)*mn-B2.sum(l)+B2.sum(l,nn)-B1.sum(l,nn)*mn;
fd[i]=cans;
}
for(int i=1;i<=n+1;i++) aa=min(aa,zd[i-1]+fd[i]);
return aa;
}
int main()
{
int N; scanf("%d%d",&K,&N);
for(int i=1;i<=N;i++)
{
char a[3],c[3]; int b,d;
scanf("%s%d%s%d",a,&b,c,&d);
if(a[0]==c[0])
{
ans+=Abs(b-d);
continue;
}
++n; as[n]=b; bs[n]=d;
}
if(K==1) printf("%lld\n",a_1()+ans+n);
else printf("%lld\n",a_2()+ans+n);
}

APIO2015泛做的更多相关文章

  1. codeforces泛做..

    前面说点什么.. 为了完成日常积累,傻逼呵呵的我决定来一发codeforces 挑水题 泛做.. 嗯对,就是泛做.. 主要就是把codeforces Div.1的ABCD都尝试一下吧0.0.. 挖坑0 ...

  2. 学记笔记 $\times$ 巩固 · 期望泛做$Junior$

    最近泛做了期望的相关题目,大概\(Luogu\)上提供的比较简单的题都做了吧\(233\) 好吧其实是好几天之前做的了,不过因为太颓废一直没有整理-- \(Task1\) 期望的定义 在概率论和统计学 ...

  3. 历年NOIP水题泛做

    快noip了就乱做一下历年的noip题目咯.. noip2014 飞扬的小鸟 其实这道题并不是很难,但是就有点难搞 听说男神错了一个小时.. 就是$f_{i,j}$表示在第$i$个位置高度为$j$的时 ...

  4. HAOI2015 泛做

    T1 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的 ...

  5. LCT裸题泛做

    ①洞穴勘测 bzoj2049 题意:由若干个操作,每次加入/删除两点间的一条边,询问某两点是否连通.保证任意时刻图都是一个森林.(两点之间至多只有一条路径) 这就是个link+cut+find roo ...

  6. 基尔霍夫矩阵题目泛做(AD第二轮)

    题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...

  7. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

  8. FFT与多项式、生成函数题目泛做

    题目1 COGS 很强的乘法问题 高精度乘法用FFT加速 #include <cstdlib> #include <iostream> #include <algorit ...

  9. 二维计算几何基础题目泛做(SYX第一轮)

    题目1: POJ 2318 TOYS 题目大意: 给一个有n个挡板的盒子,从左到右空格编号为0...n.有好多玩具,问每个玩具在哪个空格里面. 算法讨论: 直接叉积判断就可以.注意在盒子的边界上面也算 ...

随机推荐

  1. 图解六大UML类图关系

    在学习UML类图的过程中,UML类图关系是必须要掌握的问题,UML定义的关系主要有六种:依赖.类属.关联.实现.聚合和组合.下面对其定义和表示方法逐一说明. UML类图关系简介 依赖(Dependen ...

  2. 【代码笔记】iOS-点击cell时候的动画翻转

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  3. 苹果企业账号打包发布APP流程详解

    原文链接:http://www.cnblogs.com/mddblog/p/4718228.html 一.通过企业账号申请证书 1 Certificate Signing Request (CSR)文 ...

  4. Android中将xml布局文件转化为View树的过程分析(上)

    有好几周没写东西了,一方面是因为前几个周末都有些事情,另外也是因为没能找到好的写作方向,或者说有些话题 值得分享.写作,可是自己积累还不够,没办法只好闷头继续研究了.这段时间一边在写代码,一边也在想A ...

  5. 深入理解Objective-C Runtime

    一.简介 主要特点: 在OC语言中,函数的调用是属于动态调用的,编译阶段并不确定要调用的函数,在真正的运行时才会根据函数名查找要调用哪个函数. 而在C语言中,函数的调用是在编译阶段就已经确定要调用哪个 ...

  6. Token原理以及应用

    近期由于项目需要开发供第三方使用的api,在整个架构设计的一个环节中,对api访问需要进行认证,在这里我选择了token认证. 一:token的优势(此部分引自http://www.sumahe.cn ...

  7. WPF学习之路(五) 实例:写字板(续)

    WordPad 2.0 上一期实现了一虽然建议但是功能比较全面的Wordpad程序,但是程序代码略显繁琐,这一期更新改进版. MainWindows.xaml 添加 <Window.Comman ...

  8. Java Gradle入门指南之简介、安装与任务管理

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍.    ...

  9. 编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc。

    package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...

  10. Oracle 常用SQL技巧(转)

    1. SELECT子句中避免使用 “*”当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解 ...