noip模拟赛 #2
万年rk2
我写挂大家都挂但是有人比我挂的少
我好不容易卡一波常数然后有人ak
。。。
T1.不想写,等会放链接
T2
给一个方阵,每个地方有一个权值,把它划成两块,不能往回拐弯,求两块极差较大的那个极差最小值是多少
显然,二分极差
然后贪心的画一条线,保证它不拐弯就可以了
T3
你下了一个$10^{18}$攻的克苏恩,对面有一个无限血的英雄和一个奴隶主,求这个克苏恩期望打多少下脸
首先,只有7个格子,场面只跟奴隶主的血量有关(也没有火舌管站位干吗)
然后我们可以搜一发状态,发现只有165个
我们用$f_{i,s}$表示打了$i$下当前场面为$s$的期望打脸次数
$s$怎么处理呢?哈希一下咯
然后发现我们可以矩阵乘法,对于打脸的情况,另单开一行就可以了
当然要记得自己转移自己...
但这样还不够,复杂度$O(T \times 165^3 \times logn)$显然过不了
考虑到最后我们只需要矩阵的一行中的几个元素而不是整个矩阵,又想到向量乘矩阵是$O(n ^ 2)$的
我们可以预处理出转移矩阵的$2^t$次方,查询的时候相当于倍增,乘一次是$O(n ^ 2)$的
于是就是$O(165^3 \times logn + T \times 165^2 logn)$的
然而还是卡不过去,我们考虑优化取模,首先当然是要
inline void add(LL &x,LL delt){x += delt;if(x >= mod)x -= mod;}
其实这样加了O2我们已经可以过了
然而本机1.5s的我还是慌得一批
于是我们可以找一个很大的数,然后每次先膜这个大的,最后再膜998244353,$O(n^3)$次取膜变成了$O(n^2)$次的
现在问题出在怎么找这个数上,一开始想的是找一个很大的质数,后来发现完全没必要质数,找一个20位左右的数就可以了
这样就可以卡进1s了
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int h,w;
int a[maxn][maxn],mn = ,mx;
int l,r,ans;
int chk(int mid)
{
int upb = mx - mid,lwb = mn + mid,j,lim = w + ;
for(int i=;i<=h;i++)
{
for(j=;j<lim;j++)if(a[i][j] < upb)break;
lim = min(lim,j);
for(j=lim;j<=w;j++)if(a[i][j] > lwb)return ;
}
return ;
}
void divide()
{
l = ;
while(l < r)
{
int mid = (l + r) >> ;
if(chk(mid))r = mid;
else l = mid + ;
}
}
int main()
{
h = read(),w = read();
for(int i=;i<=h;i++)
for(int j=;j<=w;j++)
{
a[i][j] = read();
mn = min(mn,a[i][j]);
mx = max(mx,a[i][j]);
}
r = mx - mn;divide();
for(int i=;i<=h/;i++)swap(a[i],a[h - i + ]);divide();
for(int i=;i<=h;i++)reverse(a[i] + ,a[i] + w + );divide();
for(int i=;i<=h/;i++)swap(a[i],a[h - i + ]);divide();
cout<<r;
}
T2
#include<bits/stdc++.h>
#define LL unsigned long long
using namespace std;
inline LL read()
{
LL x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
char buf[],top; inline void write(LL x,char opt = )
{
while(x)
{
buf[++top] = (char){x % + ''};
x = x / ;
}
for(;top;top--)putchar(buf[top]);
if(opt)putchar(opt);
}
const LL mod = ;
const LL BIGNUM = (0x7fffffffffffffffll / mod - mod) * mod;
inline void BIGADD(LL &x,LL delt)
{
x += delt;
if(x >= BIGNUM)x -= BIGNUM;
}
int m,k;
LL n;
LL ans[],tmp[];
int pos[][][],dfn;
struct Matrix
{
LL a[][];
int w,h;
void init(int ww,int hh)
{
w = ww;h = hh;
memset(a,,sizeof(a));
}
Matrix operator * (const Matrix &b)const
{
Matrix res;
res.init(h,b.w);
for(int i=;i<=h;i++)
for(int j=;j<=b.w;j++)
{
for(int k=;k<=w;k++)
BIGADD(res.a[i][j] , a[i][k] * b.a[k][j]);
res.a[i][j] %= mod;
}
return res;
}
}Vec[];
inline void Matrix_Mul_Vector(Matrix Trans,LL* w)
{
memset(tmp,,sizeof(tmp));
for(int i=;i<=Trans.h;i++)
{
for(int j=;j<=Trans.w;j++)
{
BIGADD(tmp[i] , Trans.a[i][j] * w[j]);
}
tmp[i] %= mod;
}
memcpy(w,tmp,sizeof(tmp));
} inline LL ksm(LL x,LL k)
{
LL ans = ;
while(k)
{
if(k & )ans = (ans * x) % mod;
x = (x * x) % mod;
k = k >> ;
}
return ans;
}
LL inve[];
int main()
{
//freopen("gen.in","r",stdin);
//freopen("gen1.out","w",stdout);
int T = read();m = read(),k = read();
for(int i=;i<=k+;i++)inve[i] = ksm(i,mod - );
//write(T);write(m);write(k);
int lb,jb,ib;
if(m > )lb = k;else lb = ;
for(int l=;l<=lb;l++)
{
if(m > )jb = k - l;
else jb = ;
for(int j=;j<=jb;j++)
{
if(m)ib = k - j - l;
else ib = ;
for(int i=;i<=ib;i++)
{
pos[i][j][l] = ++dfn;
}
}
}
for(int i=;i<=;i++)Vec[i].init(dfn + ,dfn + );
if(m)ib = k;else ib = ;
for(int i=;i<=ib;i++)
{
if(m > )jb = k - i;else jb = ;
for(int j=;j<=jb;j++)
{
if(m > )lb = k - j - i;else lb = ;
for(int l=;l<=lb;l++)
{
int cnt = i + j + l,nowpos = pos[i][j][l],tolim = (cnt < k);
LL inv = inve[cnt + ];
if(m == )
{
Vec[].a[nowpos][pos[i - ][][]] = (i * inv) % mod;
}
if(m == )
{
if(i != )Vec[].a[nowpos][pos[i - ][j][]] = (i * inv) % mod;
if(j != )Vec[].a[nowpos][pos[i + ][j + tolim - ][]] = (j * inv) % mod;
}
if(m == )
{
if(i != )Vec[].a[nowpos][pos[i - ][j][l]] = (i * inv) % mod;
if(j != )Vec[].a[nowpos][pos[i + ][j - ][l + tolim]] = (j * inv) % mod;
if(l != )Vec[].a[nowpos][pos[i][j + ][l + tolim - ]] = (l * inv) % mod;
}
Vec[].a[nowpos][nowpos] = Vec[].a[nowpos][dfn + ] = inv;
}
}
}
Vec[].a[dfn + ][dfn + ] = ;
for(int i=;i<=;i++)Vec[i] = Vec[i - ] * Vec[i - ];
while(T--)
{
n = read();
memset(ans,,sizeof(ans));
ans[dfn + ] = ;
for(int l=;l<=;l++)
if(n & (1LL << l))Matrix_Mul_Vector(Vec[l],ans);
if(m == )write(ans[pos[][][]],'\n');
if(m == )write(ans[pos[][][]],'\n');
if(m == )write(ans[pos[][][]],'\n');
}
}
T3
noip模拟赛 #2的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- MySQL数据库的知识总结
1.Mysql数据库存储引擎 概念:存储引擎其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法.MYSQL中的数据用各种不同的技术存储在文件 (内存)中,这些技术 ...
- Linux相互排斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu.文章仅供学习交流,请勿用于商业用途] 在第一节说到了 ...
- java中Executor、ExecutorService、ThreadPoolExecutor介绍
源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /** * Executes the given c ...
- jQuery的Pagenation分页插件。
插件简介 此jQuery插件为Ajax分页插件,一次性加载,故分页切换时无刷新与延迟,如果数据量较大不建议用此方法,因为加载会比较慢. 原插件CSS不太合理,使用浮动,故无法方便实现左右方向的定位,且 ...
- HDU3549_Flow Problem(网络流/EK)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- KVM+VNC 虚拟机远程管理
1.安装kvm grep -E -o 'vmx|svm' /proc/cpuinfo #检查服务器是否支持虚拟化(vmx为interl平台.svm是AMD平台) #安装KVM所需软件包: yum gr ...
- SkipList跳跃表(Java实现)
取自网络https://github.com/spratt/SkipList AbstractSortedSet.java package skiplist_m; /***************** ...
- Android—— 4.2 Vold挂载管理_NetlinkManager (四)
在前文Android-- 4.2 Vold挂载管理_主体构建main (一)中有结构图表示,Vold是kernel与用户层的一个交互管理模块. Android-- 4.2 Vold挂载管理_Volum ...
- Tiny语言编译器简单介绍
1.简单介绍:编译器是将一种语言翻译成还有一种语言的程序.编译器将源程序的代码作为输出,从而产生用目标语言编写的等价程序.比如源码为C/C++等高级语言,那么目标语言就是目标机器的机器代码.也就是能够 ...
- 【BZOJ1835】[ZJOI2010]base 基站选址 线段树+DP
[BZOJ1835][ZJOI2010]base 基站选址 Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯 ...