review 10.9

Problem 1. How many primes?

求 {1, 2, . . . , N } 中素数的个数。

Input
1 个整数 N 。
Output
1 个整数,表示素数的个数。

Note
• 对于 40% 的数据,1 ≤ N ≤ 10^6
• 对于 80% 的数据,1 ≤ N ≤ 10^7
• 对于 100% 的数据,1 ≤ N ≤ 10^8

题解:这是要我打个线性筛么?

注意,数据丧狂,only线性筛

代码如下code

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define maxn 100000009
 5 int n,cnt;
 6 bool p[maxn];
 7 int prime[maxn];
 8 void get()
 9 {
10     p[1]=0;
11     for(int i=2;i<=n;i++)
12     {
13         if(!p[i])prime[++prime[0]]=i;
14         for(int j=1;j<=prime[0];j++)
15         {
16             if(prime[j]*i>n)break;
17             p[i*prime[j]]=true;
18             if(i%j==0)break;
19         }
20     }
21 }
22 int main()
23 {
24     cin>>n;
25     get();
26     for(int i=1;i<=n;i++)
27     {
28         if(p[i])cnt++;
29     }
30     cout<<cnt<<endl;
31     return 0;
32 }
33 //我没测试,不过应该对
View Code

Problem 2. How many rooks?

N × N 的国际象棋棋盘上有 K 个车,第 i 个车位于第 Ri 行,第 Ci 列。求至少被一个车攻击的格子数量。

Input
第 1 行,2 个整数 N, K。
接下来 K 行,每行 2 个整数 Ri , Ci 。
Output
1 个整数,表示被攻击的格子数量。

Note
• 对于 30% 的数据,1 ≤ N ≤ 10^3, 1 ≤ K ≤ 10^3;
• 对于 60% 的数据,1 ≤ N ≤ 10^6, 1 ≤ K ≤ 10^6;
• 对于 100% 的数据,1 ≤ N ≤ 10^9, 1 ≤ K ≤ 10^6, 1 ≤ Ri , Ci ≤ N 。

正解:hash一下

详细的说:

我们求一个车能攻击到的范围,可以转化一下,转化成求解剩余的格子的数目,然后我们用总数减去剩余格子数就好了。

事实上画个图的话如下

如图,我们放入一个车之后,我们可以得到一张新的图:相当于长和宽都减少1的图.但是要注意判重,重复的时候是不会再减少的(能明白么?)

然后我用了很奇葩的方法,这里就不贴自己的代码了。处理好行和列的判重与计数就好了。

 

posted @ 2014-11-04 20:28  Skyvot  阅读(176)  评论(0编辑  收藏  举报