首页 > TAG信息列表 > NOI2005

「NOI2005」聪聪和可可 题解

「NOI2005」聪聪和可可 题解 题目大意 n个点,m条路的无向图,猫在S点,老鼠在T点,假设每个时间节点猫先走。猫每个时间节点可以靠近老鼠走两步(最短路),如果一步就可以抓到老鼠,就走一步,如果有多条最短路,选择节点标号小的一条;老鼠等概率地选择去向相邻的点或停留。 求猫捉到老鼠的期望时间。

P4206 [NOI2005] 聪聪与可可

预处理 nxt[i,j] 表示i到j最近距离i的下一个位置 最后记忆化搜索就好 #include<cstdio> #include<queue> #include<cstring> #include<iostream> using namespace std; int cur,n,m,s,t; int head[1005],p[1005]; int dis[1005][1005],nxt[1005][1005]; bool vis[1005],visit[

P2042 [NOI2005] 维护数列 题解

一道奆数据结构题,需要有较高的码力和基础的数据结构。 一看过去就会发现这是道数据结构题,然后这道题实际上就是平衡树的板子题只是有各种奇怪的操作而已。我用的是 FHQ Treap。 其实吧这道题本来我不打算写题解的,毕竟还是比较显然的数据结构题,但是这道题的众多坑点让我还是决定写

[20220116]P2254 [NOI2005] 瑰丽华尔兹

\(\textbf{基础思路:DFS+记忆化。}\) 题意理解 nbvvnv 基本框架 #include<bits/stdc++.h> #define For(looper,begin,end) for(int looper=begin;looper<=end;looper++) using namespace std; int N,M,x,y,K; char wt[205][205]; int s[205],t[205],d[205]; int main(){ ios::s

[NOI2005] 瑰丽华尔兹

在同一段时间段里滑动方向是一致的 由于有家具,所以我们每次滑动一格子。(特判的时候要注意边界 dp的 i,j 表示坐标的位置 我们的队列中如果比我们的答案要劣,那么我们就把它弹出来 在单调队列中,我们需要的往往是队头的优答案 dp[x][y] = max ( dp[x][y] , q[l].len + dis(x,y,q[l].x,

[NOI2005] 维护数列

[NOI2005] 维护数列 一道锻炼代码能力的好(毒瘤)题! 历经 \(10h+\) , 终于过了这道题...用指针的人太少了, 只能自己查错, 而且由于空指针的存在, 指针本身需要特判的情况就更多. 但是无奈对于指针の爱...唉~ 这道题本身没有任何思维难度, 只要会一棵趁手的, 支持区间反转的平衡树

[NOI2005] 聪聪与可可

聪聪与可可 题目大意 给你一张图,再给你两个位置,这两个位置上有两个人,分别是A和B。A知道B的位置且每次都是他先走,A每次能走两步(由于他知道位置,所以每次都是向离B更近的点走,若距离相同,走标号最小的点),B每次随机走向下一个地点。求A和B到达同一个位置的期望。 解决方案 我们设\(f[i]

[NOI2005]聪聪和可可

###概率与期望 首先还是建边,双向边,之后记录每一个点的出度,之后可以用\(spfa\)或者是\(dijkstra\)来计算出每个点之间的最短距离,每个猫都 绝 顶 聪 明 ,故他们会计算出来最短路来转移,但是我们计算最短路的目的并不是单纯的最短路,而是为了计算一个 miaomiao(四声)的数组:\(nxt\)数

NOI2005瑰丽华尔兹

include<bits/stdc++.h> using namespace std; namespace yspm{ inline int read() { int res=0,f=1; char k; while(!isdigit(k=getchar())) if(k'-') f=-1; while(isdigit(k)) res=res10+k-'0',k=getchar(); return resf; } const int N=210; int

luogu P4207 [NOI2005]月下柠檬树

luogu 为了方便,设树顶的那一点为一个半径为0的圆 首先我们把所有圆投影到平面上,然后得到的图形应该是一堆圆心在\(x\)轴上的圆+相邻两个圆公切线构成的梯形的并,我们可以只计算上面一半的面积然后乘2.因为上面一半的轮廓线不规则,考虑自适应Simpson求轮廓线和\(x\)轴围成的面积.

[NOI2005]维护数列(区间splay)

[NOI2005]维护数列(luogu) 打这玩意儿真是要了我的老命 Description 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格)   Code #include <cstdio> #include <cstdlib> #include <algorithm> #define TAGNONE 10000001 usin

$NOI2005$瑰丽华尔兹

\(NOI2005\)瑰丽华尔兹 单调队列实现好题。 设\(f[k][i][j]\)表示第\(k\)段区间在\((i,j)\)出的最优答案。 \(f[k][i][j]=max(f[k-1][I][J]+Dis)\)(\(Dis\)是距离,\((I,J)\)是上一个合法位置。懒得写了。。。) 考虑单调队列加滚动数组解决\(MLE,TLE\)的问题。。。 在遇到障碍物时清零

【NOI2005】维护数列

Description 维护一个数列的如下操作: 在某个位置后插入一段数列 在某个位置后删除一段数列 将连续的一段数列修改为某个值 将一段数列翻转 求一段数列的和 求整个数列的最大子段和 Solution 魔鬼Splay题 用Splay维护序列,以下标为权值建树。 如果插入一段序列,我们就将这段序列本

treap-[NOI2005]维护数列

swap的标记要注意,打标记时先要更新根节点 #include<bits/stdc++.h> using namespace std; const int MAXA=4050000; const int MAXN=5e8; int val[MAXA],s[MAXA][2],su[MAXA][2],sum[MAXA],ans[MAXA],vflag[MAXA],tag[MAXA],siz[MAXA]; void update(int x){ if(x==0) return ;

Luogu P2042 [NOI2005]维护数列

题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格) 输入输出格式 输入格式: 输入文件的第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。 第 2 行包含 N 个数字,描述初始时的数列。 以下

BZOJ 1500 [NOI2005]维修数列 FHQ Treap

终于A了这题。。。这题还是很好。。。但是我太菜。。。重构了三遍qwq   FHQ Treap大法好!qwq。。。~~ Ins:直接拿输入造一棵树,把原来的树split成[1,pos],[pos+1,n],然后merge三棵树; Del:把要删的区间split出来,merge他两边的树,记着要回收内存; Mk-Same:把要改的区间split出来,打上标记,更