发现自己简直是个智障:T1模数写成1e9+9;T2居然没有考虑刚好一个周期的情况;T4用“%lld”读入“unsigned long long”。~qwq~

T1: 跳马(nkoj 8374

问题描述:

果果上课觉得无聊,于是掏出一枚中国象棋中的"马"棋子开始玩了起来。

中国象棋中的"马"走 "日" 字,即横坐标跳1、纵坐标跳2,或者横坐标跳2,纵坐标跳1。

果果把"马"放在一个二维网格棋盘的左下角坐标为(0, 0),并且选定了一个终点(n, m),果果想知道,有多少种不同的方案可以让"马"走到终点?

果果不喜欢走回头路,因此每经过一次跳跃,横纵坐标都要离目标更近。

输入格式:

第 1 行输入 2 个整数 n,m。

输出格式:

输出 1 行 1 个整数,表示从(0,0) 跳到 (n, m) 的方案数对 109+7 取模。

数据范围:

对于 30% 的数据 0≤n,m≤500
对于 100% 的数据 0≤n,m≤10e5

  “每经过一次跳跃,横纵坐标都要离目标更近”,画画图很容易发现“马”的路线为下图:

  易得:“马”能到的地方: (n+m)%3==0  &&  0.5<=n/m<=2;

  各个合法位置的方案数为:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
...

显然是个“杨辉三角”,用组合数求出即可。

T2: 果苣之手(nkoj 8375)

问题描述:

俗话说:“果苣在手,天下我有”。而拥有果苣之手的你,决定当一个无情的发牌员。

一副牌有 n 张,编号为 1,2,...,n 。初始时牌按编号顺序排列,即位于 i 号位置的牌恰好是 i 号牌。为了公平,发牌前要先洗牌。果苣之手的特性决定了单次洗牌的规律,当一次洗牌结束后,原本位于位置 i 的牌被洗到了 pi,而 p1,p2,...,pn 构成了一个排列 。果苣之手还决定了你必须要重复洗牌 m 次。

请拥有果苣之手的你完成洗牌并输出洗牌后牌的顺序。

输入格式:

第 1 行输入 1 个整数 n。 第 2 行输入 1 个整数 m。 第 3 行输入 n 个整数 pi。

输出格式:

输出 1 行 n 个数,表示洗牌后牌的顺序。

数据范围:

1≤n≤10e5
0≤m≤10e100000
1≤pi≤n 且 p1,p2,...,pn 构成排列 对于 20% 的数据,1≤n,m≤1000 对于 70% 的数据,1≤m≤10e9

  

  首先,在洗一定次数后,一定会和原状态相同,即 会成“环”,很容易就想到用并查集(老板最爱)对每个环进行处理;

  但要注意那个 m 的范围,太巨大了,高精模了解一下:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
string a;
int b;
inline int Mod(string a,int b)
{
int d=0;
for(int i=0;i<a.size();i++) d=(d*10+(a[i]-'0'))%b;
return d;
}
int main()
{
ios::sync_with_stdio(false);
cin>>a>>b,cout<<Mod(a,b)<<endl;
return 0;
}

  code:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
string m;
int n,head,tail,MM[100005],Q[200005],P[100005],Fa[100005],Size[100005],Ans[100005];
inline int Mod(string a,int b)
{
if(MM[b]) return MM[b];
int d=0;
for(register int i=0;i<a.size();++i) d=((d<<3)+(d<<1)+(a[i]-'0'))%b;
return MM[b]=d;
}
inline int GetF(int x)
{
if(x==Fa[x]) return x;
return Fa[x]=GetF(Fa[x]);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(register int i=1;i<=n;++i) Fa[i]=i,Size[i]=1,Ans[i]=i;
for(register int i=1,fx,fy;i<=n;++i)
{
cin>>P[i],fx=GetF(i),fy=GetF(P[i]);
if(fx!=fy) Fa[fy]=fx,Size[fx]+=Size[fy];
}
for(register int i=1,j,x,fa;i<=n;++i)
{
fa=GetF(i);
if(!Size[fa]) continue;
j=Mod(m,Size[fa]),head=tail=0,x=i;
if(!j) {Size[fa]=0;continue;}
while(j) Q[++head]=x,x=P[x],--j;
while(Size[fa]) Ans[x]=Q[++tail],Q[++head]=x,x=P[x],--Size[fa];
}
for(register int i=1;i<=n;++i) cout<<Ans[i]<<" ";
return 0;
}

T3: 平方数(nkoj 8376)

(待更)(下辈子一定更)(可看 kzsn 博客 ,记得举报低俗内容哦)

T4: 简单模板水题(nkoj 8377)

问题描述:

经过一段时间的学习,果果发现很多题都是很简单的模板水题,比如下面这题。

有一个长度为 n 的数列 a1,a2,...,an,初值全为 0。

我们要对这个数列进行 m 次如下操作:

选择一个连续子数列 al,al+1,...,ar(l≤r),将其中小于 vi 的值全部修改为 vi
求 m 次操作后的数组。

输入格式:

第 1 行输入 2 个整数 n,m,表示数组长度和操作次数。 第 2 行输入 3 个整数 x,y,z 作为参数,用于生成 m 次操作的数据。

unsigned long long x, y, z;
inline unsigned long long RNG() {
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
unsigned long long w = x ^ y ^ z;
x = y;
y = z;
z = w;
return z;
}
生成方式如下: 连续调用 RNG 函数 3 次,得到 r1,r2,r3
li=min(r1%n,r2%n)+1
ri=max(r1%n,r2%n)+1
vi=r3%230
总共调用 3m 次,就能获得 m 次操作的所有数据。

输出格式:

输出 1 行 n 个数,表示 m 次操作后的数组。

数据范围:

1≤n≤105
1≤m≤107
0≤x,y,z<2e64 对于 20% 的数据,1≤n,m≤10e3 对于 80% 的数据,1≤m≤10e5

  首先YY一哈这个东西:

unsigned long long x, y, z;
inline unsigned long long RNG() {
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
unsigned long long w = x ^ y ^ z;
x = y;
y = z;
z = w;
return z;
}

  这个类似于随机(即 rand()),周期很大;

  这道题的正解是ST表(O(m+n log n)),但线段树也能过,由于太菜了,所以当时只想到了线段树,去维护区间的最小值就好了,修改+遍历,是O(m log n+n long n)的;

  然后自己把线段树魔改了一下(莫名就比ST表快了,和数据有关,理论上线段树应该比ST慢)。

  code:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define mod 1073741824
using namespace std;
int n,m,Ans[100005];
unsigned long long x,y,z;
struct node{int L,R,V;}Tree[800005];
inline unsigned long long RNG()
{
x^=x<<16,x^=x>>5,x^=x<<1;
unsigned long long w=x^y^z;
x=y,y=z,z=w;
return z;
}
inline void Build(int p,int L,int R)
{
Tree[p].L=L,Tree[p].R=R;
if(L==R) return;
int M=(L+R)>>1;
Build(p<<1,L,M),Build(p<<1|1,M+1,R);
}
inline void PutDown(int p) {Tree[p<<1].V=max(Tree[p<<1].V,Tree[p].V),Tree[p<<1|1].V=max(Tree[p<<1|1].V,Tree[p].V);}
inline void modify(int p,int L,int R,int d)
{
if(Tree[p].V>=d) return;
if(L<=Tree[p].L&&Tree[p].R<=R) {Tree[p].V=d;return;}
PutDown(p);
int M=(Tree[p].L+Tree[p].R)>>1;
if(L<=M&&R>=Tree[p<<1].L) modify(p<<1,L,R,d);
if(R>M&&L<=Tree[p<<1|1].R) modify(p<<1|1,L,R,d);
Tree[p].V=min(Tree[p<<1].V,Tree[p<<1|1].V);
}
inline void getSum(int p)
{
if(Tree[p].L==Tree[p].R) {Ans[Tree[p].L]=Tree[p].V;return;}
PutDown(p),getSum(p<<1),getSum(p<<1|1);
}
int main()
{
scanf("%d%d%llu%llu%llu",&n,&m,&x,&y,&z),Build(1,1,n);
for(register int i=1;i<=m;++i)
{
int r1=RNG()%n,r2=RNG()%n,V=RNG()%mod,L=min(r1,r2)+1,R=max(r1,r2)+1;
modify(1,L,R,V);
}
getSum(1);
for(register int i=1;i<=n;++i) printf("%d ",Ans[i]);
return 0;
}

  最后,强烈建议T3 ,T4 换位子。

2021.7.17 NKOJ周赛总结的更多相关文章

  1. 2021.1.8 NKOJ 周赛总结

    意料之中..... A:nkoj 3900 AC小程序 http://oi.nks.edu.cn/zh/Problem/Details/3900 A题比较简单,单独分析一下A和C,其实就是一个斐波那契 ...

  2. 2021.8.18 NKOJ周赛总结

    两个字总结:安详 T1: NKOJ-6179 NP问题 问题描述: p6pou在平面上画了n个点,并提出了一个问题,称为N-Points问题,简称NP问题. p6pou首先在建立的平面直角坐标系,并标 ...

  3. 2021.10.7 NKOJ周赛总结

    Ⅰ. 自描述序列 问题描述: 序列 1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,... 看似毫无规律,但若我们将相邻的数字合并 : 1,22,11,2,1,22,1 ...

  4. 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)

    2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...

  5. 2021.07.17 P4170 染色(区间DP)

    2021.07.17 P4170 染色(区间DP) [P4170 CQOI2007]涂色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.目标状态可以由哪些状态转移过来. ...

  6. 2021.07.17 P3177 树上染色(树形DP)

    2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...

  7. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  8. Noip模拟55 2021.9.17(打表大胜利)

    T1 skip 普通$dp$很好打: $f[i]=max(f[j]-\sum_{k=1}^{K}k+a_i)$ 就是要注意边界问题很烦人. 1 #include<bits/stdc++.h> ...

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

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

随机推荐

  1. C# List集合类常用操作:四、删除

    Clear() 从 List<T> 中移除所有元素. List<Employees> employees = new List<Employees>(); empl ...

  2. ACID的实现原理

    引言 ACID是事务的特点也是必须的要求,只有保证ACID事务的执行才不会出错,分别是原子性.一致性.隔离性和持久性.我们知道典型的MySQL事务是这样执行的: start transaction 开 ...

  3. PHP设计模式之模板方法模式

    模板方法模式,也是我们经常会在不经意间有会用到的模式之一.这个模式是对继承的最好诠释.当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释.就像我们平 ...

  4. 小学生都能读懂的网络协议之:WebSocket

    目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API 总 ...

  5. 美团分布式定时调度框架XXL-Job基本使用

    一:XXL JOB 基本使用 1.官方中文文档:https://www.xuxueli.com/xxl-job/ 2.基本环境: 2.1:git下载项目, 执行xxl-job数据库初始化脚本 2.2: ...

  6. SourceTree使用详解-摘录收藏

    前言: 非原创,好文收录,原创作者:追逐时光者 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Gi ...

  7. js中针对dom的crud

    1.怎样添加.移除.移动.复制.创建和查找节点? 1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 cr ...

  8. 你会阅读appium官网文档吗

    高效学习appium第一步,学会查看appium官方文档.如果能把appium文档都通读一遍,对学习appium大有益处. 而能做到通读appium官方文档的人,想必不是很多,刚开始学习appium的 ...

  9. python序列的修改、散列和切片

    新Vector类 接原vector类定义的新Vector类,原向量类是二维,现定义多维向量类: from array import array import reprlib import math c ...

  10. python风格对象

    对象表示形式 python提供了两种获取对象字符串表示形式的标准方式 repr()         //便于开发者理解的方式返回对象的字符串表示形式(一般来说满足obj==eval(repr(obj) ...