[题解] [AHOI2009] 跳棋】的更多相关文章

题面 题解 分类讨论, 考虑到只要所有的偶数点上都有棋子, 最左边的棋子就可以跳到最右边 题目第一问让我们求最少的在白格子上必须放的棋子数(不用考虑行动中放的棋子数) 考虑到这几种情况 有不少于两个红格子连起来, 那么他们可以一直在行动中放然后一直跳到任意一个格子, 那么行动前所需要的棋子数就是0, 但是要注意连着的两个红格子中不能有1, 因为1不是空的 一个白格子一个红格子, 那么在红格子上放一个棋子就可以用白格子上的棋子跳过去了, 代价是1 两个白格子, 直接在这个偶数点上放是最优的, 代价…
设\(f[i]\)表示在第\(i\)个格子上弄一个棋子的最小代价,前后扫两遍dp后统计答案即可. 代码 #include<bits/stdc++.h> using namespace std; #define N 2007 #define ll long long const ll inf=1e16; ll f[N]; int tag[N]; int main() { int n,i; scanf("%d",&n); for(i=1;i<=n;i++) sca…
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这篇题解. (详情见代码注释) AC代码 #include<stdio.h> #define min(a,b) (a>b?b:a) #define max(a,b) (a>b?a:b) typedef long long ll; int n,m; ll mod,k,a[500010];…
好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ" 实际上这题只要顺藤摸瓜就可以了.首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数:2.0/1状态表示是否受限制(这一条是因为有数字上限).然后根据这两个维度来接着往下想.第二个维度先撇开不看,我们只考虑如何从第 \(i - 1\) 位dp到第 \(i\) 位.在这里其实卡了有点久,因为如果除数与被除数都在改变,那么两维的转移是非常凉凉的. 这个时候联想题目的特殊性质 ----- 当感觉无法优化…
本蒟蒻又来发题解了, 看到这个题目,本蒟蒻直接开始推公式.. 嗯,可以通过弧长,推出弦长(l = 2 * r * cos(90 * l / (r * Π)); 然后对比各条弦长的平方和与直径的平方. 就可以了 QwQ 以上纯属瞎掰,回到正题 在我写完上面那种算法,然后苦苦调不出的时候. 我开始,怀疑我是不是思路有问题. 事实证明,好像确实有问题: 以上纯属瞎掰,回到正题+1 我们想一想,矩形有什么性质: 四个角都是直角. 嗯,如果在一个圆周内,什么样的角才是直角. 嗯,直径所对应的圆周角肯定是直…
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入格式 第一行两个整数N和P(1≤P≤1000000000). 第二行含有N个非负整数,从左到右依次为a1,a2,-,aN, (0≤ai≤1000000000,…
题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复杂度,我们只需将要要查询的区间的真实值更新出来,而不至于一直细分到区间的每个单元,并给更新真实值的区间附加一个“懒标记”,表示他的后代们还没有被更新.但是题中既有区间加,又有区间乘,一个懒标记难以轻松地同时把加和乘表示,怎么办呢?用两个懒标记不就好了嘛.设lzsum[i].lzmul[i]分别为i节…
link 题意 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.棋盘上有3颗棋子,分别在 \(a,b,c\) 这三个位置.我们要通过最少的跳动把他们的位置移动成 \(x,y,z\) .(棋子是没有区别的) 跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动.跳动后两颗棋子距离不变.一次只允许跳过1颗棋子. 判断是否可以完成任务.如果可以,输出最少需要的跳动次数. 思路 神仙题--非常巧妙地建模.只能说:女少口阿 首先,对于中轴棋子为 \(b\) (中间那个)的情况,显…
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 思路: 用线段树来维护当前的值和要加以及乘的值,由于加与乘是有序的,所以要在做子树之前将标记下传(注意顺序),加和乘分开来.合起来处理都可以. 代码:(当初手抽将1打成l一直RE调了半天才发现) #include<cstdio> #include<cstring> #include&…
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷milkfilling大佬的解释: ①加法优先,即规定好segtree[root*2].value=((segtree[root*2].value+segtree[root].add)*segtree[root].mul)%p,问题是这样的话非常不容易进行更新操作,假如改变一下add的数值,mul也…