BestCoder Round #85(ZOJ1569尚未验证)

A题

子序列和啊,就要想到前缀和的差。这个转换一定要!记着!那么i到j的一段子序列和Sij%m ==  0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一样的,那么是不是就存在着一段子序列满足条件了,然后注意一下边边角角应该就没问题了。
因为ZOJ坏掉了,所以我尚未验证以下答案的ans是否就是满足条件的序列总数!移步ZOJ1569自行验证。

 1 #include <cstdio>
 2 #include <set>
 3 #include <map>
 4 #include <queue>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <cstring>
 8 using namespace std;
 9 typedef long long LL;
10 const int INF = 0x3f3f3f3f;
11
12 int num[5000 + 50];
13 int main()
14 {
15     int t;
16     scanf("%d",&t);
17     while(t--)
18     {
19         int n,m,x,ans = 0,sum = 0;
20         memset(num,0,sizeof(num));
21         scanf("%d%d",&n,&m);
22         for(int i = 0 ; i < n; i++)
23         {
24             scanf("%d",&x);
25             sum = (sum + x) % m;
26             if(sum == 0) ans++;
27             num[ sum ]++;
28         }
29
30         for(int i = 0; i< m; i++)
31         {
32             ans += (num[i] - 1) * num[i] / 2;
33         }
34         if(ans != 0)
35             printf("YES\n");
36         else
37             printf("NO\n");
38     }
39
40     return 0;
41 }

B题(思路)

这个应该算是个贪心。真尼玛= =,脑洞题。

我也不知道怎么讲比较好,自己拿个笔和纸琢磨一下,应该就搞懂了,网上那些题解说的感觉也不好。还是要拿笔,照这个程序,手动模拟一下,应该就能搞懂了。

 1 #include <cstdio>
 2 #include <set>
 3 #include <map>
 4 #include <queue>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <cstring>
 8 using namespace std;
 9 typedef long long LL;
10 typedef long long LL;
11 const int INF = 0x3f3f3f3f;
12 const int maxn = 100050;
13 int a[maxn];
14 int main()
15 {
16     int t,n,m;
17     scanf("%d", &t);
18     while(t--)
19     {
20         scanf("%d%d", &n, &m);
21         for(int i = 0; i < n - 1; i++)
22             scanf("%d", &a[i]);
23         sort(a, a + n - 1);
24         LL ans = n;
25         for(int i = 0; i< n - m; i++)
26             ans += a[i];
27         printf("%I64d\n", ans);
28     }
29     return 0;
30 }

C题

这题竟然是交一暴力就能A了。。我也是醉了啊。

学个小姿势:素数定理:

也就是说1到n以内的素数个数大概是O(sqrt(x) * ln x)个

那么就可以看出这道题,枚举暴力的时间复杂度,其实就是对n=sqrt(x),的前后的一些素数进行枚举嘛,所以最多和1到sqrt(x)范围内的素数个数差不多?所以暴力的时间复杂度O(n4logn2\sqrt[4]{n}log\sqrt[2]{n},所以能直接枚举。

素数,总是要注意一些比2小的数的情况。这道题里面还有什么,是不是正数啊,有没有加LL啊,巴拉巴拉啦。打高亮了。

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const LL INF = 0x3f3f3f3f3f3f3f3fll;
 8 LL x,z,ans;
 9 bool judge(LL t)
10 {
11     if(t < 2) return false;
12     LL temp = t;
13     for(LL i = 2; i * i <= temp; i++)
14     {
15         if(temp % i == 0)
16         {
17             if(temp % (i * i) == 0)
18                 return false;
19             temp /= i;
20         }
21     }
22     ans = min(ans,abs(t * t - x));
23     return true;
24 }
25 void solve()
26 {
27     int flag = 0;
28     LL z = sqrt(x);
29     if(z * z < x) z++;
30     for(LL i = max(z,2LL);;i++)
31     {
32         if(judge(i))
33             break;
34     }
35     for(LL i=z-1;i>1;i--)
36     {
37         if(judge(i))
38             break;
39     }
40
41 }
42 int main()
43 {
44     int T;
45     scanf("%d",&T);
46     while(T--)
47     {
48         scanf("%I64d", &x);
49         ans = INF;
50         solve();
51         printf("%I64d\n",ans);
52     }
53     return 0;
54 }

?4??√?n???log?2??√?n???)

时间: 2024-10-13 00:09:59

BestCoder Round #85(ZOJ1569尚未验证)的相关文章

HDU 5778 abs(暴力枚举)——BestCoder Round #85 1003

传送门 abs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1474    Accepted Submission(s): 511 Problem Description Given a number x, ask positive integer y≥2, that satisfy the following condition

BestCoder Round #85 sum

大晚上的更一道下午的水题吧.(虽然WA了好多次= =,但真实情况是我比较水) 描述 Given a sequence, you're asked whether there exists a consecutive subsequence whose sum is divisible by m. output YES, otherwise output NO. 输入 The first line of the input has an integer T (1≤T≤10), which repr

Bestcoder Round #85

A:问一个长度为n小于等于100000的序列是否存在能整除m的连续子段. 前缀和之后,$ S[l,r] = S(r) - S(l-1) $ 取余m后只要查询在S里是否存在出现两次的数值即可. 注意事项:由于是多组数据的题目,一定要把上一组的数字读完,而不是得出了答案直接break!!!!!! 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 #define N 100010 6 7 us

HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题

分析:就是判断简单的前缀有没有相同,注意下自身是m的倍数,以及vis[0]=true; #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <map> #include <queue> #include <vect

HDU5777 domino (BestCoder Round #85 B) 思路题+排序

分析:最终的结果肯定会分成若干个区间独立,这些若干个区间肯定是独立的(而且肯定是一边倒,左右都一样) 这样想的话,就是如何把这n-1个值分成 k份,使得和最小,那么就是简单的排序,去掉前k大的(注意longlong) #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm&

HDU 5578 abs (BestCoder Round #85 C)素数筛+暴力

分析:y是一个无平方因子数的平方,所以可以从sqrt(x)向上向下枚举找到第一个无平方因子比较大小 大家可能觉得这样找过去暴力,但实际上无平方因子的分布式非常密集的,相关题目,可以参考 CDOJ:无平方因子数 http://acm.uestc.edu.cn/#/problem/show/618 这个题和CDOJ的题虽然不一样,但是可以从CDOJ发现这种数是很多的 官方题解:官方题解说这个无平方因子的枚举量在logn级别,可见非常小 #include <cstdio> #include <

HDU5579 Tower Defence (BestCoder Round #85 D) 计数dp

分析(官方题解): 一点感想:(这个题是看题解并不是特别会转移,当然写完之后看起来题解说得很清晰,主要是人太弱 这个题是参考faebdc神的代码写的,说句题外话,很荣幸高中和faebdc巨一个省,虽然本弱渣高中都没搞过oi) 最短路不等于k,所以根本不存在最短路>=k的,因为存在的话,由最短路知识可知,k+1一定是由k更新过来的,矛盾 所以最短路不等于k,即最短路小于k 然后就是不管是多校还是bc,都能碰到有关图的计数类的dp问题,比如2016多校1的刚性图,计算连通二分图的数量 这个题是计算无

HDU5780 gcd (BestCoder Round #85 E) 欧拉函数预处理——分块优化

分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后发现,这题连O(n)欧拉函数前缀和的都卡了,幸亏没交,还是太年轻 对于官方题解说sqrt(n)优化(其实就是n/(小于n一段数)结果是一样的,也不算什么分块),还是很简单的,做反演题的时候看到过很多,只是忘记了 如果不会请看这篇解题报告http://wenku.baidu.com/view/fbe2

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <