Good Bye 2019(前五题题解)

这套也是后来补得。

我太菜了,第三题就卡着了。想了好久才做出来,要是参加了绝对掉分。

D题是人生中做完的第一道交互题,不容易。

比赛传送门

A.Card Game

题目大意:一共有n张互不相同的牌,玩家1有k1张牌,玩家2有k2张牌。两个人每次都会拿出一张牌,牌号大的人会得到这张牌,直到一方没牌。问第一个人能否会获胜。

这就是我们从小玩的比大小游戏。

在广大劳动人民的实践后得出来结论是有最大的牌的人获胜。

代码如下:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define rep(x, l, r) for(int x = l; x <= r; x++)
#define repd(x, r, l) for(int x = r; x >= l; x--)
#define clr(x, y) memset(x, y, sizeof(x))
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define MAXN
#define fi first
#define se second
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int INF = << ;
const int p = ;
int lowbit(int x){ return x & (-x);}
int fast_power(int a, int b){ int x; for(x = ; b; b >>= ){ if(b & ) x = 1ll * x * a % p; a = 1ll * a * a % p;} return x % p;} int main(){
int t;
scanf("%d", &t);
rep(times, , t){
int n, k1, k2;
scanf("%d%d%d", &n, &k1, &k2);
int maxx1 = , maxx2 = ;
rep(i, , k1){
int x;
scanf("%d", &x);
maxx1 = max(maxx1, x);
}
rep(i, , k2){
int x;
scanf("%d", &x);
maxx2 = max(maxx2, x);
}
if(maxx1 > maxx2) puts("YES");
else puts("NO");
}
return ;
}

-A

B.Interesting Subarray

题目大意:有一个数列a,让你找任意一个子段满足子段的最大值减最小值大于等于子段长度。

感觉这套的B题也比之前的难了点,看着屏幕愣了半天,可能最近脑子不对劲。

如果子段(l,r)满足条件,那么必定存在i,j满足a[i] - i < a[j] - j ,或者a[i] + i > a[j] + j。

那么只需记录下在所有的i,j( i <= j ),最小的a[i] - i和最大的a[i] + i,如果满足上面的条件就输出这一对。

代码如下:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define rep(x, l, r) for(int x = l; x <= r; x++)
#define repd(x, r, l) for(int x = r; x >= l; x--)
#define clr(x, y) memset(x, y, sizeof(x))
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define MAXN 200005
#define fi first
#define se second
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int INF = << ;
const int p = ;
int lowbit(int x){ return x & (-x);}
int fast_power(int a, int b){ int x; for(x = ; b; b >>= ){ if(b & ) x = 1ll * x * a % p; a = 1ll * a * a % p;} return x % p;} int a[MAXN]; int main(){
int t;
scanf("%d", &t);
rep(times, , t){
int n;
scanf("%d", &n);
rep(i, , n) scanf("%d", &a[i]);
int s = INF, id = , ans = ;
rep(i, , n){
if(s < a[i] - i){
printf("YES\n%d %d\n", id, i);
ans = ;
break;
}
if(a[i] - i < s){
s = a[i] - i;
id = i;
}
}
if(!ans){
s = , id = ;
rep(i, , n){
if(s > a[i] + i){
printf("YES\n%d %d\n", id, i);
ans = ;
break;
}
if(a[i] + i > s){
s = a[i] + i;
id = i;
}
}
}
if(!ans) puts("NO");
}
return ;
}

-B

C.Make Good

题目大意:给你一串数字,让你在其中插入最多3个数字,使得这些数字的总和等于异或的2倍,只要给出任何一种方案即可。

首先这串数字是和我们没关系了,我们需要的只是它们的异或以及和。

很显然,必定存在一种方案只放一个数字就能成立(不要问我为什么,程序员不需要证明)。

然后么将异或的乘个二,按照二进制来计算。

对于每一位,要是该位的为1,会对和产生1的贡献,对异或产生2的贡献,那么对于一个二进制位,要是这两个数不同,插入的数该位一定为1。

感觉解释的有点模糊……那就来个样例解释一下。

以下以[1,2,3,7]为例:

和:13 二进制:01101

异或:7 二进制:00111

异或的先乘个2也就是右移一位,为01110

0110 | 1

0111 | 0

两位置不同,答案该位为1,即加上1 << 0,变成1

和变成01110,异或变成01100,最后一位已经相同了,舍掉

011 | 1

011 | 0

不同,答案变成3,两数分别变成1000和0100,同样舍最后一位

10 | 0

01 | 0                    相同

1 | 0

0 | 1                      不同,答案变成11

| 1

| 1                         相同

插入后数列为 1, 2, 3, 7 , 11符合条件

具体代码实现:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define rep(x, l, r) for(int x = l; x <= r; x++)
#define repd(x, r, l) for(int x = r; x >= l; x--)
#define clr(x, y) memset(x, y, sizeof(x))
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define MAXN
#define fi first
#define se second
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int INF = << ;
const int p = ;
int lowbit(int x){ return x & (-x);}
int fast_power(int a, int b){ int x; for(x = ; b; b >>= ){ if(b & ) x = 1ll * x * a % p; a = 1ll * a * a % p;} return x % p;} int main(){
int t;
scanf("%d", &t);
rep(times, , t){
int n;
scanf("%d", &n);
ll s1 = , s2 = ;
rep(i, , n){
ll x;
scanf("%lld", &x);
s1 += x;
s2 ^= x;
}
s2 <<= ;
ll ans = ;
for(int i = ; s1 != s2; i++){
if((s1 & ) ^ (s2 & )){
s1 += ;
s2 ^= ;
ans += 1ll << i;
}
s1 >>= ;
s2 >>= ;
}
printf("1\n%lld\n", ans);
}
return ;
}

-D

D.Strange Device

题目大意:有一个长为n数列a,值已确定,但是你不知道。现在有个设备,你可以输入长为k的上升序列p1,p2,…,pk,进行询问,它会回答ap1,ap2,...,apk中第m小的数在原数列的坐标和这个数的值。现在给你n和k,让你在最多询问n次后回答m的大小。

作为以往交互题直接跳的人,这题拿到一脸懵,后来还是看题解才有的思路。

我们只需要询问k+1次,第i次询问序列为{ x | 1 <= x <= k + 1, x <> i }

假设n = 4, k = 3,询问分别为

2 3 4

1 3 4

1 2 4

1 2 3

这样问有一个好处,第i次询问,若是i <= m,那么返回的必然是[a1..ak +1]中第m + 1小的数,否则返回的数必然是第m小的数。

那么在k+1次询问后,m+1小的数恰好返回了m次,于是我们答案就是返回的较大的一个数的次数。

代码如下:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#define rep(x, l, r) for(int x = l; x <= r; x++)
#define repd(x, r, l) for(int x = r; x >= l; x--)
#define clr(x, y) memset(x, y, sizeof(x))
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define MAXN
#define fi first
#define se second
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int INF = << ;
const int p = ;
int lowbit(int x){ return x & (-x);}
int fast_power(int a, int b){ int x; for(x = ; b; b >>= ){ if(b & ) x = 1ll * x * a % p; a = 1ll * a * a % p;} return x % p;} map<int, int> f; int main(){
int n, k;
scanf("%d%d", &n, &k);
int maxx = ;
rep(i, , k + ){
putchar('?');
rep(j, , k + ){
if(i == j) continue;
printf(" %d", j);
}
puts("");
fflush(stdout);
int x, y;
scanf("%d%d", &x, &y);
f[y]++;
maxx = max(maxx, y);
}
printf("! %d\n", f[maxx]);
return ;
}

-D

E.Divide Points

题目大意:给你n个点和它们的坐标,现在给它们两两连上边,如果在同一组为黄色,不同组为蓝色。现在让你给出任意一种分组方案,使得所有长度相同的边颜色相同。

相信大家看到这题目想的都是二分图啊,并查集啊……但我不一样,我想的是:这题目能做嘛……

大佬的做法真是高超,先放上题解里截来的图。

主要思路就是奇偶分类。

我们将点按照横纵坐标的奇偶性,分成4个集合。

其中点上的0,1表示坐标的奇偶性,边上的0,1表示长度平方的奇偶性。

不难得出以上不同集合的点的关系,另外同一集合中的边当然也为0。

那么我们只要将(0,0)和(1,1)放入一组,(0,1)和(1,0)放入另一组,那么偶边(即长度平方为偶数的边)必定是同一组的两点,奇边必定是不同组的两点。当然这有个前提,就是每组都不能为空。

那若是有一组为空呢,图片就变成了这个样子

两个集合连起来也是偶边,自己集合连自己集合也是偶边,似乎无法连接了。

但是我们发现自己连自己横坐标差和纵坐标差都为偶数,和别的集合连得差都为偶数。

我们设同一集合的横坐标差为2k1,纵坐标差为2k2,不同集合的横坐标差为2k1+1,纵坐标差是2k2+1

根据距离公式d = √((x1 - x2) × (x1 + x2) + (y1 - y2) × (y1 - y2))进行计算(方便起见,直接算边长度的平方)。

同一集合相连 = (2k1)2 + (2k2)2 = 4(k12 + k22)

不同集合相连 = (2k1 + 1)2 + (2k2 + 1)2 = 4(k12 + k22 + k1 + k2) + 2

很显然这两个是不会相等的。

那么如果不符合上一个情况,那么按x的奇偶性分组。

可是万一数据只有一个集合呢?

没事把数据缩小一倍就好了,到时候一定会有答案因为点坐标两两不同。

这样为什么可行呢?

因为同一个集合中的点的奇偶性都是相同的,那么我们将它们的最后一位舍弃也是符合原来的大小情况。

代码如下:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define rep(x, l, r) for(int x = l; x <= r; x++)
#define repd(x, r, l) for(int x = r; x >= l; x--)
#define clr(x, y) memset(x, y, sizeof(x))
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define MAXN 1005
#define fi first
#define se second
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int INF = << ;
const int p = ;
int lowbit(int x){ return x & (-x);}
int fast_power(int a, int b){ int x; for(x = ; b; b >>= ){ if(b & ) x = 1ll * x * a % p; a = 1ll * a * a % p;} return x % p;} vi ans;
int x[MAXN], y[MAXN], cnt[][]; int main(){
int n;
scanf("%d", &n);
rep(i, , n) scanf("%d%d", &x[i], &y[i]);
while(){
clr(cnt, );
rep(i, , n) cnt[x[i] & ][y[i] & ]++;
if(cnt[][] + cnt[][] > && cnt[][] + cnt[][] > ){
rep(i, , n)
if((x[i] & ) ^ (y[i] & )) ans.pb(i);
printf("%d\n", SZ(ans));
rep(i, , SZ(ans) - ) printf("%d ", ans[i]);
puts("");
return ;
}
if(cnt[][] + cnt[][] > && cnt[][] + cnt[][] > ){
rep(i, , n)
if(x[i] & ) ans.pb(i);
printf("%d\n", SZ(ans));
rep(i, , SZ(ans) - ) printf("%d ", ans[i]);
puts("");
return ;
}
rep(i, , n){
x[i] >>= ;
y[i] >>= ;
}
}
return ;
}

-E

Good Bye 2019(前五题题解)的更多相关文章

  1. Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)

    这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...

  2. Codeforces Round #519 by Botan Investments(前五题题解)

    开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...

  3. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  4. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  5. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  6. BestCoder Round #85 前三题题解

    sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  7. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  8. Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)

    感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...

  9. Codeforces Round #530 (Div. 2) (前三题题解)

    总评 今天是个上分的好日子,可惜12:30修仙场并没有打... A. Snowball(小模拟) 我上来还以为直接能O(1)算出来没想到还能小于等于0的时候变成0,那么只能小模拟了.从最高的地方进行高 ...

随机推荐

  1. Laravel5.1 实现第三方登录认证教程之 - 微信登录

    https://laravel-china.org/topics/2451/laravel51-implementation-of-the-third-party-login-authenticati ...

  2. OpenStack项目及组件功能简单介绍

    核心项目3个 1.控制台 服务名:Dashboard 项目名:Horizon 功能:web方式管理云平台,建云主机,分配网络,配安全组,加云盘 2.计算 服务名:计算 项目名:Nova 功能:负责响应 ...

  3. 带你进入 Activiti 工作流的世界

    Activiti 是一个针对企业用户.开发人员 .系统管理员的轻量级工作流业务管理平台,其核心是使用 java 开发的快速 . 稳定的 BPMN2.0 流程引擎 .它可以与 spring 完美集成. ...

  4. iptables发布内部网络服务器

    要使因特网上的计算机访问到内部网的FTP服务器.WEB服务器,在做为防火墙的计算机上应添加以下规则: 1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 发 ...

  5. MVC4 变更模板

    模板位置: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4 ...

  6. cf1234-div3

    A 水题 B 直接看2,发现`unordered_map被卡了...` 乖乖离散化 C 有六种水管,可以任意的旋转,使得有一条从(1, 0)到(2, n)的通路. 找规律,当时写D没来得及看 #inc ...

  7. 用winrar和zip命令拷贝目录结构

    linux系统下使用zip命令 zip -r source.zip source -x *.php -x *.html # 压缩source目录,排除里面的php和html文件 windows系统下使 ...

  8. squid+iptables实现网关防火墙

    需求说明:此服务器用作网关.MAIL(开启web.smtp.pop3).FTP.DHCP服务器,内部一台机器(192.168.0.254)对外提供dns服务,为了不让无意者轻易看出此服务器开启了ssh ...

  9. [转]关于/r与/n 以及 /r/n 的区别总结

    应该说还是区别的,\r就是回到行首,\n就是到下一行的,但是一般我们输出程序时,看不到明显的差别的 '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来 ...

  10. 解决input number类型上下滚动 禁用滚轮事件

    1.去掉input在type="number"时的上下箭头 <style> input::-webkit-outer-spin-button,input::-webki ...