今天总体来说 菜爆了,打了 \(3\) 个暴力,没有一个是正解,并且每一个分数都低得要命。。。

主要还是太菜了。。。

第一题开题发现和昨天 \(T3\) 一样,然而因为还没学可持久化数据结构就咕掉了。。。

昨天要是学一学就好了。

然而彭师傅还想出了 \(STL\) 大法。

非常好用。

但是好多人用的还是主席树来维护。

似乎码量也不长。。。

但是我只能弱弱地说一声不会。。。。

菜就是了。。。

所以我今天要去学一学这玩意,以防明天再考。

T1:

\(T1\) 又是一个一眼只能 \(\mathcal O(n^3)\) 暴力的玩意。。。

\(\color{red} {\huge{\text{非常不友好}}}\)

但是明显地可以用 单调栈 将其优化为 \(\mathcal O(n^2)\) 的。。。。。。。。。

然而。。。。。。

这个只是最最低分的暴力。。。。

垃圾爆了。。。。

并且出题人很友好毒瘤。

暴力给了 \(30\%\) 的 \(\color{red}{\huge{\text{高}}}\) 分。

\(\color{red} {\huge{\text{非常不友好}}}\)

对于 \(Ans\) 我们要求的就是:

\[he_j-he_{j-1}-a_x =0
\]

满足这个式子的 \(i,j\) 位置。

(其中省略了取模)

所以我们只有 \(1e6\) 个取值。

然后在处理前缀和的时候开 \(1e6\) 个 \(vector\) 动态数组。

然后第一个下标是余数,然后第二个动态的是余数为第一个下标的位置

就是:

for(register int i=1;i<=n;++i)
vec[he[i] % k].push_back(i);

就是这样。

因为我们是按照顺序进行插入下标的,所以我们可以使用 \(lower_bound\) 和 $upper_bound¥ 函数进行二分查找

这就是 \(\mathcal O(log_2^n)\) 的复杂度。

因为我们要先枚举左边或者是右边的区间。

每次选择较小的那个,这样综合起来就是 \(\mathcal O(nlog_2^n)\) 的复杂度。

然后加上二分查找就是 \(O((log_2^n )^2)\)。

显然可以过。。。

#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl;
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 1e6+10,maxb = 110,inf = 0x7f7f7f7f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
int st[maxn],tot = 0,n,k,a[maxn];
ll ans = 0;
ll he[maxn];
std::vector<int>vec[maxn];
inline void gan(int x,int l,int r)
{
if(r - x > x - l)
{
try(i,l,x)
{
register int j = (a[x] + he[i-1]) % k;
int left = std::lower_bound(vec[j].begin(),vec[j].end(),x) - vec[j].begin();
int right= std::upper_bound(vec[j].begin(),vec[j].end(),r) - vec[j].begin();
ans += right - left;
// cout<<"ans = "<<ans<<endl;
}
}
else
{
try(i,x,r)
{
register int j = (he[i] - a[x] % k + k) % k;
int right = std::upper_bound(vec[j].begin(),vec[j].end(),x-1) - vec[j].begin();
int left = std::lower_bound(vec[j].begin(),vec[j].end(),l-1) - vec[j].begin();
ans += right - left;
// cout<<"ans = "<<ans<<endl;
}
}
}
int l[maxn],r[maxn];
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get<signed>(); k = get<signed>();
try(i,1,n) a[i] = get<signed>(),he[i] = (he[i-1] + a[i]) % k;
try(i,1,n)
{
while(tot and a[i] >= a[st[tot]]) r[st[tot]] = i - 1,tot--;
l[i] = st[tot] + 1;
st[++tot] = i;
}
while(tot) r[st[tot--]] = n;
// try(i,1,n) cout<<"l[i] = "<<l[i]<<" r[i] = "<<r[i]<<endl;
vec[0].push_back(0);
try(i,1,n) vec[he[i]%k].push_back(i);
try(i,1,n) gan(i,l[i],r[i]);
cout<<ans - n<<endl;
return 0;
}
}
signed main() {return xin::main();}

T2:

这个题其实式子一眼看出。

然而就是打不对。。。

因为我们还有一个操作: 就是约分。

这个才是最毒瘤的地方。。。

本来我们计算出来值之后乘上一个 \(inv\) 就行了。

但是我们要约分。。。。

不能直接取模,因为是分数。。。。

因为答案的式子是:

\[\frac {A_{2^n}^{m}} {2^{nm}}
\]

然后可以发现下面的式子当中约数只有 \(2\)。

所以直接搞 \(2\) 就行了。

然后对于 \(2^n\leqm\) 的情况直接计算并输出两个分母就行了。

#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl;
#define int long long
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 2e6+10,maxb = 110,inf = 0x7f7f7f7f,mod = 1e6+3;
#define try(i,a,b) for(register int i=a;i<=b;++i)
#define throw(i,a,b) for(register int i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
inline int ksm(int x,int y)
{
register int ret = 1;
while(y)
{
if(y & 1) ret = ret * x % mod;
x = x * x % mod;y >>= 1;
}
return ret % mod;
}
int n,m;
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
std::cin>>n>>m;
n = n % (mod - 1);
int ci = 65,fj = 0,pos = 1;
while(ci--)
{
pos <<= 1;
if(pos >= m) break;
fj = (fj + (m - 1) / pos) % (mod - 1);
}
int inv = ksm(ksm(2,fj),mod-2);
int ms = ksm(2,n);
int fm = ksm(ms,(m-1) % (mod - 1)) * inv % mod;
if(m <= mod)
{
int fz = inv;
try(i,1,m-1)
fz = fz*(ms-i+mod)%mod;
fz = (fm - fz + mod) % mod;
cout<<fz<<' '<<fm<<endl;
}
else cout<<fm<<' '<<fm<<endl;
return 0;
}
}
signed main() {return xin::main();}

T3:

大贪心

然而并不好想出。

我猜你们在考场上都是写了 \(1000\) 多个 \(if\)。

然后一个一个手造样例。。。

然而只能拿到 \(10pts\)。

一看全都判成 \(-1\) 了。

正解其实是用两个 \(class\)

一个里面是 \(up\) 表示最大的。

然后一个里面是 \(down\) 装上最小的。

这样就行了。

之后算出来的 \(up\) 和 \(down\) 再去反向模拟算答案。

然后愉快骗过\(special\;judge\)。

愉快 \(AC\)

细节见代码:

#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl;
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 2e6+10,maxb = 110,inf = 0x7f7f7f7f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
class xin_data
{
public:
int val,len;
xin_data(){}
xin_data(int val,int len):val(val),len(len){}
}up[maxn],down[maxn];
int a[maxn],ans[maxn],n,he[maxn];
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get<signed>();
try(i,1,n) a[i] = get<signed>();
a[1] = 1; up[1] = down[1] = xin_data(1,1);
try(i,2,n)
{
up[i] = xin_data(up[i-1].val,up[i-1].len+1);
down[i] = xin_data(down[i-1].val,down[i-1].len+1);
if(up[i].len > 2)
{
up[i].val ++;
up[i].len = 1;
}
if(down[i].len > 5)
{
down[i].val ++;
down[i].len = 1;
}
if(a[i])
{
if(up[i].val == a[i]) up[i].len = std::min(up[i].len,2);
if(up[i].val > a[i]) up[i] = xin_data(a[i],2);
if(down[i].val < a[i]) down[i] = xin_data(a[i],1);
if(up[i].val < a[i] or down[i].val > a[i]) {cout<<-1<<endl; return 0;}
}
}
if(up[n].len == 1) up[n] = xin_data(up[n-1].val,up[n-1].len+1); ans[n] = up[n].val;
cout<<up[n].val<<endl;
he[a[n]] = 1;
throw(i,n-1,0)
{
if(a[i]) ans[i] = a[i];
else
{
register int zhuan = std::min(ans[i+1],up[i].val);
if(he[zhuan] == 5) zhuan --;
ans[i] = zhuan;
}
he[ans[i]] ++;
}
try(i,1,n) printf("%d ",ans[i]);
return 0;
}
}
signed main() {return xin::main();}

总之,尽力想出能想出的所有。

[考试总结]noip模拟12的更多相关文章

  1. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

  2. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  3. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  4. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  5. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  6. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  7. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  8. 2021.8.12考试总结[NOIP模拟37]

    T1 数列 考场上切掉的简单题. $a$,$b$与数列中数的正负值对答案无关.全当作正数计算即可. $exgcd$解未知数系数为$a$,$b$,加和为$gcd(a,b)$的不定方程组,再枚举每个数.如 ...

  9. 2021.10.12考试总结[NOIP模拟75]

    T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...

随机推荐

  1. 【SQLite】教程02-SQLite命令

    获取帮助 sqlite> .help 获得以下帮助: 命令 描述 .backup ?DB? FILE 备份 DB 数据库(默认是 "main")到 FILE 文件. .bai ...

  2. Django基础之路由层

    内容概要 路由匹配 无名有名分组 反向解析 无名有名分组反向解析(难理解) 路由分发 名称空间 伪静态 内容详细 1 路由匹配 urls.py url()方法第一个参数其实是一个正则表达式 第一个参数 ...

  3. 使用 Hexo 搭建静态博客

    目录 Hexo 简介 什么是 Hexo? Hexo 安装 Hexo 建站 Hexo 配置 Hexo 自定义主题 Hexo 写作 Hexo 服务器 Hexo 生成与发布 一键部署 Hexo 站点到 gi ...

  4. CentOS 7服务管理

    CentOS 6 使用service 管理指令: service 服务名 [start | stop | restart | reload | status] 但在 CentOS7.0 后 不再使用 ...

  5. 来了!STM32移植LuatOS,潘多拉示例全新教程

    进击的五月,继上期<使用Air724UG制作简易贪吃蛇>教程之后,@打盹的消防车 又为大家带来基于STM32的潘多拉LuatOS移植全新教程: 为什么使用潘多拉作为教程呢? STM32不能 ...

  6. ClickHouse学习系列之五【系统库system说明】

    背景 之前介绍过ClickHouse相关的系列文章,现在ClickHouse已经能正常使用起来了,包括副本和分片.因为ClickHouse已经可以提供服务了,现在需要关心的就是服务期间该数据库的各项性 ...

  7. Java知识复习(四)

    最近准备跳槽,又要好好复习基本知识了.过了个年,前面刚接触的springboot也只能先放放了.就先把自己复习了哪些罗列出来吧. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用== ...

  8. 为什么catch了异常,但事务还是回滚了?

    前几天我发了这篇文章<我来出个题:这个事务会不会回滚?>得到了很多不错的反馈,也有不少读者通过微信.群或者邮件的方式,给了我一些关于test4的回复.其中还有直接发给我测试案例,来证明我的 ...

  9. MATLAB导入txt和excel文件技巧汇总:批量导入、单个导入

    在使用MATLAB的时候,想必各位一定会遇到导入数据的问题.如果需要导入的数据其数据量巨大的话,那么在MATLAB编辑器中将这些数据复制粘贴进来,显然会在编辑器中占据巨大的篇幅,这是不明智的. 一般来 ...

  10. unity调用安卓方法实现安装apk文件(androidx)

    原文链接:点击打开 unity想要实现安装apk文件需要与安卓通讯,所以需要自己来实现安卓代码. 第一步先要新建一个安卓项目提供给unity来使用,我这里使用的工具是android studio4.1 ...