Codeforces Global Round 1 做题记录

A.

题解:快速幂

代码:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define maxn 100005
 4 using namespace std;
 5 const ll mod=2;
 6 ll b,k;
 7 ll a[maxn];
 8 ll fastpow(ll a,ll p)
 9 {
10     ll ans=1;
11     while(p)
12     {
13         if(p&1)ans=ans*a%mod;
14         a=a*a%mod;p>>=1;
15     }
16     return ans;
17 }
18 int main()
19 {
20     scanf("%I64d%I64d",&b,&k);
21     for(int i=1;i<=k;++i)scanf("%I64d",&a[i]);
22     ll n=0;
23     for(int i=1;i<=k;++i)n=(n+a[i]*fastpow(b,k-i)%mod)%mod;
24     if(n)puts("odd");
25     else puts("even");
26 }

B.

题解:考虑两两相邻点之间的距离,贪心取最小的k-1个

 1 #include<bits/stdc++.h>
 2 #define maxn 100005
 3 using namespace std;
 4 int n,m,k;
 5 int a[maxn];
 6 priority_queue<int,vector<int>,greater<int> >q;
 7 int main()
 8 {
 9     scanf("%d%d%d",&n,&m,&k);
10     int ans=n;
11     for(int i=1;i<=n;++i)scanf("%d",&a[i]);
12     k=n-k;
13     for(int i=1;i<n;++i)q.push(a[i+1]-a[i]-1);
14     while(k--)
15     {
16         int t=q.top();
17         q.pop();
18         ans+=t;
19     }
20     printf("%d\n",ans);
21     return 0;
22 }

C.

题解:找规律,除了2^k-1以外其他情况ans=2^p-1(其中p为满足ans>a的最小的数),2^k-1的情况打表就行

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int q;
 4 int vis[]={0,0,1,1,5,1,21,1,85,73,341,89,1365,1,5461,4681,21845,1,87381,1,349525,299593,1398101,178481,5592405,1082401};
 5 int main()
 6 {
 7     scanf("%d",&q);
 8     while(q--)
 9     {
10         int a;
11         scanf("%d",&a);
12         int p=1;
13         while(((1<<p)-1)<a)p++;
14         if(a==((1<<p)-1))
15         {
16             if(!vis[p])
17             {
18                 int ans=0;
19                 for(int b=1;b<a;++b)ans=max(ans,__gcd(a^b,a&b));
20                 vis[p]=ans;
21                 printf("%d\n",ans);
22             }
23             else printf("%d\n",vis[p]);
24         }
25         else printf("%d\n",(1<<p)-1);
26     }
27     return 0;
28 }

D.

题解:考虑3个三元组[ i-1 ,i ,i+1 ]可以被拆成[ i-1, i-1, i-1 ] , [ i , i , i ] , [ i+1, i+1, i+1 ],所以每个状态中这样的三元组不会超过2个

然后dp(i,j,k)表示有j个[ i-1 ,i ,i+1 ] , k个[ i , i+1 , i+2 ],转移每次枚举一个 l ,表示dp(i+1,k,l),其中多l个[ i+1 , i+2, i+3 ]

那相同的三元组怎么处理?( num(i) - j -k -l )/3 个,直接加上就好了

 1 #include<bits/stdc++.h>
 2 #define inf 1000000000
 3 #define maxn 1000005
 4 using namespace std;
 5 int n,m;
 6 int has[maxn];
 7 int dp[maxn][3][3];
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     for(int x,i=1;i<=n;++i)
12     {
13         scanf("%d",&x);
14         has[x]++;
15     }
16     for(int i=0;i<=m;++i)
17     {
18         for(int j=0;j<=2;++j)
19         {
20             for(int k=0;k<=2;++k)dp[i][j][k]=-inf;
21         }
22     }
23     dp[0][0][0]=0;
24     for(int i=0;i<m;++i)
25     {
26         for(int j=0;j<=min(has[i],2);++j)
27         {
28             for(int k=0;k<=min(has[i+1],2);++k)
29             {
30                 for(int l=0;l<=min(has[i+2],2);++l)if(has[i+1]>=j+k+l)
31                 {
32                     dp[i+1][k][l]=max(dp[i+1][k][l],dp[i][j][k]+l+(has[i+1]-j-k-l)/3);
33                 }
34             }
35         }
36     }
37     printf("%d\n",dp[m][0][0]);
38     return 0;
39 }

E.

题解:原题,以前有一道前缀和类似的结论

考虑每次操作,本质上是在差分数组中交换两个数的位置

我们只需要判断差分数组是否同构以及原数组首尾是否相同就行了

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define maxn 100005
 4 using namespace std;
 5 int n;
 6 ll c[maxn],t[maxn],x[maxn],y[maxn];
 7 int main()
 8 {
 9     scanf("%d",&n);
10     for(int i=1;i<=n;++i)scanf("%I64d",&c[i]);
11     for(int i=1;i<=n;++i)scanf("%I64d",&t[i]);
12     if(c[1]!=t[1]||c[n]!=t[n])
13     {
14         puts("No");
15         return 0;
16     }
17     else
18     {
19         for(int i=2;i<=n;++i)x[i]=c[i]-c[i-1];
20         for(int i=2;i<=n;++i)y[i]=t[i]-t[i-1];
21         sort(x+1,x+n+1);
22         sort(y+1,y+n+1);
23         bool yes=1;
24         for(int i=1;i<=n;++i)if(x[i]!=y[i])yes=0;
25         if(yes)puts("Yes");
26         else puts("No");
27     }
28     return 0;
29 }

F,G,H留坑

原文地址:https://www.cnblogs.com/uuzlove/p/10358689.html

时间: 2024-10-09 18:17:00

Codeforces Global Round 1 做题记录的相关文章

Educational Codeforces Round 79做题记录

这套题感觉出的不咋滴,第四题和第五题难度差了1000分!!! 前四题都还简单,第五题就31人做出……我算了…… 懒得写题解了,做个记录吧(这就是偷懒的理由???) 比赛传送门 A.New Year Garland 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #define re

Educational Codeforces Round 62 做题记录

A. 题解: 发现就是找前缀 max = i 的点的个数,暴力扫一遍 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pii pair<int,int> 4 #define mp(a,b) make_pair(a,b) 5 using namespace std; 6 #define maxn 10005 7 int n; 8 int a[maxn]; 9 int main() 10 { 11 scanf(&qu

Codeforces Global Round 1 (A-E题解)

Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^(k-1)+a2*b^(k-2)+...+ak*b^0的奇偶性. 题解: 暴力求模2意义下的值就好了. 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5; int

Codeforces Beta Round 2 A题:Winner

题目传送门 这道题我开始准备使用map+stable_sort来做,但是无论是map或是unorder_map,都会改变输入的顺序,导致某一组答案错误. 所以我们可以使用map来进行纯模拟的操作. 首先,在输入的同时把最终各个人的分数加起来,然后找到最大值. 其次,再次模拟一遍游戏,当找到第一个达到m且最终的分数也大于等于m的人,输出即可. 12345678910111213141516171819202122232425262728293031323334 #define rep(i,a,n)

【手抖康复训练1 】Codeforces Global Round 6

[手抖康复训练1 ]Codeforces Global Round 6 总结:不想复习随意打的一场,比赛开始就是熟悉的N分钟进不去时间,2333,太久没写题的后果就是:A 题手抖过不了样例 B题秒出思路手抖过不了样例,C题秒出思路手抖过不了样例*3 D题 手抖 过的了样例 ,调了1h,赛后发现变量名写错了,改一个字符就能AC... 题目等补完题一起放上来QAQ 原文地址:https://www.cnblogs.com/ttttttttrx/p/12110199.html

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

project euler做题记录

ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{array}{c} S(n) & = & \sum_{i = 1} ^ n \sum_{p = 1} ^ i \sum_{q = p + 1} ^ i \frac {1}{pq}[p + q \geq i][gcd(p, q) = 1] \& = & \sum_{i = 1} ^

退役前的做题记录5.0

退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径.对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可. [Wannafly挑战赛4F]线路规划 类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置