当前位置: 首页 > news >正文

20180824Noip模拟赛10分总结

 

嗯,总之,是我太傻了。

我真傻,真的,我单知道最小生成树,却不知道还有最大生成树

T1

最大生成树....

累加每一个环内,最大生成树的边权,(对环求最大生成树,则必然剩下一个边权最小的边(因为是求生成树,所以这个边肯定不会被算上))

然后因为对于不同联通块,跑最大生成树,彼此之间依旧无法有想连接的边,所以对于森林跑最大生成树是没有问题的

最后所有边的边权和 减去 所有联通块的最大生成树的边权和 即可得到答案

最小生成树性质之一:最大边权最小

最大生成树性质之一:最小边权最大

 

最后是吐槽:我写了4kb的dfs,疯狂地dfs,使用各种奇奇怪怪的操作,并且计算的复杂度是允许的!最后好不容易调过了样例

最后因为数组开的太大,直接MLE,连正确性都不知道....

AC代码如下:

 1 #include<bits/stdc++.h>
 2 #define uint unsigned int
 3 using namespace std;
 4 const int maxn = 10086;
 5 const int maxm = 50010;
 6 struct shiki {
 7     int x, y; 
 8     double val;
 9 }e[maxm << 1];
10 struct enkidu {
11     int x, y;
12 }a[maxn];
13 int lin[maxn], len = 0;
14 int fa[maxn];
15 double num, need;
16 int n, m;
17 
18 inline int read() {
19     int x = 0, y = 1;
20     char ch = getchar();
21     while(!isdigit(ch)) {
22         if(ch == '-') y =-1;
23         ch = getchar();
24     }
25     while(isdigit(ch)) {
26         x = (x << 1) + (x << 3) + ch - '0';
27         ch = getchar();
28     }
29     return x * y;
30 }
31 
32 inline bool cmp(shiki x, shiki y) {
33 return x.val > y.val;}
34 
35 inline double dis_val(int x, int y) {
36     int x1 = a[x].x, y1 = a[x].y, x2 = a[y].x, y2 = a[y].y;
37     return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
38 }
39 
40 int getfather(int x) {
41     if(x == fa[x]) return x;
42     return fa[x] = getfather(fa[x]);
43 }
44 
45 int main() {
46 //    freopen("plan.in", "r", stdin);
47 //    freopen("plan.out", "w", stdout);
48     n = read(), m = read();
49     for(register uint i = 1; i <= n; ++i)
50         a[i].x = read(), a[i].y = read();
51     for(register uint i = 1; i <= m; ++i) {
52         e[i].x = read(), e[i].y = read();
53         e[i].val = dis_val(e[i].x, e[i].y);
54     }
55     for(register uint i = 1; i <= n; ++i) fa[i] = i;
56     sort(e + 1, e + m + 1, cmp);
57     for(register uint i = 1; i <= m; ++i) {
58         int u = getfather(e[i].x);
59         int v = getfather(e[i].y);
60         num += sqrt(e[i].val);
61         if(u == v) continue;    
62         fa[u] = v;
63         need += sqrt(e[i].val);
64     }
65     printf("%0.9lf", num - need);
66 //    fclose(stdin);
67 //    fclose(stdout);
68     return 0;
69 }

T2

我T1为了完成sb的4kb的超暴力搜索,花费了差不多2个小时的时间,然后看到这道题后,我一眼以为是一个博弈论...

然后我又想了想,觉得自己的题意好像出锅了....

然后就按照贪心思想完成了一个dfs,最后贪心顺利骗到10分...

Dp
题意:
最优策略指:差值最大

因为我们在某个位置选或是不选由[i+1, i+m]中的状态推导来的,也就是说,我们要保证下一个人取得是最优策略。

但是我们正序进行的话,我们无法保证当前状态是最优策略,所以我们倒序进行

划分阶段:
以进行每个点i为阶段
f[i]表示,在当前回合,选择数ai时,所能得到的最大得分
添加状态

正常操作:
f[i][0]表示到第i个数时,该棋子为大魔王选时,你的得分减去大魔王的得分
f[i][1]表示到第i个数时,该棋子为你选时,你的得分减去大魔王的得分
f[i][0] = max{f[k][1]} - a[i]
f[i][1] = min{f[k][0]} + a[i]
也就是说要维护f[k][1]和f[k][0]在[i-m, i-1]的单调性

倒序与第一题一样

优化1:空间优化
假定第ai个数必须取,f[i]表示若选择一定选择第ai个数,当前的人和对方的最大差值
因为每个人都取最优策略,所以选择第ai个数我们能够得到的分数是
f[i] = ai - max{f[j]}(j ∈ [i+1, i+m])
可得方程f[i] = ai - max{f[j]}(j ∈ [i+1, i+m])

因为f[j]是对方的最大差值,我们选择了a[i],则我们要计算自己的得分,就要用a[i] - max{f[j]}

优化2:时间优化:
(1)单调队列维护单调性:好写,代码量小
(2)线段树取区间最大值,正常操作,显然

 1 #include<bits/stdc++.h>
 2 #define uint unsigned int
 3 #define ll long long
 4 using namespace std;
 5 const int maxn = 100086;
 6 int q[maxn];
 7 int f[maxn];
 8 int n, m;
 9 int a[maxn];
10 int l = 1, r = 0;
11 int ans = -1999999999;
12 
13 inline int read() {
14     int x = 0, y = 1;
15     char ch = getchar();
16     while(!isdigit(ch)) {
17         if(ch == '-') y = -1;
18         ch = getchar();
19     }
20     while(isdigit(ch)) {
21         x = (x << 1) + (x << 3) + ch - '0';
22         ch = getchar();
23     }
24     return x * y;
25 }
26 
27 int main() {
28 //    freopen("game.in", "r", stdin);
29 //    freopen("game.out", "w", stdout);
30     n = read(), m = read();
31     for(register uint i = 1; i <= n; ++i) a[i] = read();
32     f[n] = a[n];
33     q[++r] = n;
34     for(register uint i = n - 1; i >= 1; --i) {
35         while(l <= r && q[l] > i + m) l++;
36         f[i] = a[i] - f[q[l]];
37         while(l <= r && f[q[r]] < f[i]) r--;
38         q[++r] = i;
39     }
40     for(register uint i = 1; i <= m; ++i) 
41         ans = max(ans, f[i]);
42     cout << ans << '\n' << -ans << '\n';
43 //    fclose(stdin);
44 //    fclose(stdout);
45     return 0;
46 }

T3

 

 不得不说,样例就是sb,我最初以为是只能从根节点出发

然后我就写了个树Dp的暴力,然后就爆0了

后来才知道,是求的直径.....

暴力思路:

对于每一次询问,都手动封点,求树的直径

能拿50%的分

正解思路:不会,回来补吧....

 

转载于:https://www.cnblogs.com/ywjblog/p/9532006.html

相关文章:

  • jquery 取id模糊查询
  • DBA:快速了解MySQL及语法
  • 回顾·数据分析的势道术
  • WPF中ListBox滚动时的缓动效果
  • MySQL事务
  • javaOOM该分析dump文件而不是看异常log日志原因
  • DNS 工作原理是什么,域名劫持、域名欺骗、域名污染又是什么
  • NOIP2011DAY1T3 Mayan游戏
  • 1109 Group Photo
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1...
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 串口发送数据速度
  • Lsb图片隐写
  • react-native-echarts 在手机上 图表出现滚动条解决方法
  • Python利用Selenium自动登录掘金
  • 分享一款快速APP功能测试工具
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Cookie 在前端中的实践
  • JavaScript-Array类型
  • js如何打印object对象
  • Meteor的表单提交:Form
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • VUE es6技巧写法(持续更新中~~~)
  • Xmanager 远程桌面 CentOS 7
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 力扣(LeetCode)357
  • 软件开发学习的5大技巧,你知道吗?
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 自动记录MySQL慢查询快照脚本
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • #pragma multi_compile #pragma shader_feature
  • #Z0458. 树的中心2
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (初研) Sentence-embedding fine-tune notebook
  • (多级缓存)多级缓存
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (全注解开发)学习Spring-MVC的第三天
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原創) 物件導向與老子思想 (OO)
  • (转)四层和七层负载均衡的区别
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***监测系统的构建(chkrootkit )
  • .Mobi域名介绍
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 6 集成和使用 mongodb
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • @Autowired @Resource @Qualifier的区别
  • [ IO.File ] FileSystemWatcher
  • [1204 寻找子串位置] 解题报告
  • [22]. 括号生成
  • [BeginCTF]真龙之力