牛客NOIP暑期七天营-提高组5+普及组5
————提高组————
第一题:deco的abs
题目链接:https://ac.nowcoder.com/acm/contest/934/A
因为每个数都可以加任意次 d ,所以可以推出 0 <= 相邻两个数的差值的绝对值 < d ,于是我们先让所有数对d取模
再枚举每个位置 ,用 last 记录上一个数的值 ,然后求 abs(a[now] - last) 、abs( a[now] + d - last)、abs( a[now] - d, last )即可
下面贴代码:
#include <bits/stdc++.h>
#define ll long long
const int N = 1e3+;
using namespace std;
int n, d, now, last;
ll ans;
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>d>>last)
{
ans = ;
for (int i = ; i <= n; i++)
{
cin>>now;
int k = (now - last) % d;
ans += min(abs(k), min(abs(k - d), abs(k + d)));
last = now;
}
cout << ans << endl;
}
return ;
}
第二题:
题目链接:https://ac.nowcoder.com/acm/contest/934/B
这道题的解法是莫比乌斯反演,因为这个算法我也才刚开始学,所以打的过程中出了很多问题
然后就是题目本身的数据好像也有点问题,很多正解的代码提交也是tle,不过听说赛后重测了
(我的分数本来是170,排在59,但后来分数没变排名却成了55(滑稽...滑稽))
下面是作者给的题解

贴下我的代码tle
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int mod=;
int vis[N],p[N],phi[N],num[N],cnt,ans=,K;
int fac[N],rev[N],Mn[N],P[N];
vector<int>G[N];
int pow_mod(int a,int x)
{
int res=;
while(x)
{
if(x&) res=1LL*res*a%mod;
x>>=;
a=1LL*a*a%mod;
}
return res;
}
void init()
{
for(int i=; i<N; i++)
{
if(!vis[i]) p[++cnt]=i,Mn[i]=mod,P[i]=i;
for(int j=; j<=cnt&&i*p[j]<N; j++)
{
vis[i*p[j]]=;
P[i*p[j]]=p[j];
if(!(i%p[j])) break;
}
}
}
int main()
{
ios::sync_with_stdio(false);
int n,Q,x;
init();
cin>>n;
for(int i=; i<=n; i++)
{
cin>>x;
while(x>)
{
int t=P[x],res=;
while(x%t==) x/=t,res++;
G[t].push_back(res);
}
}
for(int i = ; i<=cnt; i++)
{
if(G[p[i]].size()==) continue;
sort(G[p[i]].begin(),G[p[i]].end());
int res=,sum=;
res=G[p[i]][];
for(int j=; j<G[p[i]].size(); j++) sum+=res,res+=G[p[i]][j];
ans=1LL*ans*pow_mod(p[i],sum)%mod;
}
cout<<ans<<endl;
return ;
}
贴下大佬accept的代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define M 1000005
#define inf 0x3f3f3f3f
const int Mod=;
int n;
int Max,A[M];
int Ans=;
int Cnt[M];
LL f[M];
int R_P(int x,LL y) {
int res=;
while(y) {
if(y&)res=1LL*res*x%Mod;
x=1LL*x*x%Mod,y>>=;
}
return res;
}
int main() {
scanf("%d",&n);
for(int i=; i<=n; ++i)
scanf("%d",A+i),Max=max(A[i],Max),++Cnt[A[i]];
for(int i=Max; i>; --i) {
int res=;
for(int j=i; j<=Max; j+=i)res+=Cnt[j];
if(res>) {
f[i]=1LL*res*(res-)>>;
for(int j=i+i; j<=Max; j+=i)f[i]-=f[j];
Ans=1LL*Ans*R_P(i,f[i])%Mod;
}
}
printf("%d",Ans);
}
ps:第三题题目有点恶心就直接暴力拿了20分走人
————普及组————
第一题:手术等级???
题目链接:https://ac.nowcoder.com/acm/contest/929/A
个人感觉挺经典的一道题。。。
a[ N ] 存题目给定的数组,sum[ N ] 存 a[ i ] * i的前缀和,sum_[ N ] 存 a[ i ]的前缀和那么假设我们
要切的位置为k和k+1之间,那么切开后的区间为 1......k 和 k......n,那么此时的完美度可以这么表示:
wmd = a[1]*1+a[2]*2+...+a[k]*k + a[i]*(i - k) + a[i+1]*(i+1-k)+...+a[n]*[n-k] ,对于后半部分我们可
以发现 a[ i ]*(i - k) 可以分解为 a[ i ]*i - a[ i ]*k ,所以最后的 wmd 可以表示为下面的式子:
wmd = a[ 1 ] * 1 + a[ 2 ] * 2 + ... + a[ k ] * k + ... + a[ n ] * n - k*( a[ k+1] + ... + a[ n ]) = sum[ n ] - k * (sum_[ n ] - sum[ n-k ]);
贴下代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f
template<class T> void read(T &x)
{
x=;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();
}
const int N = 1e5+;
ll a[N],sum[N],sum_[N];
int main()
{
ios::sync_with_stdio(false);
int n;
while(cin>>n)
{
cin>>a[];
sum[] = a[];
for(int i=;i<=n;i++)
{
cin>>a[i];
sum[i] = sum[i-] + a[i] * i;
}
partial_sum(a+,a++n,sum_+);
ll ans = inf;
// a[1]*1 + a[2]*2 + a[3]*3 + a[4]*4 + a[5]*5;
// -3*(a[4] + a[5]);
for(int k=;k<=n;k++)
{
ans = min(ans,sum[n] - k*(sum_[n] - sum_[k]));
}
cout<<ans<<endl;
//cout<<inf<<endl;
}
return ;
}
因为打完提高组已经没多少时间了,所以我普及组就做了一题,剩下的题目留给以后慢慢
牛客NOIP暑期七天营-提高组5+普及组5的更多相关文章
- 牛客NOIP暑期七天营-提高组1
牛客NOIP暑期七天营-提高组1 链接 A 边权可为0就排序建一条链子. 但是边权不为0 除了第一个有0的不行. x连向上一个比他小的数. 期间判断有无解. #include <bits/std ...
- 牛客NOIP暑期七天营-提高组6
目录 A-积木大赛 题目描述 link 题解 代码 B-破碎的序列 题目描述 link 题解 C-分班问题 题目描述 link 题解 比赛链接 官方题解 A-积木大赛 题目描述 link 题解 标签: ...
- 牛客NOIP暑期七天营-提高组3
第一题:破碎的矩阵 题目链接:https://ac.nowcoder.com/acm/contest/932/A 刚看到这题的时候感觉特别熟悉...诶,这不就是codeforces某场比赛的某某 ...
- 牛客NOIP暑期七天营-提高组2
第一题:ACGT 题目链接:https://ac.nowcoder.com/acm/contest/931/A trie树.hash.map遍历 ①.trie树上的节点多记一个rest值表示还有多少 ...
- 牛客NOIP暑期七天营-提高组6C:分班问题 (组合数)
题意:A班有N个人,B班有M个人,现在要组成一个新的班级C班,为了公平,从AB班各抽相同人数的人. 现在求所有方案中,人数之和是多少. 思路:即求Σ k*C(N,k)*C(M,k); 先忽略这个 ...
- 牛客NOIP暑期七天营-提高组5
A:deco的abs. 水题,先%,然后相邻两个数min()一下差值. #include<bits/stdc++.h> #define ll long long using namespa ...
- 牛客NOIP暑期七天营-提高组2C:滑块(平衡树) (这里rope骗分)
A:hash 或者 map 或者trie. #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) usin ...
- 牛客NOIP暑期七天营-提高组1 解题报告
https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...
- 牛客NOIP暑期七天营-TG3 赛后题解
目录 牛客NOIP暑期七天营-提高组3 A-破碎的矩阵 题目描述 link 题解 代码 B-点与面 题目描述 link 题解 代码 C-信息传递 题目描述 link 题解 牛客NOIP暑期七天营-提高 ...
随机推荐
- ubuntu server 1604 设置笔记本盒盖 不操作
sudo vim /etc/systemd/logind.conf //打开配置文件 找到 #HandleLidSwitch=suspend 改为 HandleLidSwitch=ignore ...
- 基于crypto++国产加密软件SM4的实现,顺带加了ase,base64
唔,美国压制得越狠,各种替代产品就越能活. 本文分享SM4的一种快速实现与集成方式. SM4(原名SMS4)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于201 ...
- HDFS之DataNode
DataNode工作机制 1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳. 2)DataNode启动后 ...
- es6 map的用法
let arr =[ {title:'aaaa',read:100,hot:true}, {title:'bbbb',read:50,hot:false}, {title:'ccc',read:100 ...
- 《浅入浅出》-RocketMQ
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点脑图.个人联系方式和技术交流群,欢迎Star和指 ...
- tf serving的使用
tensorflow_model_server --port=6000 --model_name=text_lstm --model_base_path=/home/guoyingmei/test/t ...
- LESSON 2-Discrete Source Encoding
Keywords: Source types, Discrete source coding, Kraft inequality 1. Source classes About Figure ...
- IDEA启动tomcat报java.net.SocketExceptionsocket closed
IDEA启动tomcat报java.net.SocketException:socket closed.如图所示 解决方法:打开任务管理器,检查有没有java.exe进程. 关闭了重新启动就好了 ...
- jQuery中带有异步Ajax代码的执行顺序
1.问题 在使用jQuery的时候想通过Ajax请求来放所需要的html代码中放值,但是请求回来却是空的,源代码如下: $("a").click(function() { // ...
- js递归优化
递归优化 递归在我们平时撸码中会经常用到,不过可能很多人不知道递归的弊端,就是会导致调用栈越来越深.如果没有节制的使用递归可能会导致调用栈溢出. 那什么是递归呢? 递归调用是一种特殊的嵌套调用,是某个 ...