链接。

【A】寻找漂亮数字

题意:

给定了两列非零数字。
我们说一个数是漂亮的,当它的十进制表达中有至少一个数从数列一中取出,至少有一个数从数列二中取出。
最小的漂亮数字是多少?

输入:

第一行两个数\(n,m(1\leq n,m\leq9)\),表示数列一、二的长度。
第二行n个数,表示数列一。
第三行m个数,表示数列二。

题解:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<set>
 5 #define F(i,a,b) for(int i=a;i<=b;++i)
 6 #define dF(i,a,b) for(int i=a;i>=b;--i)
 7 #define F2(i,a,b) for(int i=a;i<b;++i)
 8 inline int Min(int p,int q){return p<q?p:q;}
 9 inline int Max(int p,int q){return p>q?p:q;}
10 int n,m,a[10],b[10],A=100,B=100;
11 void init(){
12     int x;
13     scanf("%d%d",&n,&m);
14     F(i,1,n) scanf("%d",&x), a[x]=1, A=Min(A,x);
15     F(i,1,m) scanf("%d",&x), b[x]=1, B=Min(B,x);
16 }
17 int main(){
18     init();
19     F(i,1,9) if(a[i]&&b[i]) {printf("%d",i); return 0;}
20     if(A>B) printf("%d%d",B,A);
21     else printf("%d%d",A,B);
22     return 0;
23 }

【B】最小值的最大值的最大值

题意:

给定了一个数组和一个数k,你要把这个数组分成恰好k份,使得这k份中的每一份的最小值的最大值最大。
求出这个最大值。

输入:

第一行,两个数n,k。
第二行,n个数,表示数组中的元素。

输出:

一个数,表示最大值。

题解:

当k=1时,答案是最小值。当k>=3时,答案是最大值。
当k=2时,枚举分割点。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<set>
 5 #define F(i,a,b) for(int i=a;i<=b;++i)
 6 #define dF(i,a,b) for(int i=a;i>=b;--i)
 7 #define F2(i,a,b) for(int i=a;i<b;++i)
 8 inline int Min(int p,int q){return p<q?p:q;}
 9 inline int Max(int p,int q){return p>q?p:q;}
10 int n,k,a[100001],min=2147483647,max=-2147483647;
11 int m1[100001],m2[100001];
12 void init(){
13     scanf("%d%d",&n,&k);
14     F(i,1,n) scanf("%d",a+i), max=Max(max,a[i]), min=Min(min,a[i]);
15 }
16 int main(){
17     init();
18     if(k>=3) printf("%d",max);
19     else if(k==1) printf("%d",min);
20     else{
21         m1[1]=a[1]; F(i,2,n) m1[i]=Min(m1[i-1],a[i]);
22         m2[n]=a[n]; dF(i,n-1,1) m2[i]=Min(m2[i+1],a[i]);
23         int Ans=-2147483647;
24         F(i,2,n) Ans=Max(Ans,Max(m1[i-1],m2[i]));
25         printf("%d",Ans);
26     }
27     return 0;
28 }

【C】最大分割

题意:

给你一个数n,把它分成若干个合数的和,最多能分成多少个合数?有多组数据。

输入:

第一行一个数q(1<=q<=10^5),表示数据组数。
对于每个数据,输入一个数n(1<=n<=10^9)。

输出:

对于每组数据,输出一行一个数表示分割数。如果无法做到,输出-1。

题解:

4是最小的合数,对于n足够大的情况,可以分成若干4和一些较小的合数。
于是对4的余数分类讨论。具体看代码。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<set>
 5 #define F(i,a,b) for(int i=a;i<=b;++i)
 6 #define dF(i,a,b) for(int i=a;i>=b;--i)
 7 #define F2(i,a,b) for(int i=a;i<b;++i)
 8 inline int Min(int p,int q){return p<q?p:q;}
 9 inline int Max(int p,int q){return p>q?p:q;}
10 int T,n;
11 int main(){
12     scanf("%d",&T);
13     while(T--){
14         scanf("%d",&n);
15         switch(n%4){
16             case 0: printf("%d\n",n/4);break;
17             case 1: {n>=9?printf("%d\n",(n-9)/4+1):puts("-1");break;}
18             case 2: {n>=6?printf("%d\n",(n-6)/4+1):puts("-1");break;}
19             case 3: {n>=15?printf("%d\n",(n-15)/4+2):puts("-1");break;}
20         }
21     }
22     return 0;
23 }

【D】和区间与异或有关的东西

不会。

【E】点、线什么的和现成的标题

题意:

平面直角坐标系中有一些格点,你可以过每个格点画出关于x轴y轴平行的直线,也可以不画,问有最终多少种不同的画法,重合的直线算作同一条。

输入:

第一行,一个数n(1<=n<=10^5),表示格点的个数。

接下来n行,每行两个数xi, yi,表示第i个点的坐标是(xi,yi)。保证没有重合的点。

输出:

一个数,画法总数对10^9+7取模的结果。

题解:

只有横坐标或纵坐标相同的点才会互相影响,而互相影响的关系是传递的。
我们先把不会互相影响的点分开,最终的答案是每一部分的答案的乘积。
那么现在我们有一堆互相影响的点,如何计算方案数?

参见http://www.cnblogs.com/kkkkahlua/p/7679526.html和http://hzwer.com/2950.html。嘻嘻。

代码也是抄的,嘤嘤嘤。

 1 #include <bits/stdc++.h>
 2 #define maxn 100010
 3 using namespace std;
 4 typedef long long LL;
 5 const LL mod = 1e9+7;
 6 struct node {
 7     int x, y;
 8 }a[maxn];
 9 int fa[maxn], sz[maxn], f[maxn], id[maxn], m[maxn];
10 bool circ[maxn], vis[maxn];
11 vector<int> v[maxn];
12 set<int> sx, sy;
13 bool cmp1(int i, int j) {
14     return a[i].x < a[j].x || (a[i].x == a[j].x && a[i].y < a[j].y);
15 }
16 bool cmp2(int i, int j) {
17     return a[i].y < a[j].y || (a[i].y == a[j].y && a[i].x < a[j].x);
18 }
19 LL poww(LL a, LL b) {
20     LL ret = 1;
21     while (b) {
22         if (b & 1) (ret *= a) %= mod;
23         (a *= a) %= mod;
24         b >>= 1;
25     }
26     return ret;
27 }
28 int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
29 void unionn(int a, int b) {
30     a = find(a), b = find(b);
31     if (a == b) { circ[a] = true; return; }
32     if (sz[a] > sz[b]) swap(a, b);
33     fa[a] = b; sz[b] += sz[a];
34     circ[b] |= circ[a];
35 }
36 int main() {
37     int n;
38     scanf("%d", &n);
39     for (int i = 0; i < n; ++i) {
40         scanf("%d%d", &a[i].x, &a[i].y);
41     }
42     for (int i = 0; i < n; ++i) id[i] = i;
43     for (int i = 0; i < n; ++i) fa[i] = i, sz[i] = 1;
44
45     sort(id, id+n, cmp1);
46     for (int i = 1; i < n; ++i) {
47         if (a[id[i]].x == a[id[i-1]].x) unionn(id[i-1], id[i]);
48     }
49     sort(id, id+n, cmp2);
50     for (int i = 1; i < n; ++i) {
51         if (a[id[i]].y == a[id[i-1]].y) unionn(id[i-1], id[i]);
52     }
53     for (int i = 0; i < n; ++i) fa[i] = find(i);
54
55     int tot = -1;
56     for (int i = 0; i < n; ++i) {
57         if (!vis[fa[i]]) vis[fa[i]] = true, f[++tot] = fa[i], m[fa[i]] = tot;
58         v[m[fa[i]]].push_back(i);
59     }
60     LL ans = 1;
61     for (int i = 0; i <= tot; ++i) {
62         sx.clear(), sy.clear();
63         for (auto idx : v[i]) {
64             sx.insert(a[idx].x), sy.insert(a[idx].y);
65         }
66         LL mul = poww(2, sx.size()+sy.size());
67         if (!circ[f[i]]) (mul += mod-1) %= mod;
68         (ans *= mul) %= mod;
69     }
70     printf("%I64d\n", ans);
71     return 0;
72 }

转载于:https://www.cnblogs.com/PinkRabbit/p/7695725.html

【codeforces】【比赛题解】#872 CF Round #440 (Div.2)相关推荐

  1. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛-- 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  2. 【codeforces】【比赛题解】#849 CF Round #431 (Div.2)

    cf的比赛越来越有难度了--至少我做起来是这样. 先看看题目吧:点我. 这次比赛是北京时间21:35开始的,算是比较良心. [A]奇数与结束 "奇数从哪里开始,又在哪里结束?梦想从何处起航, ...

  3. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

  4. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)

    剧毒比赛,至少涨了分对吧.: ( [A]Left-handers, Right-handers and Ambidexters 题意: 有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用 ...

  5. 【codeforces】【比赛题解】#851 CF Round #432 (Div.2)

    cf真的难-- 点我浏览丧题. [A]Arpa和她对墨西哥人浪的研究 Arpa正在对墨西哥人浪进行研究. 有n个人站成一排,从1到n编号,他们从时刻0开始墨西哥人浪. 在时刻1,第一个人站起来. 在时 ...

  6. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊. 题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之 ...

  7. 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)

    人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...

  8. CF Round #681(Div.2)/CF1443 口胡题解

    由于一些原因(时间),本蒟蒻决定口胡这场比赛. 下面的题解纯口胡,但是与题解中的解法基本相同. Solution A 答案就是2n+2,2n+4,2n+6--4n2n+2, 2n+4, 2n+6--4 ...

  9. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)

    一场挺简单的CF,但是我打炸了啊 A. Search for Pretty Integers time limit per test 1 second memory limit per test 25 ...

最新文章

  1. Python-函数的各种器
  2. hdu1085Holding Bin-Laden Captive!组合问题
  3. 武汉大学计算机学院 曹老师,关于校园网吧建设的计算机网络综合设计.doc
  4. 九日登望仙台呈刘明府 [唐] 崔曙
  5. oracle 临时表空间的作用和创建以及相关操作
  6. MPU6050读取实验
  7. 使用C语言输出菱形详解
  8. 数字图像处理——广义图像增强
  9. 怎么从扫描的PDF文档/图片里提取文字
  10. 为什么没人再提勤劳致富了?
  11. 机器学习知识总结及代码实现
  12. 07.保护模式下字符显示
  13. 1到10之间所有数的平方和立方
  14. 软件工程基础知识--认识软件工程
  15. 【操作系统实验】Ubuntu Linux 虚拟机文件的压缩、备份命令
  16. 〖Python网络爬虫实战⑫〗- XPATH语法介绍
  17. c语言 存款利息计算,1000元,存5年,求五种方案存款五年后的本息和
  18. 概率机器人课后习题答案
  19. MyEclipse下载官方网址
  20. 图像处理 --- 三、图像变换 3.1图像变换的基本概念

热门文章

  1. 说一下现在比较火的创业项目
  2. 一个家庭女人太强势,这个家庭会怎样?
  3. 作为餐饮店长最需要什么能力?
  4. 上有天最高,自然较为小
  5. 为什么你说的话别人不愿意听?
  6. 互联网的上半场,建立平台获取流量
  7. 怎么用U盘重装系统?
  8. 二十年前的电脑配置单,大家见过吗?
  9. 华为手机的硬件好,苹果手机的系统好,能不能将苹果手机的系统装到华为手机里面呢?
  10. Qt4_基于项的图形视图