链接:http://codeforces.com/contest/1043


A - Elections - [水水水水题]

题意:

我和另一个人竞争选举,共有 $n$ 个人投票,每个人手上有 $k$ 票,必须投给我或者另一个人。

现在已知每个人给另一个人投 $a_i$ 票,也就是说会给我投 $k-a_i$ 票。求最小的整数 $k$,使得我的票数严格大于另一个人。

题解:

暴力枚举 $k$。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,a[maxn];
int main()
{
cin>>n;
int mx=,sum=;
for(int i=;i<=n;i++)
scanf("%d",&a[i]), mx=max(a[i],mx), sum+=a[i];
for(int k=mx;;k++)
{
if(sum<n*k-sum)
{
printf("%d\n",k);
break;
}
}
}

B - Lost Array - [简单数学题]

题意:

我手上有一个序列 $x_0,x_1, \cdots, x_{k-1}$。

现在又有一个长度为 $n+1$ 的序列 $a_0,a_1,a_2, \cdots, a_n$,已知这个序列是通过 $a_i = x_{(i-1) \bmod k} + a_{i-1}$ 计算得到,其中 $i \ge 0$ 且 $a_0 = 0$。

现在序列 $x_0,x_1, \cdots, x_{k-1}$ 丢失了,但给你 $a_0,a_1,a_2, \cdots, a_n$,求可能的 $k(1 \le k \le n)$。

题解:

显然从 $a_1$ 到 $a_k$ 是可以用来直接确定 $x_0,x_1, \cdots, x_{k-1}$,而后面的 $a_{k+1} \sim a_n$ 可以用来判定是否矛盾,不矛盾就是可行的 $k$。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+;
int n,a[maxn];
int x[maxn];
inline bool ok(int k)
{
for(int i=;i<=k;i++) x[i-]=a[i]-a[i-];
for(int i=k+;i<=n;i++) {
if(a[i]!=x[(i-)%k]+a[i-]) return ;
}
return ;
}
int main()
{
cin>>n;
a[]=;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
vector<int> ans;
for(int k=;k<=n;k++) {
if(ok(k)) ans.push_back(k);
}
printf("%d\n",ans.size());
for(int i=;i<ans.size();i++) printf("%s%d",i>?" ":"",ans[i]);
}

C - Smallest Word - [简单模拟]

题意:

给出只包含字符 $a,b$ 的字符串 $s$,现在你从长度为 $1$ 到 $|s|$ 依次遍历所有的前缀子串,你可以选择反转这个前缀子串,或者不动。

现在要你输出 $|s|$ 个选择,使得最后的 $s$ 字典序最小。

题解:

从左到右遍历字符串,对于第 $i$ 个字符,始终保持 $1 \sim i-1$ 个字符保持 "$a,a,\cdots,a,b,b,\cdots,b$" 或者 "$b,b,\cdots,b,a,a,\cdots,a$" 这样的样式。

可以使得最后字符串为 "$a,a,\cdots,a,b,b,\cdots,b$"。

AC代码:

#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin>>s;
char pre=s[];
for(int i=;i<s.size();i++)
{
if(s[i]=='a')
{
if(pre=='b') printf("1 "), pre='a';
else printf("0 ");
}
if(s[i]=='b')
{
if(pre=='a') printf("1 "), pre='b';
else printf("0 ");
}
}
if(pre=='a') printf("1\n");
else printf("0\n");
}

D - Mysterious Crime - [双指针维护]

题意:

给出 $m$ 个 $1 \sim n$ 的排列,求所有公共子串的数目。

题解:

换句话说,就是在第 $1$ 个排列里找,在其他 $2 \sim m$ 个排列里出现的所有公共子串。

不难想到,可以将第 $1$ 个排列分成若干段,每段都是不能在往右延伸的最长公共子串,例如:$(1,2,3,6,4,5)$ 和 $(4,5,6,1,2,3)$,则可以把第 $1$ 个排列分成 $(1,2,3),(6),(4,5)$。

因此用两根指针分别维护这些段的左右端点,每次找到一个长为 $len$ 的段,就产生贡献 $\frac{(len)(len+1)}{2}$。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
const int maxm=;
int n,m;
int nxt[maxm][maxn];
int main()
{
cin>>n>>m;
memset(nxt,,sizeof(nxt));
for(int j=;j<=m;j++)
{
for(int i=,now,pre=;i<=n;i++)
{
scanf("%d",&now);
nxt[j][pre]=now;
pre=now;
}
} ll ans=;
int len=;
for(int i=nxt[][],j;i;i=nxt[][i])
{
for(j=;j<=m;j++) {
if(nxt[j][i]!=nxt[][i]) break;
}
if(j>m && nxt[][i]) len++;
else ans+=(ll)len*(len+)/, len=;
}
cout<<ans<<endl;
}

E - Train Hard, Win Easy - (Done)

题意:

现在共有两道题目,有 $n$ 个人,每个人做第一题会得到 $x$ 的罚时,做第二题会得到 $y$ 的罚时。

他们要两两相互组队,组队之后队里的两个人会一人挑一题做(当然是罚时越小越好),他们在这一轮会得到他们队的总罚时分数。

又知道,有 $m$ 个组是不能组的(这两个人不想组一块儿),现在要求每个人最后会得到的分数。

题解:

直接上 $O(n^2)$ 地算是不现实的。考虑做减法,不妨先不管 $m$ 组人不想组队的情况,直接算出每个人和其他所有人组队,最后会得到多少分,再减去 $m$ 组不能组的分数即可。

考虑如何计算第 $i$ 个人,和其他所有人分别组队后得到的分数。先将所有人按 $x_i - y_i$ 排序,这样一来,对于第 $i$ 个人,

其前面的任意一个人 $j$ 都满足 $x_j - y_j \le x_i - y_i \Rightarrow x_j + y_i \le x_i + y_j$;也就是说,第 $i$ 个人和其前面的人组队,他本人必然会做 $y_i$ 这道题。

其后面的任意一个人 $k$ 都满足 $x_i - y_i \le x_k - y_k \Rightarrow x_i + y_k \le x_k + y_i$;也就是说,第 $i$ 个人和其后面的人组队,他本人必然会做 $x_i$ 这道题。

这样一来,我们只要 $O(n)$ 求出 $x_j$ 的前缀和以及 $y_k$ 的后缀和,然后即可 $O(1)$ 得到第 $i$ 个人的总分数。

最后减去那 $m$ 组人不想组队的情况即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=3e5+;
int n,m;
struct P{
int id;
ll x,y;
P(){}
P(int _id,ll _x,ll _y){id=_id, x=_x, y=_y;}
bool operator<(const P& oth) {
return x-y < oth.x-oth.y;
}
}p[maxn];
pii hate[maxn];
ll xpre[maxn],ysuf[maxn];
ll ans[maxn];
int main()
{
cin>>n>>m;
for(int i=,x,y;i<=n;i++) scanf("%d%d",&x,&y), p[i]=P(i,x,y);
for(int i=;i<=m;i++) scanf("%d%d",&hate[i].first,&hate[i].second);
memset(ans,,sizeof(ans));
for(int i=,a,b;i<=m;i++)
{
a=hate[i].first, b=hate[i].second;
ll des=min(p[a].x+p[b].y,p[a].y+p[b].x);
ans[hate[i].first]-=des;
ans[hate[i].second]-=des;
}
sort(p+,p+n+); xpre[]=;
for(int i=;i<=n;i++) xpre[i]=xpre[i-]+p[i].x;
ysuf[n+]=;
for(int i=n;i>=;i--) ysuf[i]=ysuf[i+]+p[i].y; for(int i=;i<=n;i++) {
ans[p[i].id]+=xpre[i-]+(i-)*p[i].y+ysuf[i+]+(n-i)*p[i].x;
}
for(int i=;i<=n;i++) printf("%lld%c",ans[i],i==n?'\n':' ');
}

F - Make It One - [莫比乌斯反演] - (Undone)

题意:

给出 $n(1 \le n \le 3e5)$ 个数字 $a_1 \sim a_n(1 \le a_i \le 3e5)$,要求选取最少的若干个数字,使他们的最大公因数为 $1$。

题解:

Codeforces 1043 - A/B/C/D/E/F - (Undone)的更多相关文章

  1. Codeforces 1132 - A/B/C/D/E/F - (Undone)

    链接:http://codeforces.com/contest/1132 A - Regular Bracket Sequence - [水] 题解:首先 "()" 这个的数量多 ...

  2. Codeforces 1114 - A/B/C/D/E/F - (Undone)

    链接:http://codeforces.com/contest/1114 A - Got Any Grapes? 题意:甲乙丙三个人吃葡萄,总共有三种葡萄:绿葡萄.紫葡萄和黑葡萄,甲乙丙三个人至少要 ...

  3. Codeforces 1100 - A/B/C/D/E/F - (Undone)

    链接:https://codeforces.com/contest/1100 A - Roman and Browser - [暴力枚举] 题意:浏览器有 $n$ 个网页,编号 $1 \sim n$, ...

  4. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  5. Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块

    Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 [Problem Description] ​ ...

  6. Codeforces 1043 F - Make It One

    F - Make It One 思路: dp + 容斥 首先, 答案不会超过7, 因为前7个质数的乘积大于3e5(最坏的情况是7个数, 每个数都缺少一个不同的因子) 所以从1到7依次考虑 dp[i][ ...

  7. Codeforces Bubble Cup 8 - Finals [Online Mirror] F. Bulbo DP

    F. Bulbo Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/F Des ...

  8. Codeforces 1154 - A/B/C/D/E/F/G - (Undone)

    链接:https://codeforces.com/contest/1154 A - Restoring Three Numbers - [水] #include<bits/stdc++.h&g ...

  9. Educational Codeforces Round 58 (Rated for Div. 2) F dp + 优化(新坑) + 离线处理

    https://codeforces.com/contest/1101/problem/F 题意 有n个城市,m辆卡车,每辆卡车有起点\(s_i\),终点\(f_i\),每公里油耗\(c_i\),可加 ...

随机推荐

  1. Springboot 生成验证码

    技术:springboot+kaptcha+session   概述 场景介绍 验证码,用于web网站.用户点击验证码图片后,生成验证码.提交后,用户输入验证码和Session验证码,进行校验. 详细 ...

  2. Nginx——location常见配置指令,alias、root、proxy_pass

    1.[alias] 别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向[alias]配置的路径.如: location /test/ { alias /home/sftp/i ...

  3. iostat中的util和svctm (Two traps in iostat: %util and svctm)

    iostat, from the excellent sysstat suite of utilities, is the go-to tool for evaluating IO performan ...

  4. systemctl -- 系统服务管理器 【转】

    systemctl  -- 系统服务管理器 systemctl 是系统服务管理器命令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 直接运行命令可以列出所有正在运行的服务 ...

  5. 推荐系统模型之 FM

    什么是FM模型 FM英文全称是“Factorization Machine”,简称FM模型,中文名“因子分解机”. FM模型其实有些年头了,是2010年由Rendle提出的,但是真正在各大厂大规模在C ...

  6. 爬虫对自己服务器 CPU,内存和网速的影响

    今天无事写一遍关于爬虫对计算机的影响,主要是给小白同学普及一下爬虫的基础知识. 在我们写爬虫的时候,首先会想到开多线程,如果使用的语言是Python,很不幸,因为Python存在  GIL,在任何时候 ...

  7. 关于asyncio知识(四)

    一.使用 asyncio 总结 最近在公司的一些项目中开始慢慢使用python 的asyncio, 使用的过程中也是各种踩坑,遇到的问题也不少,其中有一次是内存的问题,自己也整理了遇到的问题以及解决方 ...

  8. android sdk content loader 0%不动

    Make sure that eclipse is not active. If it is active kill eclipse from the processes tab of the tas ...

  9. 【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除

    一.实验说明: 本例程建立三个任务,通过任务寄存器来实现任务的建立与删除功能.红灯和绿灯同时以固定 频率闪烁,当任务寄存器为5时,删除绿灯闪烁的任务LED1,此时只有红灯闪烁,当任务寄存器的 值为10 ...

  10. SparkStreaming基本架构及使用

    1.简介 Spark Streaming处理的数据流图: Spark Streaming在内部的处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处 ...