bzoj1805: [Ioi2007]Sail 船帆】的更多相关文章

题目描述 让我们来建造一艘新的海盗船.船上有 N个旗杆,每根旗杆被分成单位长度的小节.旗杆的长度等于它被分成的小节的数目.每根旗杆上会挂一些帆,每张帆正好占据旗杆上的一个小节.在一根旗杆上的帆可以任意排布在不同的小节中,但是每个小节上至多能挂一张帆. 在风中,帆的不同排布方式会产生不同的推动力.靠近船头的帆比它后面的相同高度上的帆获得的推动力少,换句话说,靠近船头的帆的推动力由于受它后面相同高度的帆的影响而打了折扣.对于任意一张帆,它的推动力折扣等于在它后面并且和它在同一高度的帆的数目. 所有帆…
可以发现旗杆的顺序是没有用的,对于每列,它的答案是它的最大值mx*(mx+1)/2 高度由小到大排序旗杆,问题可以转化为在前h行选k个最小的值 考虑激情splay乱搞(我只会splay......) 设树中序遍历第i个点的d值表示当前最后一个旗帜上面的数字为i-1的列的数量 我们可以二分一下求出我们要利用到第几个点x,对于x之前的点,他们的d值都要全部送给后一个点 所以我们可以删掉x这个点,并在最前面加一个点,这就相当于整体向右移动了一位 对于x这个点单独处理,删除前计算出留在x的数目和给x+1…
BZOJ 洛谷 首先旗杆的顺序没有影响,答案之和在某一高度帆的总数有关.所以先把旗杆按高度排序. 设高度为\(i\)的帆有\(s_i\)个,那么答案是\(\sum\frac{s_i(s_i-1)}{2}\),显然我们要让每一行(高度)的帆数都尽量少. 然后可以想到二分,二分每一行的帆数不超过\(mid\)是否可行.显然我们从最高的旗杆的最大高度部分往下填就可以了,要用线段树维护.复杂度\(O(n\log^2n)\). 但是不需要这个二分啊,每次找到\(s_i\)最小的位置,把\(k\)个帆填进去…
Link: BZOJ 1805 传送门 Solution: 一道思路比较巧的线段树的题目 首先可以发现,答案和顺序是没有关系的,都是$\sum_{i=1}^n {H_i∗(H_i−1)/2}$. 那么可以比较容易得得到以下的贪心策略: 对于第$i$个船帆,对前$H_i$层中的前$K_i$小的数加1 感性证明:最优方案肯定是每层上数量尽量接近,那么每次放在当前数量最少的层上一定不会使答案变差 此题的难点还是在实现上, 为了对于每个$i$都能区间+1,序列一定要具有单调性 又由于$H_i$是从小到大…
显然答案与杆的顺序无关(按每个高度考虑). 从高到低考虑杆,设此时的状态为\(S\),\(S[i]\)是高度\(i\)的帆的数目,初始全为\(0\),当前杆的高度为\(h\),杆上需要放置的帆的数目为\(k\),贪心地,假设两个高度的同等宜选,优先选择更高的:帆尽量放置在\(S[i]=0(i\le h)\)的高度上,若还有剩余,设剩下\(t(t\le k)\)个,则放置在除去以选择的高度以外,\(S[i](i\le h)\)前\(t\)小的位置. 整理一下,每次选出\(S[1\cdots h]\…
https://www.luogu.org/problemnew/show/P4647 首先发现答案与顺序无关,令 $ x_i $ 表示高度为 $ i $ 的那一行帆的个数,第 $ i $ 行对答案的贡献为 $ \frac{x_i * (x_i - 1)}{2} $ 先把旗杆按照高度从小到大排序,有一个显然的贪心是每次选择能放的地方帆最少的一行放一个帆,最少的一行放一个帆对答案的贡献一定最小,而后面的旗杆高度更高,能选择放帆的地方更多,这样可以保证答案最小(可以感性理解一下 那么我们的做法就出来…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
导言: 最近在学习sails.js(http://sailsjs.org/),因为用的人不多,资料较少,故写些自己的学习过程.因自己也是初学node.js,有问题大家指出. 介绍: sails.js的目的是模拟Ruby on Rails那样的mvc模式,帮助开发者快速开发node.js 应用. 安装: 1.安装 node.js 和 npm, 这里就不说了. 2.安装sails.js ( 加上-g是指全局安装,这样的话你可以在你任何地方新建sail.js项目)   windows: npm -g…
B. Sail 题目连接: http://www.codeforces.com/contest/298/problem/B Description The polar bears are going fishing. They plan to sail from (sx, sy) to (ex, ey). However, the boat can only sail by wind. At each second, the wind blows in one of these directio…
[Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 214  Solved: 128 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每当一辆食品车到达煤矿时,矿工们便会产出一定数量的煤.有三种类型的食品车:肉车,鱼车和面包车. 矿工们喜欢变化的食谱.如果提供的食品能够不断变化,他们的产煤量将会增加.每当一个新的食品车到达煤矿时,矿工们就会比较这种新的食品和前…
dp... ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<iostream>   #define rep( i , n ) for( int i = 0 ;  i <…
[bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每当一辆食品车到达煤矿时,矿工们便会产出一定数量的煤.有三种类型的食品车:肉车,鱼车和面包车. 矿工们喜欢变化的食谱.如果提供的食品能够不断变化,他们的产煤量将会增加.每当一个新的食品车到达煤矿时,矿工们就会比较这种新的食品和前两次(或者少于两次,如果前面运送食品的次数不足两次)的食品,并且: • 如…
[IOI2007]Miners 题目大意: 两个人吃东西,总共有\(3\)种食物,每个人每次吃到食物时可以获得的收益是当前食物和前两次吃的食物中,不同食物的种数.现在给定一个长度为\(n(n\le10^5)\)的食物序列,按顺序每次将这些食物分配给两个人中的一个.问收益总和的最大值. 思路: \(f[i][j][k][l][m]\)表示分完前\(i\)个吃的,\(A\)最后两个吃了\(i\)和\(j\),\(B\)最后两个吃了\(l\)和\(m\)时的最大收益. 时间复杂度\(\mathcal…
DescriptionThe polar bears are going fishing. They plan to sail from (sx,?sy) to (ex,?ey). However, the boat can only sail by wind. At each second, the wind blows in one of these directions: east, south, west or north. Assume the boat is currently at…
把点按坐标排序,每次找出最小的点,一定在最外层,再顺着把最外层的边删掉,经过了两次的边不会被冲毁. 其实不难写,但是写了很久. #include<bits/stdc++.h> #define N 400004 using namespace std; int n,m,y,q[N],x[N], e[N],*back(e),*f[N][4]; struct vec{ int x,y,z; }a[N],r[N]; bool operator<(vec u,vec v){ return u.x&…
uuid : { type: 'string', unique: true, required: true, primaryKey: true },…
query: function (req, res) {    var par = req.query;    for(var key in par){      var options = {};      if(isNaN(parseFloat(par[key]))){        options[key] = par[key];      }else{        options[key] = parseFloat(par[key]);      }      sails.log.si…
在项目根目录下创建.sailsrc文件 {  "generators": {    "modules": {}  },  "hooks": {          "grunt": false,          "sockets": false,          "pubsub": false,          "grunt": false,          &…
sails generate api user  创建了user的controller和models sails generate api user index 创建了user的controller和models  和 index方法 sails generate model user 创建了user的models sails generate  controller user 创建了user的controllers…
一维的情况: 排序后维护一个单调指针即可,时间复杂度$O(n\log n)$. 二维的情况: 旋转坐标系后转化为二维数点问题,扫描线+树状数组维护即可,时间复杂度$O(n\log n)$. 三维的情况: 将后两维旋转坐标系,对于每个x,预处理出横坐标为x的点的后两维的二维前缀和. 枚举一个点,再枚举另一个点的x,在相应坐标的二维前缀和里查询正方形内点的个数即可,时间复杂度$O(nm)$. #include<cstdio> #include<algorithm> #define N…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列,使获益最大. [思路] 设f[i][a][b][c][d]表示前i个数,分给A的倒数两个为ab,分给B的倒数两个为cd,则有转移式: f[i+1][b][x][c][d]<- f[i][a][b][c][d]+w(a,b,x) f[i+1][a][b][d][x]<- f[i][a][b][c]…
问题: 一.数据填充: 在开发环境中,难免要填充一些基础数据用于测试用.现有两种方法 1.在bootstrap.js或者其他启动文件中创建一些数据 2.https://github.com/frostme/sails-seed 一个数据填充包.可以一试 二.多表联合查询:sails.js 的orm 不支持: model.foreign_key.foreign.key.attr 类似的查询方式.不过有人给出了答案-.- 1.https://github.com/balderdashy/waterl…
题目大意:将一个123序列拆分为两个子序列.定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值 令f[i][a1][a2][b1][b2]为前i个数分成两组,第一组以a1 a2结尾,第二组以b1 b2结尾的最大贡献值 转移啥的自己YY吧 记得开滚动数组 尼玛写错个參数都要调半天-- #include<cstdio> #include<cstring> #include<iostream> #include<algorithm&…
感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物用b1表示,第二组矿工的用a2和b2表示 a和b的取值范围为[0,3],0表示没有食物,1~3分别表示三种食物中的一种 第一维可以用滚动数组优化空间 #include <cstdio> #include <cstring> #include <algorithm> ; ][…
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上. 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务. Input 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位.两组数据之间没有…
相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种食物后的产出与新情况预处理出来吧.(如果两餐开两维的话似乎不太好预处理) f[i][j][k]表示前i辆车,两个煤矿最近两餐情况分别为j和k时的最大产出.i那维滚动一下 感觉要注意的就是,两餐的情况是有非法情况的(前一餐吃了,后一餐不吃):还有就是有的情况可能用目前的食物凑不出来.. #includ…
Description 马克(Mirko)和斯拉夫克(Slavko)正在为克罗地亚举办的每年一次的双人骑车马拉松赛而紧张训练.他们需要选择一条训练路径. 他们国家有N个城市和M条道路.每条道路连接两个城市.这些道路中恰好有N-1条是铺设好的道路,其余道路是未经铺设的土路.幸运的是,每两个城市之间都存在一条由铺设好的道路组成的通路.换句话说,这N个城市和N-1条铺设好的道路构成一个树状结构. 此外,每个城市最多是10条道路的端点. 一条训练路径由某个城市开始,途经一些道路后在原来起始的城市结束.因…
Description 马克(Mirko)和斯拉夫克(Slavko)正在为克罗地亚举办的每年一次的双人骑车马拉松赛而紧张训练.他们需要选择一条训练路径. 他们国家有N个城市和M条道路.每条道路连接两个城市.这些道路中恰好有N-1条是铺设好的道路,其余道路是未经铺设的土路.幸运的是,每两个城市之间都存在一条由铺设好的道路组成的通路.换句话说,这N个城市和N-1条铺设好的道路构成一个树状结构. 此外,每个城市最多是10条道路的端点. 一条训练路径由某个城市开始,途经一些道路后在原来起始的城市结束.因…
link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; inline int read(){ ,ans=;char c=getchar(); ;c=getchar();} +c-';c=getchar()…
IOI历史上的著名水题,我这种蒟蒻都能写的东西. [思路] 用1.2.3分别代替三种食物,0表示当前矿井没有食物.f[i][a][b][c][d]当前第i个食物,矿1的食物顺序由上至下为a,b:矿2的食物顺序由上至下为c,d. 判断产物数量的方法很巧妙,由下至上a,b,c.初始时默认投入一个食物至少生产一单位,如果a为有食物且与bc不同,则加一单位:如果b为有食物且与c不同,再加一个单位.最后加一个滚动数组就可以了. [错因] 1.因为a,b,c,d大小范围是0..3,但是我把下标范围写3!一定…