NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」
字符串
题解
没看出catalan怎么办
dp打表啊!
考虑大力dp拿到30分好成绩!顺便收获一张表
打表发现$C_{n+m}^{m}-C_{n+m}^{m-1}$
仔细观察然后发现其实就是之前的网格那个题
那么我们回顾一下网格那个题
先看最简单的n==m情况
求左下角走到右上角方案数,不能经过中间那条线
考虑大力容斥,首先总方案数$C_{2*n}^{n}$很好求,那么我们现在任务就是求不合法的
我们考虑到如果经过中间那条线我们至少要经过红色那条线,考虑求从左下角超过那条蓝线(不合法)方案数,
如果有红线限制我们好像仍然难以求出,我们怎么消除红线影响
方法非常简单:考虑将正方形翻折,那么我们经过绿线走到右上角就转变为了沿绿线走再沿蓝线走方案,这样我们就摆脱了红线的控制
那么我们就转化为了从左下角走到翻折后多边形所在角在位置
得到$C_{(n+1)+(n-1)}^{n-1}$即$C_{2*n}^{n-1}$
相减即可
那么如果$n!=m$类似$C_{n+m}^{m}-C_{n+m}^{m-1}$,自己画画即可
代码
我不想放了
乌鸦喝水
题解
$55分算法$
先预处理出来能喝多少次
$n*m$ 复杂度,
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
ll cishu,maxn,n,m,all=0;
ll a[A],he[A],xiajiang[A];
int main(){
scanf("%lld%lld%lld",&n,&m,&maxn);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<=n;i++){
scanf("%lld",&xiajiang[i]);
he[i]=(maxn-a[i])/xiajiang[i];
}
for(ll i=1;i<=m;i++){
all=1;
for(ll j=1;j<=n;j++){
if(he[j]>=cishu){
cishu++;
all=0;
}
}
if(all) break;
}
printf("%lld\n",cishu);
}
$95分算法$
我们重复枚举了很多无用的状态,当前已经喝不到我们不用再考虑,于是拿链表优化一下
$100分算法$
这种题肯定有性质,这么大的范围一定有性质.
性质: 水少的喝了$k$次那么水多的一定至少也喝了$k$次
我们考虑排序,然而排序后打乱了顺序怎么办,拿一个树状数组维护一下排序前的
我们可以快速算出在当前水壶喝了多少水
思考已知之前喝了$ans$次当前还剩$w$个水壶没喝完,这个水壶能喝$cnt$次
那么它能喝$\frac{cnt-ans}{w}$轮
考虑喝完这么多轮会有剩余,这时用树状数组找sum就完了
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1111111
ll c[A],xiajiang[A],he[A],a[A];
ll n,m,maxn,ans=0;
struct toot{
ll pos,cnt;
friend bool operator < (const toot &a,const toot &b){
return ((a.cnt==b.cnt)?(a.pos<b.pos):(a.cnt<b.cnt));
}
}que[A];
void add(ll l,ll a){
for(ll i=l;i<=n;i+=(i&-i))
c[i]+=a;
}
ll sum(ll l){
ll sum=0;
for(ll i=l;i>=1;i-=(i&-i))
sum+=c[i];
return sum;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&maxn);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<=n;i++){
scanf("%lld",&xiajiang[i]);
he[i]=(maxn-a[i])/xiajiang[i]+1;
que[i].cnt=he[i],que[i].pos=i;
add(i,1);
}
sort(que+1,que+n+1);
// printf("que[1]=%lld\n",que[1].cnt);
for(ll i=1;i<=n;i++){
add(que[i].pos,-1);
if(que[i].cnt<=0) continue;
if(que[i].cnt-ans<=0) continue;
ll cnt=(que[i].cnt-ans)/(n-i+1);
if(cnt>=m){
ans+=m;
continue;
}
if(sum(que[i].pos)<((que[i].cnt-ans)%(n-i+1)))
cnt++;
ans+=cnt;
}
printf("%lld\n",ans);
}
所驼门王的宝藏(骆驼王)
题解
缩点跑一个类似最长链的东西
数组大小比较谜
代码
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define A 2000010
ll n,m,k,tot=0,cnt=0;
ll id(ll x,ll y){
return (x-1)*m+y;
}
inline ll read(){
ll f=1,x=0;char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c-'0');
c=getchar();
}
return f*x;
}
ll head[A],nxt[A<<1],ver[A<<1],a[521000],b[521000],c[521000],sz[A],dfn[A],low[A],sta[A],belong[A],f[A];
ll head_[A],nxt_[A<<1],ver_[A<<1];
map< pair<ll,ll>,ll > mp;
ll top=0,toot=0,scc=0,tot_=0;
bool flag[A],vis[A],ins[A];
vector<ll> hang[A],lie[A];
void add(ll x,ll y){
// printf("x=%d y=%d\n",x,y);
ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void add2(ll x,ll y){
// printf("x=%d y=%d\n",x,y);
ver_[++tot_]=y;
nxt_[tot_]=head_[x];
head_[x]=tot_;
}
void tarjan(ll x){
dfn[x]=low[x]=++toot;
sta[++top]=x;
ins[x]=1;
for(ll i=head[x];i;i=nxt[i]){
ll y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
ll y=0;
scc++;
while(1){
y=sta[top--];
belong[y]=scc;
ins[y]=0;
sz[scc]++;
if(y==x) break;
}
}
}
ll dp(ll x,ll pre){
if(f[x]) return f[x];
f[x]=0;
for(ll i=head_[x];i;i=nxt_[i]){
ll y=ver_[i];
ll nx=dp(y,x);
// printf("x=%d y=%d nx=%d\n",x,y,nx);
f[x]=max(f[x],nx);
}
f[x]+=sz[x];
return f[x];
}
void rebuilt(){
for(ll i=1;i<=k;i++){
for(ll j=head[i];j;j=nxt[j]){
ll y=ver[j];
if(belong[i]!=belong[y]){
add2(belong[i],belong[y]);
}
}
}
}
int main(){
k=read(),n=read(),m=read();
for(ll i=1;i<=k;i++){
a[i]=read(),b[i]=read(),c[i]=read();
mp[make_pair(a[i],b[i])]=i;
hang[a[i]].push_back(i);
lie[b[i]].push_back(i);
}
for(ll i=1;i<=k;i++){
if(c[i]==1){
for(ll j=0;j<hang[a[i]].size();j++){
if(i!=hang[a[i]][j])add(i,hang[a[i]][j]);
}
}
if(c[i]==2){
for(ll j=0;j<lie[b[i]].size();j++){
if(i!=lie[b[i]][j])add(i,lie[b[i]][j]);
}
}
if(c[i]==3){
ll _1_=mp[make_pair(a[i]-1,b[i])],_2_=mp[make_pair(a[i]+1,b[i])],_3_=mp[make_pair(a[i],b[i]+1)],_4_=mp[make_pair(a[i],b[i]-1)]
,_5_=mp[make_pair(a[i]+1,b[i]+1)],_6_=mp[make_pair(a[i]+1,b[i]-1)],_7_=mp[make_pair(a[i]-1,b[i]-1)],_8_=mp[make_pair(a[i]-1,b[i]+1)];
if(_1_) add(i,_1_);
if(_2_) add(i,_2_);
if(_3_) add(i,_3_);
if(_4_) add(i,_4_);
if(_5_) add(i,_5_);
if(_6_) add(i,_6_);
if(_7_) add(i,_7_);
if(_8_) add(i,_8_);
}
}
for(ll i=1;i<=k;i++){
if(!dfn[i]) tarjan(i);
}
// for(ll i=1;i<=k;i++){
// printf("belong=%d\n",belong[id(a[i],b[i])]);
// }
rebuilt();
for(ll i=1;i<=scc;i++){
if(!f[i])
dp(i,0);
}
for(ll i=1;i<=scc;i++){
f[0]=max(f[0],f[i]);
}
printf("%d\n",f[0]);
}
NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」的更多相关文章
- 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- NOIP模拟测试2-5
该补一下以前挖的坑了 先总结一下 第二次 T1 搜索+剪枝 #include<cstdio> #include<iostream> #define ll long long u ...
- NOIP模拟测试30「return·one·magic」
magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...
- NOIP模拟测试21「折纸·不等式」
折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...
- NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」
待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...
- NOIP模拟测试10「大佬·辣鸡·模板」
大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...
- 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」
164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...
- NOIP模拟测试25
这次考试后面心态爆炸了...发现刚了2h的T2是假的之后就扔掉了,草率地打了个骗分 T1只会搜索和m=0 最先做的T3,主要是发现部分分很多,当时第一眼看上去有87分(眼瞎了). 后来想了想,感觉一条 ...
随机推荐
- Solon 的过滤器 Filter 和两种拦截器 Handler、 Interceptor
在web开发中,过滤器.拦截器是经常用到的功能.它可以帮我们限制流量.验证是否登陆.记录日志以及统计执行效率等等. 今天主要交流一下 Solon 框架中的过滤器和拦截器. Solon 是什么框架? S ...
- 技术干货 | 基于MindSpore更好的理解Focal Loss
[本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:Focal Loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失 ...
- BogoMips 和cpu主频无关 不等于cpu频率
http://tinylab.org/explore-linux-bogomips/ 内核探索:Linux BogoMips 探秘 Tao HongLiang 创作于 2015/05/12 打赏 By ...
- 020.Python生成器和生成器函数
一 生成器 1.1 基本概念 元组推导式是是生成器(generator) 生成器定义 生成器可以实现自定义,迭代器是系统内置的,不能够更改 生成器的本质就是迭代器,只不过可以自定义. 生成器有两种定义 ...
- Elasticsearch + Logstash + Kibana +Redis +Filebeat 单机版日志收集环境搭建
1.前置工作 1.虚拟机环境简介 Linux版本:Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:2 ...
- Mybatis Plus 多租户架构实现(完美教程)
一.背景介绍 多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性. 简单讲 ...
- 解决Error running 'Tomcat 9': Address localhost:8080 is already in use的问题
在我学习servlet的过程中遇到了tomacat端口8080被占用的情况,所以记录下来,毕竟以后还会碰见这种貌似情况 第一步,打开命令行界面,可快捷键window+R打开输入cmd进入 输入代码:n ...
- Docker学习(7) 构建镜像
构建docker镜像 1 构建镜像的两种方式 1 通过容器构建镜像 2 通过Dockerfile构建镜像
- 书列荐书 |《刻意练习》安德斯·艾利克森,罗伯特·普尔著
花了两天的时间,一气呵成的读完了这本书.凝练的精华就是:首先,世界上并没有真正的天才这一说.基因可能会起作用,但是经过后天大量的刻意练习,基因的这种作用会弱化.刻意练习需要专注.及时的反馈,并根据反馈 ...
- 状压dp(总结)状态压缩
状压这个和二进制分不开关系 所以,对于二进制的熟悉是必不可少的技能 & 与操作,1不变,0变0 | 或操作,0不变,1变1 ^ 异或操作,0不变,1取反 - 取反操作,把每一个二进制位0 ...