2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

C

有n个节点和m边条,求一条最长的路径,该路径(c1,c2,c3...cn)满足 不出现重复的节点,c和ci+1是邻居节点,且 c的邻居节点数量小于ci+1的邻居节点数量。

记忆DFS遍历,每次递归计算的值都保存在数组里,这样复杂度相当于O(m)

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 #define ll long long
 4 using namespace std;
 5 const int N = 1e5+10;
 6 vector<int> vs[N];
 7 int MAX, ans[N];
 8 int dfs(int v) {
 9     if(ans[v]!=0) return ans[v];
10     int cnt = 0;
11     for(auto u : vs[v]) {
12         if(vs[u].size() > vs[v].size()) {
13             cnt = max(cnt, dfs(u));
14         }
15     }
16     ans[v] = cnt+1;
17     return cnt+1;
18 }
19 int main() {
20     int n, m, v, u;
21     cin >> n >> m;
22     for(int i = 1; i <= m; i ++) {
23         cin >> v >> u;
24         vs[v].push_back(u);
25         vs[u].push_back(v);
26     }
27     for(int i = 0; i < n; i ++) {
28         dfs(i);
29         MAX = max(MAX, ans[i]);
30     }
31     cout << MAX << endl;
32     return 0;
33 }
View Code

 

D

给定一个数字x,问一直使用x = f(x)这个函数是否可以将x变成1.

f(x) 的定义是对每一位数进行平方求和。签到题

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 #define ll long long
 4 using namespace std;
 5 map<int,int> mp;
 6 int f(int x) {
 7     int ans = 0;
 8     while(x) {
 9         int y = x%10;
10         ans += y*y;
11         x /= 10;
12     }
13     return ans;
14 }
15 int main() {
16     int n;
17     cin >> n;
18     while(true) {
19         n = f(n);
20         if(n == 1) return 0*printf("HAPPY\n");
21         if(mp.count(n)) break;
22         mp[n] = 1;
23     }
24     printf("UNHAPPY\n");
25     return 0;
26 }
View Code

 

F

已知边长和走的步数,求当前的位置。

分而治之。对于当前边长为n的图,可以分为四份。

如果在左下角,顺时针旋转了90°,相当于x和y值交换下。

如果在右下角,逆时针旋转了90°,相当于x和y值交换下,对称看。

如果在左上角,y值加n/2。

如果在右上角,x值和y值都加n/2。

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 #define ll long long
 4 using namespace std;
 5 const int N = 1e5+10;
 6 struct Point{
 7     int x, y;
 8 };
 9 Point dfs(int n, int m) {
10     Point a;
11     if(n == 2) {
12         if(m == 0) a.x = 1, a.y = 1;
13         else if(m == 1) a.x = 1, a.y = 2;
14         else if(m == 2) a.x = 2, a.y = 2;
15         else if(m == 3) a.x = 2, a.y = 1;
16         return a;
17     }
18     int ans = n*n/4;
19     int cnt = m%ans;
20     a = dfs(n/2, cnt);
21     if(m < ans) {
22         swap(a.x, a.y);
23     } else if(m < 2*ans) {
24         a.y += n/2;    
25     } else if(m < 3*ans) {
26         a.x += n/2;
27         a.y += n/2;
28     } else {
29         int x = n+1-a.y;
30         int y = n/2+1 - a.x;
31         return (Point){x, y};
32     }
33     return a;
34 }
35 
36 int main() {
37     int n, m;
38     cin >> n >> m;
39     Point p = dfs(n, m-1);
40     printf("%d %d\n",p.x,p.y);
41     return 0;
42 }
View Code

 

H

有两个字符串,只有三个字符,R(石头)、S(剪刀)和P(布),求第二个在第一个在哪里开始比赛赢的数数最多,求数量。

12 4

RSPPSSSRRPPR

RRRR

第二个字符串从第4或第5位置开始可以赢3把,所以答案是3。

题目可以转成成从哪里开始,位置一一对应是相同的数量。将第二个字符串反转,使用fft套模板就出答案了。

主要是想到为什么对第二个字符进行反转,假设有两个字符串

1 2 3 456

RRRSSS

SSPR

 

1 2 3 4

RPSS

从第一个位置开始,一一对应是1+4,2+3,3+2,4+1,都是5 

从第二个位置开始,一一对于是2+4,3+3,4+2,5+1,都是6

这样就知道为什么反转了。只要对两个数组求卷积就行。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <math.h>
 4 #define INF 0x3f3f3f3f
 5 #define ll long long
 6 using namespace std;
 7 const int N = 1e5+10;
 8 char s1[N], s2[N];
 9 const double PI = acos(-1.0);
10 struct complex {
11     double r,i;
12     complex(double _r = 0,double _i = 0) {
13         r = _r; i = _i;
14     }
15     complex operator +(const complex &b) {
16         return complex(r+b.r,i+b.i);
17     }
18     complex operator -(const complex &b) {
19         return complex(r-b.r,i-b.i);
20     }
21     complex operator *(const complex &b) {
22         return complex(r*b.r-i*b.i,r*b.i+i*b.r);
23     }
24 };
25 void change(complex y[],int len) {
26     int i,j,k;
27     for(i = 1, j = len/2;i < len-1;i++) {
28         if(i < j)swap(y[i],y[j]);
29         k = len/2;
30         while( j >= k) {
31             j -= k;
32             k /= 2;
33         }
34         if(j < k)j += k;
35     }
36 }
37 void fft(complex y[],int len,int on) {
38     change(y,len);
39     for(int h = 2;h <= len;h <<= 1) {
40         complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
41         for(int j = 0;j < len;j += h) {
42             complex w(1,0);
43             for(int k = j;k < j+h/2;k++) {
44                 complex u = y[k];
45                 complex t = w*y[k+h/2];
46                 y[k] = u+t;
47                 y[k+h/2] = u-t;
48                 w = w*wn;
49             }
50         }
51     }
52     if(on == -1)
53         for(int i = 0;i < len;i++)
54             y[i].r /= len;
55 }
56 
57 const int MAXN = 400040;
58 complex x1[MAXN], x2[MAXN];
59 int a[MAXN/4], n, m;
60 ll num[MAXN], ans[MAXN];
61 void slove(char ch) {
62     int len = 1;
63     while(len < 2*n || len < 2*m)len <<= 1;
64     for(int i = 0;i < n;i++)
65         x1[i] = complex(s1[i]==ch,0);
66     for(int i = n;i < len;i++)
67         x1[i] = complex(0,0);
68     for(int i = 0;i < m;i++)
69         x2[i] = complex(s2[i]==ch,0);
70     for(int i = m;i < len;i++)
71         x2[i] = complex(0,0);
72     fft(x1,len,1);
73     fft(x2,len,1);
74     for(int i = 0;i < len;i++)
75         x1[i] = x1[i]*x2[i];
76     fft(x1,len,-1);
77     for(int i = 0;i < len;i++)
78         num[i] = (long long)(x1[i].r+0.5);
79        for(int i = 0; i < len; i ++) 
80            ans[i] += num[i];
81 }
82 int main() {
83     cin >> n >> m;
84     cin >> s1 >> s2;
85     for(int i = 0; i < n; i ++) {
86         if(s1[i] == 'R') s1[i] = 'P';
87         else if(s1[i] == 'P') s1[i] = 'S';
88         else if(s1[i] == 'S') s1[i] = 'R';
89     }
90     for(int i = 0; i < m/2; i ++) swap(s2[i], s2[m-i-1]);
91     slove('R');
92     slove('S');
93     slove('P');
94     ll MAX = 0;
95     for(int i = m-1; i < n+m-1; i ++) MAX = max(MAX, ans[i]);
96     cout << MAX << endl;
97     return 0;
98 }
View Code

 

转载于:https://www.cnblogs.com/xingkongyihao/p/9932439.html

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

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

相关文章

装系统工具

安装如果失败,注意是不是工具的版本太老导致 系统分区工具: DiskGeniusPortable 刻录工具: UlraISO rufus https://rufus.ie/ win32diskimager 转载于:https://www.cnblogs.com/jiangfeilong/p/9937164.html

小程序WXML基本使用

数据绑定 <!--wxml--> <view> {{message}} </view> // page.js Page({data: {message: Hello MINA!} }) 列表渲染 <!--wxml--> <view wx:for"{{array}}"> {{item}} </view> // page.js Page({data: {array: [1, 2, 3, 4, 5]} })…

tomcat 虚拟路径 与 虚拟主机配置

虚拟路径配置 方法一&#xff1a;此方法需要重启服务 打开下面文件 在host里面添加context标签 <Context docBase"D:\test" path"/testServlet/aaaaa" reloadable"true" /> 浏览器访问&#xff1a;http://172.16.6.103:1080/testServlet/a…

20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

20172328 2018-2019《Java软件结构与数据结构》第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展&#xff1f;是什么呢&#xff1f;你猜对了&#xff01;ヾ(◍∇◍)&#xff89;&#xff9e;就是堆。本章将讲解堆的链表实现and数组实现&#xff0c;以及往…

javascript --- Vue初始化 模板渲染

不带响应式的Vue缩减实现 模板 现有模板如下: <div id "app"><div class"c1"><div titlett1 id"id">{{ name }}</div><div titlett2 >{{age}}</div><div>hello3</div></div><ul>…

#RANK_1 极其简单的递归——骑士与金币

2000:金币 总时间限制: 1000ms内存限制: 65536kB描述国王将金币作为工资&#xff0c;发放给忠诚的骑士。第一天&#xff0c;骑士收到一枚金币&#xff1b;之后两天&#xff08;第二天和第三天&#xff09;里&#xff0c;每天收到两枚金币&#xff1b;之后三天&#xff08;第四、…

javascript --- vue2.x中原型的使用(拦截数组方法) 响应式原理(部分)

说明 在Vue2.x中,利用了对原型链的理解,巧妙的利用JavaScript中的原型链,实现了数组的pop、push、shift、unshift、reverse、sort、splice等的拦截. 你可能需要的知识 参考 - MDN 原型链 JavaScript常被描述为一种基于原型的语言(prototype-based language),每个对象拥有一…

dubbo-admin构建报错

dubbo-admin构建报错 意思是maven库里没有dubbo2.5.4-SNAPSHOT.jar这个版本的dubbo的jar包&#xff0c;把dubbo-admin项目的pom.xml的   <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${proje…

PyCharm 通过Github和Git上管理代码

1.Pycharm中设置如图: 2.配置Git,通过网页 https://www.git-scm.com/download/win 下载 3. 转载于:https://www.cnblogs.com/0909/p/9956406.html

享元模式-Flyweight(Java实现)

享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, 就到家里的书架上拿, 如果有就直接看, 没有就去买一本, 回家看. 看完了就放到家里…

013.Zabbix的Items(监控项)

一 Items简介 Items是从主机里面获取的所有数据&#xff0c;可以配置获取监控数据的方式、取值的数据类型、获取数值的间隔、历史数据保存时间、趋势数据保存时间、监控key的分组等。通常情况下item由key参数组成&#xff0c;如监控项中需要获取cpu信息&#xff0c;则需要一个对…

算法 --- 记一道面试dp算法题

题目: 给定一个数组(长度大于1),如下 let a [1,4,3,4,5] // 长度不确定,数值为整数要求写一个函数,返回该数组中,除本身数字之外其他元素的成积.即返回如下: // 过程[4*3*4*5, 1*3*4*5, 1*4*4*5, 1*4*3*5, 1*4*3*4] // 结果[240, 60, 80, 60, 48]题目要求不使用除法,且时间…

ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(10)之素材管理

源码下载地址&#xff1a;http://www.yealuo.com/Sccnn/Detail?KeyValuec891ffae-7441-4afb-9a75-c5fe000e3d1c 素材管理模块也是我们这个项目的核心模块&#xff0c;里面的增删查改都跟文章管理模块相同或者相似&#xff0c;唯一不同点可能是对附件的上传处理&#xff0c;但…

Git很简单--图解攻略

Git Git 是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09;作用 源代码管理为什么要进行源代码管理? 方便多人协同开发方便版本控制Git管理源代码特点 1.Git是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交、合并、. 2.Git会在根…

vc/vs开发的应用程序添加dump崩溃日志转

原贴地址&#xff1a;https://blog.csdn.net/wangkui1331/article/details/78029940 vc/vs开发的应用程序出现崩溃的时候&#xff0c;由于没有任何记录&#xff0c;导致开发人员很难追踪&#xff0c;但是添加dump文件后&#xff0c;就可以免除这些烦恼 1.添加方法 &#xff08;…

51 nod 1127最短的包含字符串(尺取法)

1127 最短的包含字符串 收藏关注给出一个字符串&#xff0c;求该字符串的一个子串S&#xff0c;S包含A-Z中的全部字母&#xff0c;并且S是所有符合条件的子串中最短的&#xff0c;输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母&#xff0c;则输出No Solution。Input…

JSON 数据重复 出现$ref

JSONArray 类型 如果我们往里面add数据的时候 如果数据相同&#xff0c;那么就会被替换成 $ref: 也就是被简化了 因为数据一样所直接 指向上一条数据 循环引用&#xff1a;当一个对象包含另一个对象时&#xff0c;fastjson就会把该对象解析成引用。引用是通过$ref标示的&am…

Linux初学时的一些常用命令(4)

1. 磁盘 查看当前磁盘使用情况 df -h查看某个文件大小 du -sh 文件名 如果不输入文件名&#xff0c;默认是当前目录的所有文件之和&#xff0c;即当前目录大小 2. 系统内存 free参数详解&#xff1a;https://blog.csdn.net/loongshawn/article/details/51758116 3. CPU CPU 使用…

爬虫之拉勾网职位获取

重点在于演示urllib.request.Request()请求中各项参数的 书写格式 譬如&#xff1a; url data headers...Demo演示&#xff08;POST请求&#xff09;:import urllib.requestimport urllib.parseimport json, jsonpath, csvurl "https://www.lagou.com/jobs/positionAjax.…

小程序 --- 点击放大功能、获取位置信息、文字样式省略、页面跳转(navigateTo)

1. 点击放大功能的实现 需求: 点击轮播图中的图片会实现放大预览的功能。首先有轮播图的样式如下 <!-- pages/goods_detail/index.wxml --> <!-- 轮播图 --> <view class"detail_swiper"><swiperautoplaycircularindicator-dots><swip…