THUSC2015
2015-06-30 10:12
176 查看
这些题目在BZOJ上面有,可惜是权限题。话说BZOJ上面的题目真的挺好的,要不是我穷,早就去弄个号了!
言归正传,今年的题目难度可以由一个名人名言看出:
题目太水。——某某神犇
可是我掂量了一下,发现如果自己去的话,估计就没什么好果子了。估计只能拿个\(100+10+40=150\)分了,: (。
举个例子,如果询问第\(k\)大,那么首先确定最高位,我们可以统计这个询问的矩形里面最高位是\(0\)个数字个数,假设是\(x\),那么如果\(x \leq k\),则最高位是\(0\),否则是\(1\)。如法炮制,我们就能算出这个答案了。
看数据范围,发现\(n\)和\(p\)非常小(这很容易萌生暴搞的想法),我们要做的是,求在询问矩形里,形如YYYYYXXX的数字的数量,其中Y表示答案的最高的已知的几位,X则是任意的\(0\)或\(1\)。由于\(n\)很小,这里我们可以把矩形拆成一行一行的横条状,我们分开统计每一行。
这样我们的问题就变为,在\(Y\)序列的某段区间里,形如ZZZZZXXX的数量,其中Z是对应的Y与\(X_i\)的异或值(\(i\)表示是第几行),X的含义同上。这样的话,我们可以排序然后二分,或者是使用可持久化字母树。
时间复杂度:\(O(60 m \log m + 60 n p\log m)\)(排序二分)
\(O(60m + 60^2np)\)(字母树)
由于\(p\)是给出的,打个表就能发现一些奇怪的性质。这里我用一副图(\(p=233\))展示:图片像素太大,不妨下载下来放大看。
可以发现,整个图是若干连通块,对于一个连通块来说,是一个环加上周围的若干棵树。由于我没写过,听被人说所有环的长度的最小公倍数在\(60\)左右,每个点到环的距离在\(20\)左右。
假设一开始所有的数都在环上,我们可以维护一个线段树,每个结点记下该区间被修改\(k\)次后,该区间所有数的和,其中\(k\)取决于所有环的长度的最小公倍数。这样,时间复杂度为:\(O(60n\log n)\),这里\(k\)当\(60\)算。
现在由于有些数不在环上,我们暴力改并维护线段树就好,因为对于一个数而言,暴力改的次数在\(20\)左右。
假设所有的数不同,那么就是水题一道,因为我们能轻易地算出第一列,同时由知道最后一列,那么我们就知道了每个数字后一个是什么数字。接着,从\(0\)开始就能推导出答案。
但是,如果有相同的,举个例子:
我们并不知道跟在第二行的\(0\)后面的\(1\)究竟是第一行最后一个\(1\),还是第四行最后一个。
我们可以这么想:
对于下面的情况,最后一列究竟是怎样的。
括号里边的是唯一的标识。
我们可以把第一列移到最后一列,得到的新的行,并且这样的行一定存在。这样我们就发现了:对于同一个数字,相对的位置还是不变的。对于最初的例子来说,第二行的\(0\)后面的\(1\)就是第一行最后一个\(1\)。
这样,相同的数字其实“不相同”,我们可以加上唯一的标识,那就跟所有数字不相同的做法一样了。
到此,我们就搞定的THUSC的题目了。你觉得它有NOI的难度吗?
言归正传,今年的题目难度可以由一个名人名言看出:
题目太水。——某某神犇
可是我掂量了一下,发现如果自己去的话,估计就没什么好果子了。估计只能拿个\(100+10+40=150\)分了,: (。
异或运算
对于每个询问,最基本的思路就是从高位到低位确定答案(因为异或元素位与位之间不影响)。举个例子,如果询问第\(k\)大,那么首先确定最高位,我们可以统计这个询问的矩形里面最高位是\(0\)个数字个数,假设是\(x\),那么如果\(x \leq k\),则最高位是\(0\),否则是\(1\)。如法炮制,我们就能算出这个答案了。
看数据范围,发现\(n\)和\(p\)非常小(这很容易萌生暴搞的想法),我们要做的是,求在询问矩形里,形如YYYYYXXX的数字的数量,其中Y表示答案的最高的已知的几位,X则是任意的\(0\)或\(1\)。由于\(n\)很小,这里我们可以把矩形拆成一行一行的横条状,我们分开统计每一行。
这样我们的问题就变为,在\(Y\)序列的某段区间里,形如ZZZZZXXX的数量,其中Z是对应的Y与\(X_i\)的异或值(\(i\)表示是第几行),X的含义同上。这样的话,我们可以排序然后二分,或者是使用可持久化字母树。
时间复杂度:\(O(60 m \log m + 60 n p\log m)\)(排序二分)
\(O(60m + 60^2np)\)(字母树)
平方运算
这个应该是最难的一题了吧(对我而言??)。由于\(p\)是给出的,打个表就能发现一些奇怪的性质。这里我用一副图(\(p=233\))展示:图片像素太大,不妨下载下来放大看。
可以发现,整个图是若干连通块,对于一个连通块来说,是一个环加上周围的若干棵树。由于我没写过,听被人说所有环的长度的最小公倍数在\(60\)左右,每个点到环的距离在\(20\)左右。
假设一开始所有的数都在环上,我们可以维护一个线段树,每个结点记下该区间被修改\(k\)次后,该区间所有数的和,其中\(k\)取决于所有环的长度的最小公倍数。这样,时间复杂度为:\(O(60n\log n)\),这里\(k\)当\(60\)算。
现在由于有些数不在环上,我们暴力改并维护线段树就好,因为对于一个数而言,暴力改的次数在\(20\)左右。
解密运算
这题的代码短得吓人!THUSC居然有这样的题。假设所有的数不同,那么就是水题一道,因为我们能轻易地算出第一列,同时由知道最后一列,那么我们就知道了每个数字后一个是什么数字。接着,从\(0\)开始就能推导出答案。
但是,如果有相同的,举个例子:
0 * * 1 1 * * 0 1 * * 2 2 * * 1
*表示尚未知的数字。
我们并不知道跟在第二行的\(0\)后面的\(1\)究竟是第一行最后一个\(1\),还是第四行最后一个。
我们可以这么想:
对于下面的情况,最后一列究竟是怎样的。
1(1) ...... 1(2) ... 1(2) ... 1(1) ......
括号里边的是唯一的标识。
我们可以把第一列移到最后一列,得到的新的行,并且这样的行一定存在。这样我们就发现了:对于同一个数字,相对的位置还是不变的。对于最初的例子来说,第二行的\(0\)后面的\(1\)就是第一行最后一个\(1\)。
...... 1(2) ... 1(1) ... 1(1) ...... 1(2)
这样,相同的数字其实“不相同”,我们可以加上唯一的标识,那就跟所有数字不相同的做法一样了。
到此,我们就搞定的THUSC的题目了。你觉得它有NOI的难度吗?
相关文章推荐
- 编写一个学生和教师数据输入和显示程序,学生数据有编号,姓名,班号,和成绩,教师数据有编号,姓名,职称和部门。要求将编号,姓名输入显示设计成一个类person,并作为学生数据类t和教师数据操作类的基类
- 华为荣耀3c root 与 还原
- FTP服务器的搭建
- VC工程的cuda配置
- 完整的Android源码截屏事件的捕获--5.0
- boost::flat_map性能测试
- php mod_rewrite.so
- IBM MobileFirst Platform的前世今生(一):前世Worklight
- Cordys API文档浏览记 001
- angular学习
- 【LeetCode】209. Minimum Size Subarray Sum
- 大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark
- 如何获取最新的代码?
- Hibernate中Criteria的完整用法
- 用C++实现查找指定文件夹下的类型文件名
- ervice httpd does not support chkconfig的问题
- android 中 EditText加入图标 更改边框颜色 设置透明
- 黑马程序员——Java中的设计模式
- iOS 隐藏App图标
- Java的Reflection机制