昨天也是够丢脸的,才做出来一道题还是看了别人的代码之后才反应过来。这两天XZP也一直在反省,不过人家的水平可比我高多了,张口闭口就是一堆我没听说过的东西,看来我还得多多修行。
先说一下昨天坑爹的那题。
原题链接: EOJ 3333
请你找出一个尽可能大又不大于 k 的数 x,使得这 n 个数以及 x 共 n+1 个数的最大公因数大于 1,找不到输出0。
输入为: n k
n个数
Examples
Input
|
|
Output
|
|
Input
|
|
Output
|
|
代码如下:
|
|
其实思路都是对的,但有点细节没处理好,所以一直超时。
i*i<=mymax
找素因数到根号就行了。此外,这道题还得把自己放进去。
int temp=k/each*each;
这里巧妙地利用了整除,比你从小到大一个个找快多了。
原题链接:EOJ3327
Input
给n个线段,m个区间,求每个区间覆盖的线段树之和。(这里的覆盖是指只要有接触就行)
Examples
Input
|
|
Output
|
|
Note
第 1 个区间与第 1,2,3 条线段有交集。
第 2 个区间与第 1,2 条线段有交集。
第 3 个区间与第 3,4 条线段有交集。
第 4 个区间与第 3,4 条线段有交集。
代码如下:
|
|
这里用到了二分STL,所以代码很简单。此外还运用了逆向思维,long long int ans = n*1ll*m;
,然后再减去不符合的数量(1.线段终点在区间起点前 2.线段起点在区间终点后)。
最后对 lower_bound 和 upper_bound做一个知识点的补充:
升序排列:
iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>**= key**的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值> **key**的第一个元素。
降序排列:
iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值<**= key**的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值< **key**的第一个元素。
原题链接:EOJ3332
Input
输入 T
n 和 mod
求n个1组成的数除以mod的余数
Examples
Input
|
|
Output
|
|
代码如下:
|
|
这题用到了分治的思想,还有同余性质。举个例子:1111111%999 = ((1111*1000)%999+1111%999)%999。
原题链接:EOJ3331
1到n 按顺序排好,每个数都有两次机会和左边相邻的数互换位置。问能否达到给定的目标状态,如果能,输出至少交换几次,否则输出 Too chaotic
。
Examples
Input
|
|
Output
|
|
Input
|
|
Output
|
|
代码如下:
|
|
先判断有没有某个数所在的位置向左偏离超过2的,有一个都不行。
对于任意数a[i]。 a[i]-1 是原本的下标,由于每个数最多只能向左移动两格,所以比它大的数最远只会出现在它原本的位置的左边一格(a[i]-1-1)。因此只用判断a[i]-1-1到它现在的位置这段距离里有多少数比它大,有一个就次数加一。