ZROI 2019 寒假省选线下自闭赛2

题目地址

预计&实际得分:$20 + 20 + 40 = 80$

emmmm暴力总算没有写炸了,不过也只会写暴力了。。。



T1:

不会,,打个表$20$分走人



T2:

不会,$N≤3$的时候手算一下,$a_i=a_0$的时候所有的$P_i$都是$\frac{\sqrt{a_0}}{n}$,这样就有$30分$了(考试的时候$N=3$的情况没算出来)



T3:

其实我主要是想写一下这个题。

首先我们$O(n)$枚举一下点,然后我们规定必须要选这个点。

对于其他的点$i$,如果我们要选$i$的话,那么我们肯定要选$i$在两颗子树中的父亲节点。

于是我们连边$i->f_1[i]$和$i->f_2[i]$($f_1[i], f_2[i]$分别表示$i$在两颗树上的父亲)

注意我们这里连的都是有向边

这样问题就变成了:给定一个有向图,其中每个点都有一个权值,选择一个权值和最大的子图,使得每个点的后继都在子图里面。

这其实就是裸的最大权闭合子图问题,用网络流求解即可。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3
  4 const int MAXN = 510;
  5
  6 struct Dinic
  7 {
  8     struct Edge
  9     {
 10         int from, to;
 11         int cap, flow;
 12     };
 13     vector<Edge> edges;
 14     vector<int> G[MAXN];
 15     int n, m, s, t;
 16     bool v[MAXN];
 17     int d[MAXN], cur[MAXN];
 18
 19     void Clear()
 20     {
 21         edges.clear(); m = 0;
 22         for(int i = 0; i < MAXN; ++i) G[i].clear();
 23     }
 24
 25     void add(int from, int to, int cap)
 26     {
 27         edges.push_back((Edge){from, to, cap, 0});
 28         edges.push_back((Edge){to, from, 0, 0});
 29         G[from].push_back(m++);
 30         G[to].push_back(m++);
 31     }
 32
 33     bool bfs()
 34     {
 35         memset(v, 0, sizeof(v));
 36         memset(d, -1, sizeof(d));
 37         queue<int> q; q.push(s);
 38         d[s] = 1; v[s] = 1;
 39         while(!q.empty())
 40         {
 41             int x = q.front(); q.pop();
 42             for(int i = 0; i < (int)G[x].size(); ++i)
 43             {
 44                 Edge e = edges[G[x][i]];
 45                 if(!v[e.to] && e.cap > e.flow)
 46                 {
 47                     v[e.to] = 1;
 48                     d[e.to] = d[x] + 1;
 49                     q.push(e.to);
 50                 }
 51             }
 52         }
 53         return v[t];
 54     }
 55
 56     int DFS(int x, int a)
 57     {
 58         if(x == t || !a) return a;
 59         int flow = 0, f;
 60         for(int& i = cur[x]; i < (int)G[x].size(); ++i)
 61         {
 62             Edge& e = edges[G[x][i]];
 63             if(d[e.to] == d[x] + 1 && (f = DFS(e.to, min(a, e.cap - e.flow))) > 0)
 64             {
 65                 e.flow += f;
 66                 edges[G[x][i] ^ 1].flow -= f;
 67                 flow += f;
 68                 a -= f;
 69                 if(!a) break;
 70             }
 71         }
 72         return flow;
 73     }
 74
 75     int Maxflow()
 76     {
 77         int flow = 0;
 78         while(bfs())
 79         {
 80             memset(cur, 0, sizeof(cur));
 81             flow += DFS(s, 0x7FFFFFFF);
 82         }
 83         return flow;
 84     }
 85 }din;
 86
 87 vector<int> G1[MAXN], G2[MAXN];
 88 int f1[MAXN], f2[MAXN];
 89 int T, n, a[MAXN];
 90
 91 void dfs1(int x, int fa)
 92 {
 93     f1[x] = fa;
 94     for(int i = 0; i < (int)G1[x].size(); ++i)
 95         if(G1[x][i] != fa) dfs1(G1[x][i], x);
 96 }
 97
 98 void dfs2(int x, int fa)
 99 {
100     f2[x] = fa;
101     for(int i = 0; i < (int)G2[x].size(); ++i)
102         if(G2[x][i] != fa) dfs2(G2[x][i], x);
103 }
104
105 void solve()
106 {
107     int sum = 0, ans = 0;
108     for(int i = 1; i <= n; ++i)
109         if(a[i] > 0) sum += a[i];
110     din.s = n + n + 1, din.t = din.s + 1;
111     for(int root = 1; root <= n; ++root)
112     {
113         dfs1(root, 0);
114         dfs2(root, 0);
115         din.Clear();
116         for(int i = 1; i <= n; ++i)
117         {
118             if(a[i] > 0) din.add(din.s, i, a[i]);
119             else din.add(i, din.t, -a[i]);
120             if(f1[i]) din.add(i, f1[i], 0x3f3f3f3f);
121             if(f2[i]) din.add(i, f2[i], 0x3f3f3f3f);
122         }
123         ans = max(ans, sum - din.Maxflow());
124     }
125     printf("%d\n", ans);
126 }
127
128 int main()
129 {
130     scanf("%d", &T);
131     while(T--)
132     {
133         scanf("%d", &n);
134         for(int i = 1; i <= n; ++i)
135         {
136             scanf("%d", &a[i]);
137             G1[i].clear();
138             G2[i].clear();
139         }
140         for(int i = 1, u, v; i < n; ++i)
141         {
142             scanf("%d %d", &u, &v);
143             G1[u].push_back(v);
144             G1[v].push_back(u);
145         }
146         for(int i = 1, u, v; i < n; ++i)
147         {
148             scanf("%d %d", &u, &v);
149             G2[u].push_back(v);
150             G2[v].push_back(u);
151         }
152         solve();
153     }
154     return 0;
155 }

原文地址:https://www.cnblogs.com/Aegir/p/10388157.html

时间: 2024-10-10 08:58:10

ZROI 2019 寒假省选线下自闭赛2的相关文章

IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家,把你的工作当成创业,公司给你提供了可以协作的团队.场所”.责任感程度不同,就有不同的结果.当你认为是别人派给你的活儿时,你也许可以去尽心完成,也或者会放弃.当你把事情当成你对别人的承诺.非你完成不可时,你一定会完成,甚至会有创新,想法设法地做得更好,这就是创造. 站桩练习 活动期间,周老师推荐我带

定义工作,解放自我——IT帮2019年2月线下活动回顾

本次活动是在北京和深圳两个分站同步进行的,IT团建委员会负责策划和组织,北京站由帮主周老师.王兵老师主导,深圳站由副帮主兼深圳站长陈焕老师主导. 活动的主题:定义工作,解放自我 同样的话题,不同的人群,不同的城市,相同的是大家追求进步.不能苟活于人世的渴望和热情!仿佛就是一群来自各行各业的好汉们,为了冲破枷锁,走出迷雾,踏上一条有灯塔指引的人生航船,大家互帮互助,同舟共济,一起奔向快乐.光明的彼岸. 周老师说“公司是没有记忆的,而职业规划是自己的”.公司可以不管我们的职业和人生规划,我们就得自己

ArcEngine下输电线路二三维交互选线

前面输电线路的生成方式前提是实地勘测了杆塔点位,采集了杆塔的坐标,直接导入Excel生成shape文件.现在是做一个输电线路的选址,传统的规划选线作业采用失效性差的纸质地图,造成选线路径方案可行性差,准确性低.应用高分辨率卫星影像和数字高程模型建立三维选线平台以辅助选线并进行杆塔辅助规划,可有效提高线路路径规划的可行性和准确性,节省投资. 基础地理数据主要包括DEM.DOM.DLG,杆塔模型以及其他工程资料.这里条件所限,精度均达不到,只做测试,说明方案的可行性即可. 二维选址场景: 三维选线场

西安活动 | 2019年1月13号 &quot;拥抱开源, 又见.NET&quot; 线下交流活动报名进行中

随着.NET Core的发布和开源,.NET又重新回到人们的视野..NET Core的下个3.0即将release,加入非常多的新功能,越来越拥抱变化,DevOps和Microservice的最佳实践已经在.NET Core落地,比如 Ocelot网关.Grpc+Consul 服务注册发现.Apworks CQRS实现.Xigadee 微服务工具库.脚手架. 西安.NET社区组织发起了此次“拥抱变化, 又见.NET”线下交流活动,邀请了三位资深.NET开发者作为分享讲师,他们将从架构.原理.语言

电商巨头线下实体店成功率分析

日前,有消息传出阿里巴巴将在天津开办第一家实体店,销售的商品非常多样,食品.厨具等都能找到,希望借庞大的实体市场推动进口商品销量,同时为顾客提供更加人性化的购物体验.这是继阿里收购银泰,落地门店服务的又一次动作. 而纯线上平台到线下插一脚的事并不鲜见.2015年,聚美优品在前门大街开设极速免税体验店;亚马逊开设实体体验店;京东先携手便利店,然后入股永辉,强推"京东到家";当当开设实体书店;苏宁旗下的母婴电商红孩子纷纷尝试选址落地-- 尽管电商巨头无一例外开始线下布局,但至今为止,似乎并

2014年第二期人人投线下实体店铺融资对接会

会议主题: 2014年第二期人人投线下实体店铺融资对接会 主办单位: 人人投(北京飞度网络科技有限公司) 会议简介: 应广大投资者要求,人人投将于2014年6月29日下午举办第二期线下实体店铺融资对接会.本次对接会已邀请百余位国内实力派投资人参加,甄选几家有特色.有技术的实体经营店铺,供投资者众筹投资. 人人投倡议更多的人和机构关注线下实体店这一广大群体的投融资模式探索,关注生活服务终端项目的生存.发展.创新!圆创业者梦想,架投资者桥梁,人人投期待您的到来! 会议地点: 中国科技会堂 北京市海淀

“互联网+”时代,线上与线下仍无法互相取代

从18世纪第一次工业革命开始,人类实现了从手工时代向工业时代的转变,它改变了人们生产和生活方式,人类文明从此开始了新的篇章:20世纪50年代,美国科学家为了实现建模,引入了计算机,直到1994年蒂姆?伯纳斯-李万维网的提出,逐步实现了多台计算机的远程连接,自此,人们才开始走进互联的时代. 人们的消费习惯正在发生着迅速的变化. 受智能手机和社交网络.以及信息技术达到了前所未有的水平的影响,人们网络进行购物的人数持续增加.他们对比商品价格.质量.服务.物流选项,并通过在线媒体分享全程网络购物的心得及

微信营销如何与线下资源结合?

营销不是空谈,更不能整天就知道在朋友圈发产品! 微信营销今年逐步降温了,降温的原因,神化的微信营销,效果不可能轻而易举的达到大家的预期,没有耐心的人开始否定微信营销了,影响了做与不做的徘徊者.第三方开发市场垃圾源代码横行,在这个人人都想当皇帝的时代,大批的微信第三方公司因为本身资金.技术实力欠缺,无法进行深度开发来满足市场需求,只能收了一些客户的钱,像流氓一样狠狠离去,并且留下微信营销没法做的言语.微信营销自然降温了,其实这和当年的淘宝情况一样,赚钱的看着你离开偷偷赚的乐. 野蛮生长,粗犷运营

合肥.NET技术社区首次线下聚会全程回顾【多图】

2019年3月16日对于合肥.NET来说是一个特别的日子,因为这是合肥.NET技术社区首次非正式线下聚会!这次聚会受场地限制(毕竟是聚餐的形式),即使换成了小椅子后,最多也只能容纳24个人,所以还有一些小伙伴不能到现场参加,这里对他们说声抱歉,让我们期待下次的聚会吧,下次我们将主要以主题演讲为主,这样不会再受场地的限制来限制参加的人数了.然后让我们先上一张合影感受下现场的氛围吧! 接下来我将对整个过程进行回顾. 作者:依乐祝 原文地址:https://www.cnblogs.com/yilezh