前言

我就想说一句,T3 给了一个什么牛马大样例!!!!!!!!,气\(^{TM}\)死我!!!!!!!

我的 \(\mathcal{O}(n)\) 算法始终过不掉大样例我 TM ,要不然我就直接上矩阵乘优化了。。

最后没法了把我的所谓的不正确的正解交上去,考完发现有 56pts ,我以为是数据水,果断去看正解。。

苦思冥想了好久直到战神大样例没过切掉了此题,我才开始矩阵乘优化,然后就过了(然而和题解柿子完全不一样。。)

牛马大样例!!!!

T1 自然数

解题思路

考场上一眼 CDQ 分治,最后一看果然不是。。(逃

可惜的是我打的小暴力还被卡常卡掉了 34pts 。。。

对于每一个左端点线段树维护出每一个右端点的和,因此我们先求出左端点为 1 的所有答案作为初始值加入到线段树中。

然后向右移动左端点,每次相当于删去一个值 \(x\) 那么在当前扫到的左端点到 \(x\) 的上一次出现位置的所有大于 \(x\) 的答案都会变为 \(x\) 。

由于答案的值是单调不降的,因此我们可以二分答案在线段树上面查值,也可以线段树上二分,复杂度带一个或者两个 log

code

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
#define ls x<<1
#define rs x<<1|1
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=2e5+10;
int n,ans,nxt[N],s[N],cnt[N],num[N];
unordered_map<int,int> mp;
struct Segment_Tree
{
struct Node{int mn,dat,laz;}tre[N<<2];
void push_up(int x)
{
tre[x].mn=min(tre[ls].mn,tre[rs].mn);
tre[x].dat=tre[ls].dat+tre[rs].dat;
}
void push_down(int x,int l,int r)
{
if(tre[x].laz==-1) return ;
int mid=(l+r)>>1;
tre[ls].laz=tre[x].laz; tre[rs].laz=tre[x].laz;
tre[ls].dat=(mid-l+1)*tre[x].laz; tre[rs].dat=(r-mid)*tre[x].laz;
tre[ls].mn=tre[rs].mn=tre[x].laz;
tre[x].laz=-1;
}
void build(int x,int l,int r)
{
tre[x].laz=-1;
if(l==r) return tre[x].mn=tre[x].dat=num[l],void();
int mid=(l+r)>>1;
build(ls,l,mid); build(rs,mid+1,r);
push_up(x);
}
void insert(int x,int l,int r,int L,int R,int val)
{
if(L<=l&&r<=R) return tre[x].dat=val*(r-l+1),tre[x].laz=tre[x].mn=val,void();
int mid=(l+r)>>1; push_down(x,l,r);
if(L<=mid) insert(ls,l,mid,L,R,val);
if(R>mid) insert(rs,mid+1,r,L,R,val);
push_up(x);
}
int query(int x,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return tre[x].dat;
int mid=(l+r)>>1,sum=0; push_down(x,l,r);
if(L<=mid) sum+=query(ls,l,mid,L,R);
if(R>mid) sum+=query(rs,mid+1,r,L,R);
return sum;
}
int query(int x,int l,int r,int pos)
{
if(l==r) return tre[x].mn;
int mid=(l+r)>>1; push_down(x,l,r);
if(pos<=mid) return query(ls,l,mid,pos);
return query(rs,mid+1,r,pos);
}
}T;
signed main()
{
freopen("mex.in","r",stdin); freopen("mex.out","w",stdout);
n=read(); for(int i=1;i<=n;i++) s[i]=read();
for(int i=1,pos=0;i<=n;i++)
{
if(s[i]<=n) cnt[s[i]]++;
while(cnt[pos]) pos++;
num[i]=pos;
}
T.build(1,1,n);
for(int i=n;i;i--)
{
nxt[i]=n+1;
if(mp.find(s[i])==mp.end()){mp.insert(make_pair(s[i],i));continue;}
nxt[i]=mp.find(s[i])->second; mp[s[i]]=i;
}
for(int i=1;i<=n;i++)
{
ans+=T.query(1,1,n,i,n);
int l=i,r=nxt[i]-1,temp=-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(T.query(1,1,n,mid)>s[i]) temp=mid,r=mid-1;
else l=mid+1;
}
if(~temp) T.insert(1,1,n,temp,nxt[i]-1,s[i]);
}
printf("%lld",ans);
return 0;
}

T2 钱仓

解题思路

显然的一个结论一定存在一个点,使得按照顺时针顺序原来在它之前的点上的钱一定不会运到在它之后的点上。

于是我们就可以得到枚举断点求答案的 \(\mathcal{O}(n^2)\) 做法。

然后发现所有合法的序列其实答案都是相同的,我是我们可以枚举 \([1,2n]\) 查看是否有长度为 \(n\) 的一段。

满足一段内距离左端点的前缀和与长度的差值始终大于等于 0。

直接从该断点计算即可。

code

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=2e5+10,INF=1e18;
int n,ans=INF,beg,s[N],p[N];
void solve(int fro)
{
for(int i=fro,temp=0;i<=fro+n-1;i++)
{
temp+=s[i]-1; p[i-fro+1]=s[i];
if(temp<0) return ;
}
int sum=0,pos=1; p[pos]--;
for(int i=2;i<=n;i++)
{
while(!p[pos]) pos++;
p[pos]--; sum+=(i-pos)*(i-pos);
}
ans=min(ans,sum);
}
signed main()
{
freopen("barn.in","r",stdin); freopen("barn.out","w",stdout);
n=read(); for(int i=1;i<=n;i++) s[i+n]=s[i]=read();
for(int i=1,sum=0;i<=2*n;i++)
{
sum+=s[i];
if(sum-i+beg<0) beg=i,sum=0;
if(i-beg==n) break;
}
solve(beg+1); printf("%lld",ans);
return 0;
}

T3 游戏

解题思路

如果没有那个大样例的话这绝对称得上是个期望好题。

易得,在只剩下一个棋子的时候都希望自己可以拿走,那么在剩下两个石子的时候一定都希望自己下一局先手,从而不希望本局可以取到石子。

以此类推,可以发现剩下奇数个石子的时候两人都想到得到,偶数时则相反。

假设这一局 \(A\) 先手的概率是 \(lasa\) , \(B\) 先手的概率是 \(lasb\) ,下一局的概率是 \(A,B\) 。

NOIP模拟74的更多相关文章

  1. Noip模拟74 2021.10.11

    T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...

  2. 2021.10.11考试总结[NOIP模拟74]

    T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...

  3. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  4. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  9. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

随机推荐

  1. Dynamics CRM实体系列之1:N、N:1以及N:N关系

    Dynamics CRM在实施过程中会遇到很多多个实体关联的问题,这样可以实现多个实体的记录通过关联的字段实现数据的综合展示,在Sql Server里面叫做外键,在Dynamics CRM叫做关系.D ...

  2. jdbc操作mysql(二):封装

    案例四:封装共有操作 封装一个数据库的会话的类 import java.sql.*; public class ConnectionUtil { /** * 获取连接对象的方法,返回一个Connect ...

  3. Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...

  4. PyRevit开发第一步:获取Revit文档Document

    1.安装PythonShell插件 PythonShell 2018 插件下载 交流QQ群: 17075104 新建项目后,运行功能Python Shell, 在弹出的窗口中复制或输入以下引用代码模块 ...

  5. throw关键字

    1.基础用法 2.方法中加合法校验,告知方法的调用者 数组越界判断 3.一切皆为对象,创建的是运行期对象,则可以不处理(throws/try catch),直接交给JVM处理(打印并终止程序) 4.O ...

  6. python库--jieba(中文分词)

    import jieba 精确模式,试图将句子最精确地切开,适合文本分析:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:搜索引擎模式,在精确模式的基础上,对长词再次切 ...

  7. [ Skill ] Cadence Skill 语言入门

    https://www.cnblogs.com/yeungchie/ 写个大笔记,低速更新中 ... Cadence Skill Cadence 提供二次开发的 SKILL 语言,它是一种基于通用人工 ...

  8. 如何在win10中Java中JDK的安装和path,classpath的环境配置

    1,第一步,不用说肯定是去下一个java JDK了.目前最新版本的java JDK应该是JDK 7.0,这个就自己去百度一下了,好多网站都可以找到.2,第二步就是安装JDK虚拟机了,按照它里面的提示一 ...

  9. MySql分表、分库、分片和分区的区别

    一.前言 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 二.分片(类似分库) 分片是把数据库横向扩展(Scale Out)到多个 ...

  10. 《手把手教你》系列技巧篇(二十六)-java+ selenium自动化测试-浏览器操作(详细教程)

    1.简介 在Web自动化的操作中,我们通常需要使用一些方法来操作浏览器,今天就来学习一下.这一篇宏哥主要是介绍一下,在自动化测试的时候,我们常见的一些浏览器操作有哪些,宏哥将会一一介绍和讲解. 2.浏 ...