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

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

不过这样都可以涨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. loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试

    调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...

  2. 腾讯X5WebView集成及在移动端中使用

    工作中经常涉及H5网页的加载工作,最多使用的就是安卓系统控件WebView,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久,体验很差. 那能不 ...

  3. 聊聊HTTP gzip压缩与常见的Android网络框架

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/5835990.html 进入主题之前,我们先来看一下客户端与服 ...

  4. 【Java入门提高篇】Day33 Java容器类详解(十五)PriorityQueue详解

    今天要介绍的是基础容器类(为了与并发容器类区分开来而命名的名字)中的另一个成员——PriorityQueue,它的大名叫做优先级队列,想必即使没有用过也该有所耳闻吧,什么?没..没听过?emmm... ...

  5. VS2015 无法启动 IIS Express Web 服务器 解决方案

    VS2015 IIS Express 无法启动Web 解决方案 [亲测已成功] 1.我的电脑—管理—事件查看器—Windows日志—应用程序: 详细信息会提示你:[模块 DLL C:\Program ...

  6. nginx基础知识总结

    1.nginx的工作模式 master/worker工作模式: 一个master进程: 负载加载和分析配置文件.管理worker进程.平滑重启升级等. 一个或多个worker进程 处理并响应用户请求 ...

  7. vSphere ESXi 重新安装后的虚拟机恢复(转载)

    安装的 ESXi 的物理主机密码忘记,登录 不上了,需要重新安装 ESXi,安装后恢复原先物理主机上的 虚拟机的方法如下(VMFS分区完好): 关于 VMFS 分区: ESXi 的安装时会划分一个分区 ...

  8. i.s.h.med Enhancement for cancelling an appointment

    This article intends to introduce my experience about enhancement for canceling an appointment. I tr ...

  9. GUI_菜单练习

    package com.mywindow.test; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...

  10. c++11の异步方法 及线程间通信

    1. std::promise 可以用来在线程间提供数据传递. std::future = std::promise.get_future(). 线程中可以对promise赋值std::promise ...