鸣谢cdy
math
【题目描述】
众所周知, xkj是GH的得意门生, 可是xkj的数学成绩并不是很理想; 每次GH在批评完数学限训做的差的人时, 总会在后面加一句:咱们班还有一位做的最差的同学——xkj,你看看你还有对号吗, 居然比CDY做的还差; xkj只好暗想: 我也很无奈啊,我已经很努力了啊;这次为了不挨批, xkj将他的数学题抛给了正在学oi的你;
【题目描述】
Xkj得到了n个硬币,每个硬币都有一个面值a[i];GH又给了他一个幸运数字(给了m次); 现在可以进行以下的转换; kj可以选择一个比k大的硬币i, 将a[i]-1;选择i左边或右边的硬币;将其+1; 经过数次变换之后问最大可以形成多长的一个连续硬币区间;使得每个硬币价值都不小于k;
【输入格式】
第一行两个整数 n , m 代表数组长度和询问个数。接下来一行, 第 i 个正整数表示 ai 。第三行 M 个正整数, 第 i 个正整数表示第 i 次询问的 k 。
【输出格式】
对于每个询问, 输出一个整数表示问题的答案。
【样例输入】
5 6
1 2 1 1 5
1 2 3 4 5 6
【样例输出】
5 5 2 1 1 0
【数据范围】
对于 20% 的数据, n≤10。
对于 40% 的数据, n≤1000。
对于 50% 的数据, n≤100000。
对于 100% 的数据, n≤1000000, m≤20, ai≤10^9, k≤10^9。
请选手注意自己的常数。
【题解】
题目描述很逗(注:是真人真事)
显然一个合法的区间的区间平均数大于等于询问的数字。不证。
对于每次询问,可以把所有数字减去询问的k,然后取一个前缀和操作,我们现在要求的是使得s[i]-s[j]>=0的最大的i-j。
对于左端点j,我们可以直接求出一个单调递减的下标数列代表左端点,至于怎么求,暴xjb力求一下就行了。
对于右端点i,我们每次可以找出对应的使得s[i]>=s[j]的最靠左的左端点j(所以这就是为啥我们要维护单调递减的数列),让右端点i从右往左扫,左端点j的初位置在单调数列的最右侧,这样我们的i在向左扫的过程中,j就不用向右扫了(因为向右扫之后肯定不会更新答案,不扫也不会更新),所以单次询问就是线性的了。
business
【题目背景】
Cdy, xkj, wzy师徒三人看到lsq, gxt等人做起生意, 赚起钱来, 不由得心里多了几分着急, 凭什么别人能赚钱而我却不能; 于是 师徒三人 凑在一起开始商讨 从商大计 有出资的 有出技术的有出场地的 ; 但师徒三人想在公司成立之间了解观察一下股市的情况, 他们有比较忙 就将任务交给了你来完成祝你好运;
【题目描述】
每天的股票都有一个初始值a[i];由于股市会有所波动 所以会有两种政令
1.对于一段区间l~r,将这段区间内所有股票值加上k;
2.对于一段区间l~r,将这段区间内所有股票值变为【a[i]/k】 ; (向下取整)
为了检验你的完成情况他们会对你有两种询问形式
3.给定l, r, 询问min(a[i])(i->l~r);(区间最小值)
4.给定l, 人, 询问sum(a[i])(i->lr);(lr)的区间和
【输入格式】
第一行为两个空格隔开的整数 n,q 分别表示所涉及的股票天数个数和政令 + 询问个数。
第二行包含 n 个由空格隔开的整数 a[1]∼a[n]
接下来 q 行, 每行表示一个操作, 第一个数表示操作编号 1∼4 ,
接下来的输入和问题描述一致。
即 op, l, r若op=1; 还会有一个x;
【样例输入】
10 10
-5 -4 -3 -2 -1 0 1 2 3 4
1 0 4 1
1 5 9 1
2 0 9 3
5
3 0 9
4 0 9
3 0 1
4 2 3
3 4 5
4 6 7
3 8 9
【样例输出】
-2
-2
-2
-2
0
1
1
【数据范围】
对于 30% 的数据, n,q≤10^3 ;
对于100%的数据1≤n,q≤105,1≤l≤r≤n,c∈[-104,104],k∈[2,109];
【题解】
不难看出这是一道线段树。
区间+,区间sum,区间min都是简单的,最关键是这个区间divfloor。
我们再维护一个区间max。
对于一个区间,我们对它进行区间div时,查询max和min注意要O(1)。
假设div的是k,那么对max进行divk的操作就相当于减去这个数:displaystyle max-leftlfloorfrac {max}k ight floor
对min的也类似:displaystyle min-leftlfloorfrac {min}k ight floor。如果这两个值相等,那么整个区间减去的数就相同了,维护一个区间减即可。
如果不同,就递归下去(就像自适应Simpson一样)
注意卡常,区间减要直接原地做减法,各种卡常才能过,一开始tmd最大的点跑几百秒,最后卡了好几次才卡进2秒,感谢各位同学的代码参考。。。
dance
【题目描述】
最近xkj沉迷于透彻无法自拔,无聊的他他又开始学起了跳舞(为了更好地找妹子吗)xkj有比较奇特他不喜欢在平地上跳舞, (哎, 有障碍才刺激啊) 于是他在一片狼藉的地上跳起了他的八字小舞; 但是同时他又想考考你, 你当然可以回答出所有问题
【题目描述】
此片土地的大小为n*m, (当然包括障碍)初始时xkj在某一个位置;Xkj在某一个时间段(L1,R1)内会向x1行动,时间段(L2,R2)内会向x2行动, 以此类推总共有T个时间段, 并且所有时间段均满足L[i+1]=R[i]+1,L[1]=1;其中x1,x2,……xT均为上下左右(东南西北)的一种;为了使xkj不撞到障碍你可以耗费一点能量让他不动,(当然是因为不能撞死他啦, 虽然他很爱fb);问xkj在R[T]这个时刻内最多能移动多远的距离(你耗费能量定住他时, 他边不会移动);
【输入格式】
输入文件的第一行包含5个数n, m, x, y和T。 N和M描述舞厅的大小,x和y为xkj的初始位置;以下n行, 每行m个字符。 第i 行第j 列的字符若为‘. ’ , 则表示该位置是空地; 若为‘x ’ , 则表示有障碍。以下T行, 顺序描述T个时间段, 格式为: Li Ri di(1 ≤ i ≤ T)。 表示在时间区间[Li, Ri]内, xkj向di方向移动。 di为1, 2, 3, 4中的一个, 依次表示北、 南、 西、 东(分别对应矩阵中的上、 下、 左、 右) 。
【输出格式】
输出文件仅有1行, 包含一个整数, 表示xkj滑行的最长距离(即格子数)。
【样例输入】
4 5 4 1 3
..xx.
.....
...x.
.....
1 3 4
4 5 1
6 7 3
【样例输出】
3
【数据范围】
对于50%的数据, 1≤n m≤200, T≤200; 对于100%的数据, 1≤n,m≤200, t[n]≤40000。
【题解】
这道题原题是[NOI2005]瑰丽华尔兹,本来是单调队列优化dp,但是数据水,所以直接dp的复杂度是O(能过)//对于某些lrt大佬就是卡了
设f[i][x][y]为到第i个时间段的末尾,坐标在(x,y)最长距离。这里为了卡常我们刷表(推表):用f[i-1][x][y]推f[i][nx][ny],(nx,ny)为(x,y)在第i时段的方向能到达的所有点(不超时并且不撞墙的点)。dp取max转移即可。
单调队列优化不会,反正NOIP应该不考。
cdy的题真是难(省选知识点。。。话说我的数学题???NOIP考什么数学 小凯的疑惑。。。)