AtCoder Grand Contest 013 题解

A - Sorted Arrays

贪心,看看不下降和不上升最长能到哪,直接转移过去即可。

 1 //waz
 2 #include <bits/stdc++.h>
 3  
 4 using namespace std;
 5  
 6 #define mp make_pair
 7 #define pb push_back
 8 #define fi first
 9 #define se second
10 #define ALL(x) (x).begin(), (x).end()
11 #define SZ(x) ((int)((x).size()))
12  
13 typedef pair<int, int> PII;
14 typedef vector<int> VI;
15 typedef long long int64;
16 typedef unsigned int uint;
17 typedef unsigned long long uint64;
18  
19 #define gi(x) ((x) = F())
20 #define gii(x, y) (gi(x), gi(y))
21 #define giii(x, y, z) (gii(x, y), gi(z))
22  
23 int F()
24 {
25     char ch;
26     int x, a;
27     while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-');
28     if (ch == '-') ch = getchar(), a = -1;
29     else a = 1;
30     x = ch - '0';
31     while (ch = getchar(), ch >= '0' && ch <= '9')
32         x = (x << 1) + (x << 3) + ch - '0';
33     return a * x;
34 }
35  
36 const int mod = 1e9 + 7;
37  
38 int n, a[100010], cnt;
39  
40 int main()
41 {
42     gi(n);
43     for (int i = 1; i <= n; ++i) gi(a[i]);
44     for (int i = 1; i <= n; ++i)
45     {
46         int j = i, k = i;
47         while (j < n && a[j + 1] >= a[j]) ++j;
48         while (k < n && a[k + 1] <= a[k]) ++k;
49         i = max(j, k);
50         ++cnt;
51     }
52     printf("%d\n", cnt);
53     return 0;
54 }

 

B - Hamiltonish Path

随便选一个边,从两头开始dfs到不能走就就好了。

 1 //waz
 2 #include <bits/stdc++.h>
 3  
 4 using namespace std;
 5  
 6 #define mp make_pair
 7 #define pb push_back
 8 #define fi first
 9 #define se second
10 #define ALL(x) (x).begin(), (x).end()
11 #define SZ(x) ((int)((x).size()))
12  
13 typedef pair<int, int> PII;
14 typedef vector<int> VI;
15 typedef long long int64;
16 typedef unsigned int uint;
17 typedef unsigned long long uint64;
18  
19 #define gi(x) ((x) = F())
20 #define gii(x, y) (gi(x), gi(y))
21 #define giii(x, y, z) (gii(x, y), gi(z))
22  
23 int F()
24 {
25     char ch;
26     int x, a;
27     while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-');
28     if (ch == '-') ch = getchar(), a = -1;
29     else a = 1;
30     x = ch - '0';
31     while (ch = getchar(), ch >= '0' && ch <= '9')
32         x = (x << 1) + (x << 3) + ch - '0';
33     return a * x;
34 }
35  
36 const int N = 1e5 + 10;
37  
38 int n, m;
39  
40 VI edge[N];
41  
42 VI l, r;
43  
44 bool vis[N];
45  
46 int main()
47 {
48     gii(n, m);
49     for (int i = 1; i <= m; ++i)
50     {
51         int u, v;
52         gii(u, v);
53         edge[u].pb(v);
54         edge[v].pb(u);
55         if (i == 1) vis[u] = vis[v] = 1, l.pb(u), r.pb(v);
56     }
57     while (1)
58     {
59         int x = -1;
60         for (auto v : edge[l.back()])
61             if (!vis[v]) x = v;
62         if (x == -1) break;
63         l.pb(x); vis[x] = 1;
64     }
65     while (1)
66     {
67         int x = -1;
68         for (auto v : edge[r.back()])
69             if (!vis[v]) x = v;
70         if (x == -1) break;
71         r.pb(x); vis[x] = 1;
72     }
73     printf("%d\n", SZ(l) + SZ(r));
74     reverse(ALL(l));
75     for (auto x : l)
76         printf("%d ", x);
77     for (auto x : r)
78         printf("%d ", x);
79     return 0;
80 }

 

C - Ants on a Circle

很明显的套路,蚂蚁的相对位置肯定不变,那么我们算出每个蚂蚁走了多少,最后排序一下,主要是算第一个位置是谁,再统计一下经过了圆多少次就好了。

 1 //waz
 2 #include <bits/stdc++.h>
 3  
 4 using namespace std;
 5  
 6 #define mp make_pair
 7 #define pb push_back
 8 #define fi first
 9 #define se second
10 #define ALL(x) (x).begin(), (x).end()
11 #define SZ(x) ((int)((x).size()))
12  
13 typedef pair<int, int> PII;
14 typedef vector<int> VI;
15 typedef long long int64;
16 typedef unsigned int uint;
17 typedef unsigned long long uint64;
18  
19 #define gi(x) ((x) = F())
20 #define gii(x, y) (gi(x), gi(y))
21 #define giii(x, y, z) (gii(x, y), gi(z))
22  
23 int F()
24 {
25     char ch;
26     int x, a;
27     while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-');
28     if (ch == '-') ch = getchar(), a = -1;
29     else a = 1;
30     x = ch - '0';
31     while (ch = getchar(), ch >= '0' && ch <= '9')
32         x = (x << 1) + (x << 3) + ch - '0';
33     return a * x;
34 }
35  
36 const int N = 1e5 + 10;
37  
38 int n, l, t;
39  
40 int x[N], w[N];
41  
42 int main()
43 {
44     giii(n, l, t);
45     long long v = 0;
46     for (int i = 1; i <= n; ++i) 
47     {
48         gii(x[i], w[i]);
49         if (w[i] == 1)
50         {
51             x[i] += t;
52             v += x[i] / l;
53             x[i] %= l;
54         }
55         else
56         {
57             x[i] -= t;
58             if (x[i] < 0)
59             {
60                 v += (x[i] - (l - 1)) / l;
61             }
62             x[i] %= l;
63             if (x[i] < 0) x[i] += l; 
64         }
65     }
66     sort(x + 1, x + n + 1);
67     v %= n;
68     if (v < 0) v += n;
69     for (int i = 1; i <= n; ++i)
70     {
71         int j = i + v;
72         if (j > n) j -= n;
73         printf("%d\n", x[j]);
74     }
75     return 0;
76 } 

 

D - Piling Up

 直接f[i][j]dp会算重,我们加一维0/1表示是否曾经到达过0,这样子就不会重了。

 1 //waz
 2 #include <bits/stdc++.h>
 3  
 4 using namespace std;
 5  
 6 #define mp make_pair
 7 #define pb push_back
 8 #define fi first
 9 #define se second
10 #define ALL(x) (x).begin(), (x).end()
11 #define SZ(x) ((int)((x).size()))
12  
13 typedef pair<int, int> PII;
14 typedef vector<int> VI;
15 typedef long long int64;
16 typedef unsigned int uint;
17 typedef unsigned long long uint64;
18  
19 #define gi(x) ((x) = F())
20 #define gii(x, y) (gi(x), gi(y))
21 #define giii(x, y, z) (gii(x, y), gi(z))
22  
23 int F()
24 {
25     char ch;
26     int x, a;
27     while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-');
28     if (ch == '-') ch = getchar(), a = -1;
29     else a = 1;
30     x = ch - '0';
31     while (ch = getchar(), ch >= '0' && ch <= '9')
32         x = (x << 1) + (x << 3) + ch - '0';
33     return a * x;
34 }
35  
36 const int N = 3010, mod = 1e9 + 7;
37  
38 int inc(int a, int b) { a += b; return a >= mod ? a - mod : a; }
39  
40 int n, m, f[N][N][2];
41  
42 int main()
43 {
44     gii(n, m);
45     for (int i = 0; i <= n; ++i) f[0][i][!!i] = 1;
46     for (int i = 1; i <= m; ++i) 
47     {
48         for (int j = 0; j <= n; ++j)
49         {
50             //2 * x
51             f[i][j][0] = inc(f[i][j][0], f[i - 1][j + 1][0]);
52             f[i][j][!!j] = inc(f[i][j][!!j], f[i - 1][j + 1][1]);
53             
54             //x ... y
55             if (j) f[i][j][0] = inc(f[i][j][0], f[i - 1][j][0]);
56             if (j) f[i][j][!!(j - 1)] = inc(f[i][j][!!(j - 1)], f[i - 1][j][1]);
57             
58             //y ... x
59             if (j != n) f[i][j][0] = inc(f[i][j][0], f[i - 1][j][0]);
60             if (j != n) f[i][j][!!j] = inc(f[i][j][!!j], f[i - 1][j][1]);
61             
62             //2 * y
63             if (j) f[i][j][0] = inc(f[i][j][0], f[i - 1][j - 1][0]);
64             if (j) f[i][j][1] = inc(f[i][j][1], f[i - 1][j - 1][1]);
65         }
66     }
67     int ans = 0;
68     for (int i = 0; i <= n; ++i) ans = inc(ans, f[m][i][0]);
69     printf("%d\n", ans);
70     return 0;
71 }

 

E - Placing Squares

写出n^2的dp式子:f[i]=sigma(f[j]*(i-j)^2),对于所有x[i],f[x[i]]=0。

我们考虑式子的组合意义,就是两个不同的球放在(i-j)箱子的方案数。

我们就可以dp[i][0/1/2]来线性递推了。

就可以用矩阵优化了。

  1 //waz
  2 #include <bits/stdc++.h>
  3  
  4 using namespace std;
  5  
  6 #define mp make_pair
  7 #define pb push_back
  8 #define fi first
  9 #define se second
 10 #define ALL(x) (x).begin(), (x).end()
 11 #define SZ(x) ((int)((x).size()))
 12  
 13 typedef pair<int, int> PII;
 14 typedef vector<int> VI;
 15 typedef long long int64;
 16 typedef unsigned int uint;
 17 typedef unsigned long long uint64;
 18  
 19 #define gi(x) ((x) = F())
 20 #define gii(x, y) (gi(x), gi(y))
 21 #define giii(x, y, z) (gii(x, y), gi(z))
 22  
 23 int F()
 24 {
 25     char ch;
 26     int x, a;
 27     while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-');
 28     if (ch == '-') ch = getchar(), a = -1;
 29     else a = 1;
 30     x = ch - '0';
 31     while (ch = getchar(), ch >= '0' && ch <= '9')
 32         x = (x << 1) + (x << 3) + ch - '0';
 33     return a * x;
 34 }
 35  
 36 const int mod = 1e9 + 7;
 37  
 38 int inc(int a, int b) { a += b; return a >= mod ? a - mod : a; }
 39  
 40 int n, m, x[100010];
 41  
 42 void task1()
 43 {
 44     static int dp[100010][3];
 45     dp[0][0] = 1;
 46     static map<int, bool> X;
 47     for (int i = 1; i <= m; ++i) X[x[i]] = 1;
 48     for (int i = 1; i <= n; ++i)
 49     {
 50         dp[i][0] = dp[i - 1][0];
 51         dp[i][1] = inc(dp[i - 1][0], dp[i - 1][1]);
 52         dp[i][2] = inc(inc(inc(dp[i - 1][0], dp[i - 1][1]), dp[i - 1][1]), dp[i - 1][2]);
 53         if(!X.count(i - 1))
 54         {
 55             dp[i][0] = inc(dp[i][0], dp[i - 1][2]);
 56             dp[i][1] = inc(dp[i][1], dp[i - 1][2]);
 57             dp[i][2] = inc(dp[i][2], dp[i - 1][2]);
 58         }
 59     }
 60     printf("%d\n", dp[n][2]);
 61 }
 62  
 63 struct matrix
 64 {
 65     int a[3][3];
 66     friend matrix operator * (matrix a, matrix b)
 67     {
 68         matrix c;
 69         memset(c.a, 0, sizeof c.a);
 70         for (int k = 0; k < 3; ++k)
 71             for (int i = 0; i < 3; ++i)
 72                 for (int j = 0; j < 3; ++j)
 73                     c.a[i][j] = (c.a[i][j] + 1LL * a.a[i][k] * b.a[k][j]) % mod;
 74         return c;
 75     }
 76 } one, A, B, C;
 77  
 78 matrix fpow(matrix a, int x)
 79 {
 80     matrix ret = one;
 81     for (; x; x >>= 1)
 82     {
 83         if (x & 1) ret = ret * a;
 84         a = a * a;
 85     }
 86     return ret;
 87 }
 88  
 89 void work()
 90 {
 91     /*
 92     1,0,1
 93     1,1,1
 94     1,2,2
 95     */
 96     /*
 97     1,0,0
 98     1,1,0
 99     1,2,1
100     */
101     one.a[0][0] = one.a[1][1] = one.a[2][2] = 1;
102     A.a[0][0] = 1, A.a[0][1] = 0, A.a[0][2] = 1;
103     A.a[1][0] = 1, A.a[1][1] = 1, A.a[1][2] = 1;
104     A.a[2][0] = 1, A.a[2][1] = 2, A.a[2][2] = 2;
105     B.a[0][0] = 1, B.a[0][1] = 0, B.a[0][2] = 0;
106     B.a[1][0] = 1, B.a[1][1] = 1, B.a[1][2] = 0;
107     B.a[2][0] = 1, B.a[2][1] = 2, B.a[2][2] = 1;
108     matrix ret = one;
109     for (int i = 1; i <= m; ++i)
110     {
111         ret = ret * fpow(A, x[i] - x[i - 1] - 1);
112         ret = ret * B;
113     }
114     ret = ret * fpow(A, n - x[m]);
115     C.a[0][0] = 1;
116     ret = ret * C;
117     printf("%d\n", ret.a[2][0]); 
118 }
119  
120 int main()
121 {
122     gii(n, m);
123     for (int i = 1; i <= m; ++i) gi(x[i]);
124     //task1();
125     work(); 
126     return 0;
127 }

 

F - Two Faced Cards

不会做,先咕着(目前已经咕了4题了qwq)。

转载于:https://www.cnblogs.com/AnzheWang/p/9678703.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

servlet架构解析

https://www.jianshu.com/p/d433b5fb87e2

(Review cs231n) Backpropagation and Neural Network

损失由两部分组成&#xff1a; 数据损失正则化损失&#xff08;data loss regularization&#xff09; 想得到损失函数关于权值矩阵W的梯度表达式&#xff0c;然后进性优化操作&#xff08;损失相当于海拔&#xff0c;你在山上的位置相当于W&#xff0c;你进行移动&#xff0c…

springboot restful

https://www.jianshu.com/p/733d788ea94d

【计算机算法设计与分析】——排序

一.排序 二.插入排序 &#xff08;1&#xff09;算法描述 &#xff08;2&#xff09;性能分析 &#xff08;3&#xff09;寻求优化 三.归并排序 &#xff08;1&#xff09;算法思想 &#xff08;2&#xff09;性能分析 &#xff08;2&#xff09;示例 &#xff08;3&#xff09…

QT 随机数生成

下面总结了QT中随机生成的方法&#xff08;仅供学习参考&#xff09;&#xff0c;分为旧方法和新方法&#xff0c;一般来说&#xff0c;旧的方法已经被抛弃&#xff0c;在开发新的应用中推荐使用新方法。 C Code 123456789101112131415161718192021222324#include <QCoreApp…

获取/设置IFRAME内对象元素的几种JS方法

获取/设置IFRAME内对象元素的几种JS方法 iframe浏览器ie文档微软&#xff11;。IE专用(通过frames索引形象定位)&#xff1a; document.frames[i].document.getElementById(元素的ID); &#xff12;。IE专用(通过IFRAME名称形象定位)&#xff1a; document.frames[iframe的name…

高并发

https://blog.csdn.net/java_xth/article/details/81162088

多人游戏服务器

https://www.getmangos.eu/转载于:https://www.cnblogs.com/aibox222/p/9682697.html

Hbase 各个角色的工作。

HMaster的作用&#xff1a; 为region server 分配region&#xff1b;负责region server的负载均衡&#xff0c;region分裂完成监控&#xff1b;处理schema更新请求&#xff0c;数据表的创建&#xff0c;更新&#xff1b;HDFS上的垃圾文件回收&#xff1b;发现失效的region serv…

Activiti中的关于子流程中的并发节点标记处理

最近在研究一个轻量级的工作流引擎Activiti&#xff0c;就遇到了子流程中无法标记其并发节点的问题&#xff0c;经过几天的研究&#xff0c;想到了一个简单易懂的方法&#xff0c;总结如下&#xff0c;希望对你们能有所帮助&#xff0c;有写的不对的地方&#xff0c;还希望大家…

[WPF 基础知识系列] —— 绑定中的数据校验Vaildation

[WPF 基础知识系列] —— 绑定中的数据校验Vaildation 原文:[WPF 基础知识系列] —— 绑定中的数据校验Vaildation前言&#xff1a; 只要是有表单存在&#xff0c;那么就有可能有对数据的校验需求。如&#xff1a;判断是否为整数、判断电子邮件格式等等。 WPF采用一种全新的方式…

ModuleNotFoundError: No module named 'win32api'

启动一个工程的cmd&#xff1a; scrapy crawl HI 如果 运行报 No module named “win32api” 要安装 pip install pypiwin32 这个包转载于:https://www.cnblogs.com/hailong88/p/10528618.html

powercmd注册码

用户名&#xff1a;nzone注册码&#xff1a;PCMDA-86128-PCMDA-70594 http://www.baidu.com/

Servlet其实是单例多线程

https://blog.csdn.net/xiaojiahao_kevin/article/details/51781946

解决“跨域问题”的几种方法

&#xff08;0&#xff09;使用注解方式&#xff0c;这个可能有些框架可以&#xff0c;有些不行&#xff0c;在要访问的方法前面加上此注解即可&#xff1a; CrossOrigin &#xff08;1&#xff09;使用 Access-Control-Allow-Origin 设置请求响应头&#xff0c;简洁有效。 &am…

Conda 安装本地包

有的conda或pipy源太慢&#xff0c;conda install xxx或者pip install xxx下载会中断连接导致压缩包下载不全&#xff0c;本地的安装包没法完全安装, 遇到这个问题时&#xff0c;我们可以用p2p工具-迅雷等先下载指定包再用conda或pip安装 pip 安装本地包pip install D:\XXX.w…

DESUtils 加解密时 Given final block not properly padded bug小记

事情的经过是这个样子的。。。。。。 先说说问题是怎么出现的。根据客户需求&#xff0c;需要完成一个一键登录的功能&#xff0c;于是我的项目中就诞生了DesUtil&#xff0c;但是经过上百次用户测试&#xff0c;发现有一个用户登录就一直报错&#xff01;难道又遇到神坑啦&am…

Apache

https://www.iteye.com/blog/yaodaqing-1596570

仿 腾讯新闻快讯 --无缝滚动

//无缝滚动function AutoScroll(obj) {var autoScrollTimernull,timernull;timersetTimeout(function(){move();},3000);function move(){clearTime(autoScrollTimer);var liLen $(obj).find(li).length;if(liLen 1){//此处处理只有一条数据时 跳动效果$(obj).find("ul:f…

spring3.2 @Scheduled注解 定时任务

1.首先加入 下载spring3.2 &#xff0c;http://projects.spring.io/spring-framework/ 2.加入jar包&#xff0c;在applicationContext.xml加入声明-xmlns加入[java xmlns:task"http://www.springframework.org/schema/task" -xsi加入[java] http://www.springframe…