这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很

然后是真的猜题意了搞了。

不过这样都可以涨Rating我也是服了。

Upt:链接莫名又消失了

A. 「NOIP2017模拟赛11.03」Egypt丶小黑车

题意一看就是很精简的数学题,

首先我们用经典的方法,假设我们用\(f_x\)表示\([1,x]\)的答案,那么最后输出的就是\(f_r-f_{l-1}\)了

然后考虑求解\(f_x\)。我们知道对于一个\([1,x]\)的区间里,含有约数\(d\)的数有\(\lfloor \frac{x}{d}\rfloor\)个。

所以我们考虑枚举所有以数码\(k\)开头的数\(d\),然后累加\(\lfloor \frac{x}{d}\rfloor\)即可。

然后我们发现这样会很慢,所以我们对于一整段数一起枚举。

什么意思,比如在枚举数码\(k=1\)时,我们每次分别求解\([1,1],[10,19],[100,199]......\)

然后我们要做的就是快速对于一段区间进行统计了。

我们先考虑最暴力的想法:每次从\([l,r]\)之间依次枚举,但这样的话当\(r-l\ge 10^5\)时就会超时

但是我们发现,当\(r-l\ge10^5\)时,设其中的一个数为\(s\),那么\(n/s\le 10^4\)。

所以我们枚举商\(m\),然后通过商来得出\([l,r]\)中对应的数有哪些即可。

CODE

#include<cstdio>
using namespace std;
typedef long long LL;
const LL pow[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000},div=100000;
LL a[15],b[15],l,r;
inline LL min(LL a,LL b)
{
return a<b?a:b;
}
inline LL max(LL a,LL b)
{
return a>b?a:b;
}
inline LL work(LL l,LL r,LL n)
{
if (r<l) return 0; register LL i; LL ans=0;
if (r-l<=div)
{
for (i=l;i<=r;++i)
ans+=n/i; return ans;
}
for (i=n/r;i<=n/l;++i)
{
LL low=max(n/(i+1),l),high=min(n/i,r);
if (n/low!=n/high) ans+=(high-low)*i; else ans+=(high-low+1)*i;
}
return ans;
}
inline void solve(LL n,LL *num)
{
if (!n) return; register LL i,j;
for (i=1;i<=9;++i)
for (j=0;j<=10&&pow[j]<=n;++j)
num[i]+=work(i*pow[j],min(n,(i+1)*pow[j]-1),n);
}
int main()
{
//freopen("A.in","r",stdin); freopen("A.out","w",stdout);
scanf("%lld%lld",&l,&r);
solve(l-1,a), solve(r,b);
for (register LL i=1;i<=9;++i)
printf("%lld\n",b[i]-a[i]);
return 0;
}

B. 「NOIP2017模拟赛11.03」Egypt丶李小车

首先讲一下题目缺少了一个很重要的条件,就是只有当敌方英雄在位置\(n\)上时才能结束踢人

然后我们考虑一下,如果我们事先知道一个点能不能到达终点,这样就可以直接统计答案了。

为什么?因为如果对面现在在位置\(i\)上,我们分情况讨论:

  1. \(i=n\)直接结束踢人即可。因为再踢下去肯定是没有当前优的。
  2. \(i+a_i\)可以到达终点,这样我们直接让字符串加上\(a\)即可。因为这样可以让字典序最小,用\(b\)的话再短也没有用。
  3. \(i+b_i\)可以到达且\(i+a_i\)无法到达。同上,字符串加上\(b\)即可。因为总比无解要强。
  4. 两个都无法到达,那么必定无解。

然后我们在上面的基础上判断一下是否有点被重复访问即可。

对于一个点能否走到终点,只需要把边反向建之后从终点BFS即可。

CODE

#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int N=1e5;
struct edge
{
int to,next;
}e[N<<1];
int head[N],n,a[N],b[N],q[N],cnt,tot;
bool vis[N],use[N];
char ans[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc(); int flag=1;
while (ch<'0'||ch>'9') { if (ch=='-') flag=-1; ch=tc(); }
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc(); x*=flag;
}
inline bool check(int x)
{
return x>=1&&x<=n;
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline void BFS(int x)
{
int H=0,T=1; q[1]=x; vis[x]=1;
while (H<T)
{
int now=q[++H];
for (register int i=head[now];i!=-1;i=e[i].next)
if (!vis[e[i].to]) vis[e[i].to]=1,q[++T]=e[i].to;
}
}
inline void print(void)
{
for (register int i=1;i<=tot;++i)
putchar(ans[i]);
}
inline void DFS(int now)
{
if (!(now^n)) { print(); exit(0); }
if (use[now]) { puts("Infinity!"); exit(0); } use[now]=1;
if (check(now+a[now])&&vis[now+a[now]]) ans[++tot]='a',DFS(now+a[now]); else ans[++tot]='b',DFS(now+b[now]);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n);
memset(head,-1,sizeof(head));
memset(e,-1,sizeof(e));
for (i=1;i<=n;++i)
{
read(a[i]);
if (check(i+a[i])) add(i+a[i],i);
}
for (i=1;i<=n;++i)
{
read(b[i]);
if (check(i+b[i])) add(i+b[i],i);
}
BFS(n); if (!vis[1]) { puts("No solution!"); return 0; }
DFS(1); return 0;
}

C. 「NOIP2017模拟赛11.03」Egypt丶法拉利

这道题其实是水题,但是我真的因为ZZ然后没发现反例。

首先有一个很naive的想法。统计之前问号的个数,然后在冲突时看一下是否有问号,有就用问号来抵消冲突。

但是这个方法有一个致命的弱点,就是对于问号的时间把控有问题。比如有一组反例(感谢CJJ dalao无偿提供)

3

?

I 1

I 1

对于上面的想法会给出\(-1\)。但答案很明显是\(3\)。

那么是哪里出问题了,很简单,就是问号操作在I操作之间才出现,这样就无法抵消效果。

想到这里就很简单了,我们把所以问号的操作的时间存到set里。每次矛盾时把在它后前的最早出现的问号使用掉,因为你前面的不用用后面的可能会让后面的没法用。一个小贪心

然后我们就直接上STL大法即可解决其实线段树也是可以的

CODE

#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
const int N=1e5+5;
int a[N],last[N],x,m;
char opt;
set <int> s;
set <int>::iterator it;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(m);
for (i=1;i<=m;++i)
{
opt=tc(); while (opt!='I'&&opt!='O'&&opt!='?') opt=tc();
if (opt^'?')
{
read(x); a[x]+=opt^'I'?-1:1;
if (a[x]<0||a[x]>1) { if ((it=s.lower_bound(last[x]))!=s.end()) s.erase(it),a[x]+=opt^'I'?1:-1; else return printf("%d",i),0; }
last[x]=i;
} else s.insert(i);
}
return printf("-1"),0;
}

EZ 2018 06 17 NOIP2018 模拟赛(十九)的更多相关文章

  1. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  2. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

  3. EZ 2018 06 02 NOIP2018 模拟赛(十七)

    这次的比赛是真心比较狗,我TM的写了30min的树剖ZZ地直接memset超时了 话说我既然想到差分就应该去写差分的啊! 好了不过这次Rank还挺高的,终于要打进前10了当然是假的了. 好了下面开始讲 ...

  4. EZ 2018 04 21 NOIP2018 模拟赛(九)

    终于停止了掉Rating的浪潮! 猥琐的链接 这次200分才Rank10,而且很多人并列 庆幸T2最后20分钟发现期望的算法打错了,然后拿到了50pts,250收场 T1 水题*1 这道题不仅做过,而 ...

  5. EZ 2018 05 20 NOIP2018 模拟赛(十五)

    这次的比赛充满着玄学的气息,玄学链接 首先讲一下为什么没有第十四场 其实今天早上9点时看到题目就叫了:原题! 没错,整套试卷都做过,我还写了题解 然后老叶就说换一套,但如果仅仅是这样就没什么 但等13 ...

  6. EZ 2018 05 26 NOIP2018 模拟赛(十六)

    这次难道就是传说中的标准分大赛?而且这次比赛的链接不翼而飞了 一堆人153pts然后就有Rank4?看来这个Rank4不值钱了,才涨了50+的Rating. 不过还好最后5min的时候想出了T1正解, ...

  7. EZ 2018 05 04 NOIP2018 模拟赛(十二)

    这次的试卷应该是激励我们一下的,链接 然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩 掉了5rating但Rank竟然发杀了 X_o_r dalao && YZ ...

  8. EZ 2018 04 21 NOIP2018 模拟赛(十) -LoliconAutomaton的退役赛

    难得的一次Unrated,避免了重回1500的尴尬 其实题目都还可以,但只不过所有人T1都炸了,可能是数据的锅(假的) 而且我因为T1SB的把T2弃了,没想到是千年水题 T3莫名爆炸,然后TM的40分 ...

  9. EZ 2018 05 13 NOIP2018 模拟赛(十三)

    这次的比赛真心水,考时估分240,然后各种悠闲乱逛 然后测完T1数组开小了炸成40,T2,T3都没开long long,T2炸成20,T3爆0 掉回1600+的深渊,但是还有CJJ dalao比我更惨 ...

随机推荐

  1. Android View体系(五)从源码解析View的事件分发机制

    1.处理点击事件的方法 View的层级 我们知道View的结构是树形的结构,View可以放在ViewGroup中,这个ViewGroup也可以放到另一个ViewGroup中,这样层层的嵌套就组成了Vi ...

  2. UML类图关系图解

    一.类结构 在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称.属性和方法. 其中, 一般类的类名用正常字体粗体表示,如上图:抽象类名用斜体字粗体,如User:接 ...

  3. 将mssql数据库高版本迁移到低版本

    将mssql数据库高版本迁移到低版本 在低版本目标数据库中创建目标空数据库[TargetDb] ,注意新建数据库即可,不要创建任何表 在低版本数据库中,选中[服务器对象=>链接服务器] 右键[新 ...

  4. ubuntu 14.04安装zabbix3.0以及汉化

    文章出处借鉴于 http://www.cnblogs.com/-10086/p/5317524.html 1.下载deb # wget http://repo.zabbix.com/zabbix/3. ...

  5. SVPullToRefresh问题解决

    今天在使用SVPullToRefresh时发现当数据太少时,刷新的时候同时进行了上拉和下拉刷新,现解决方法如下: 解决办法: 1.打开iUIScrollView+SVInfiniteScrolling ...

  6. SQL Server2008 18456错误

    1.以windows验证模式进入数据库管理器.   第二步:右击sa,选择属性:   在常规选项卡中,重新填写密码和确认密码(改成个好记的).把强制实施密码策略去掉.   第三步:点击状态选项卡:勾选 ...

  7. for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); };答案:4 4 4。

    看面试题时,发现了一道较为经典的面试题,代码如下 for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); }; / ...

  8. msyql备份还原

    MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Win32下MySQL的备份与还原 1.1 备份 开始菜单 | 运行 | cmd |利用“cd \Prog ...

  9. Java面试之五大框架的理解

    五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...

  10. 深入探究JFreeChart

    1 简介 JFreeChart 是 SourceForge.net 上的一个开源项目,它的源码和 API 都可以免费获得. JFreeChart 的功能非常强大,可以实现饼图 ( 二维和三维 ) ,  ...