[NOIP2016普及组]魔法阵
题目:洛谷P2119、Vijos P2012、codevs5624。
题目大意:有n件物品,每件物品有个魔法值。要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),并且Xb-Xa<(Xc-Xb)/3。求每件物品作为a、b、c、d的次数。
解题思路:这真是一道锻炼思(bào)维(lì)能力的好(kēng)题!
首先枚举魔法阵的每件物品,姿势好可得65(洛谷测)。
然后是强(wěi)大(suǒ)的正解。
首先利用桶排的思路保存各个魔法值。
设Xd-Xc=t,则根据一系列推论可得:
Xb-Xa=2t
Xc-Xb>6t
那么首先想到的就是枚举t,然后再枚举c、b,算出a、d,最后一交发现还是超时几个点!!是不是气的想砸电脑了?
别急慢慢来。首先我们可以发现,t的枚举范围在1~n/9中即可。
然后我们令d取满足条件的最小值(9t+2),a就只能取1(b可以根据a推出,不用考虑),那么如果d增加1,a就能选1、2,d增加2,a能取1、2、3……
那么我们用一个sum记录当前a、b共有多少种选法,然后计算c、d,就不用再次枚举了。
同理a、b取最大值,然后如此计算即可。
满分拿到,感觉比网络流还难!!!
C++ Code:
#include<cstdio>
#include<cctype>
using namespace std;
int n,m,cnt[15999]={0};
int A[15999]={0},B[15999]={0},C[15999]={0},D[15999]={0},f[40004];
inline int readint(){
char c=getchar();
int p=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())p=(p<<3)+(p<<1)+(c^'0');
return p;
}
int main(){
m=readint(),n=readint();
for(int i=1;i<=n;++i){
f[i]=readint();
++cnt[f[i]];
}
for(int t=1;9*t<=m;++t){
int sum=0;
for(int d=t*9+2;d<=m;++d){
int c=d-t,b=d-7*t-1,a=d-9*t-1;
sum+=cnt[a]*cnt[b];
C[c]+=cnt[d]*sum;
D[d]+=cnt[c]*sum;
}
sum=0;
for(int a=m-t*9-1;a>=1;--a){
int b=a+2*t,c=a+8*t+1,d=a+9*t+1;
sum+=cnt[c]*cnt[d];
A[a]+=cnt[b]*sum;
B[b]+=cnt[a]*sum;
}
}
for(int i=1;i<=n;++i)printf("%d %d %d %d\n",A[f[i]],B[f[i]],C[f[i]],D[f[i]]);
return 0;
}
[NOIP2016普及组]魔法阵的更多相关文章
- 【做题记录】[NOIP2016 普及组] 魔法阵
P2119 魔法阵 2016年普及组T4 题意: 给定一系列元素 \(\{X_i\}\) ,求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 . \[\begin{cases}X_ ...
- NOIP2016普及组解题报告
概述 \(NOIP2016\)普及组的前三题都比较简单,第四题也有很多的暴力分,相信参加了的各位\(OIer\)在\(2016\)年都取得了很好的成绩. 那么,我将会分析\(NOIP2016\)普及组 ...
- NOIP2016普及组
普及组.代码有空发. 第一题就是买铅笔.暴力模拟绝对可取. 第二题就是回文日期.从t1的年份到t2的年份枚举每一年.头尾要特判. 第三题就是海港.骗了40分. 第四题就是魔法阵.不太好优化. 完.
- NOIP2016普及组复赛解题报告
提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...
- [题解]noip2016普及组题解和心得
[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内 ...
- noip2016普及组题解和心得
前言 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. (其实这篇博客只有题 ...
- 【NOIP2016普及组复赛】魔法阵
题目 分析 设xd-xc为i,那么xb-xa=2i, 又因为xb-xa<(xc-xb)/3, 那么c>6i+b. 于是,先枚举i, 再分别枚举xa和xd, 根据之间的关系,用前缀和求出每一 ...
- noip2016普及组 题解
T1 大水题,不解释 上考场代码 #include <algorithm> #include <cstdio> using namespace std; int main() ...
- noip2016 普及组
T1 买铅笔 题目传送门 #include<cstdio> #include<cstring> #include<algorithm> using namespac ...
随机推荐
- HTTP报文头解析
HTTP报文头解析 本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该 ...
- java基础——单例设计模式(懒汉式)
public class Test7 { // 主函数 public static void main(String[] args) { Test7.getInstance().function(9, ...
- 设备综合效率OEE
设备综合效率OEE OEE(OverallEquipmentEffectiveness),即设备综合效率,也有资料表述为总体设备效率,其本质就是设备负荷时间内实际产量与理论产量的比值. TEEP(To ...
- django steps EASY WAY
django 2.0 python 3.6 =========django steps EASY WAY=========== reference: https://djangoforbeginner ...
- 垃圾回收器(GC)
值类型占用的空间在方法执行结束后会被马上释放, 引用类型占用的空间在方法结束后不会被马上释放,具体什么时间释放由垃圾回收器(GC)来决定. GC(Garbage Collection):JAVA/.N ...
- Promise语法
转自:廖雪峰的官方网站 在JavaScript的世界中,所有代码都是单线程执行的. 由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行.异步执行可以用回调函数实现: ...
- 《Linux 进程间通信》命名管道:FIFO
命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include <sys/types.h> #incl ...
- echars 在vue v-if 切换会 显示不出来或者显示出来但是不是百分百显示
我也是百度看别人写的原因,然后自己总结,以后用到的时候来复制就可以将 v-if换成 v-show 第二不是百分百显示 可以用 this.$nextTick(function() { this.in ...
- JS 去除字符串中的最后一个字符
var str = 'Hello World!'; str = str.substr(0,str.length-1); alert(str);
- OpenCASCADE直线与平面求交
OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...