2018 ACM-ICPC青岛现场赛 B题 Kawa Exam 题解 ZOJ 4059

题意:
BaoBao正在进行在线考试(都是选择题),每个题都有唯一的一个正确答案,但是考试系统有m个bug(就是有m个限制),每个bug表示为第u个问题和第v个问题你必须选择相同的选项,题目问你,如果你修好了第i个bug,BaoBao最高可以取得多少分。

题目数量1e5
BUG数量1e5(真多)
答案范围1e5

思路:首先,如果出现了bug,导致{a1,a2,...,an}n个题目必须选择一样的结果,那么最高得分肯定是众数的出现次数。我们发现bug是具有传递性的,如果bug连成了一个环,而且你只修复其中一个bug,那么这个bug的修复是对整个考试系统是没有任何影响的,所以我们不需要考虑这个环内的边,然后我们可以把这些环抠出来,缩成一个点,具体的缩点方法很多,也可以把整个块拉成一条链或者拓扑排序弄一弄,或者tarjan缩一下,我是用tarjan缩点的,这样整个图就是一个树了。
现在修一个bug就相当于断了一条边,一棵树就被切成两半了,我们需要同时得到两边的众数的个数是多少,这时候就有一个算法叫dsu on tree了,这是一个复杂度十分科学的暴力算法,http://codeforces.com/problemset/problem/600/E 这个题是一个dsu on tree的裸题,就是让你求每个子树的众数,不会这个算法的可以去学一下,做完这个题你就发现你会做子树内众数的个数了,现在还有个问题,子树外的怎么求呢?我们可以反过来做,一开始把所有的节点加进贡献里面去,然后dsu on tree的时候,询问子树众数的添加删除的时候,我们只要做相反的操作就行了。

具体细节还挺多的。

 

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn = 100010;struct Edge {
  4     int to,next,id;
  5     Edge(int _to=0,int _next=-1,int _id=0):to(_to),next(_next),id(_id) {};
  6 } edge[maxn*2];
  7 int head[maxn],etot;
  8 inline void addedge(int u,int v,int id) {
  9     edge[++etot]=Edge(v,head[u],id);
 10     head[u]=etot;
 11 }
 12 vector<int> nodes[maxn];
 13 int Cnt;
 14 int dfn[maxn],low[maxn],tot;
 15 bool Vis[maxn];
 16 int S[maxn],top;
 17 int id[maxn];
 18 void tarjan(int x,int fa) {
 19     low[x]=dfn[x]=++tot;
 20     S[++top]=x;
 21     Vis[x]=1;
 22     for(register int i=head[x]; ~i; i=edge[i].next) {
 23         int v=edge[i].to;
 24         if(v==fa) {fa=0;continue;}
 25         if(!dfn[v]) {
 26             tarjan(v,x);
 27             low[x]=min(low[x],low[v]);
 28         } else if(Vis[v])
 29             low[x]=min(low[x],dfn[v]);
 30     }
 31     if(low[x]==dfn[x]) {
 32         Cnt++;
 33         while(1) {
 34             int now=S[top--];
 35             Vis[now]=0;
 36             id[now]=Cnt;
 37             nodes[Cnt].push_back(now);
 38             if(now==x) break;
 39         }
 40     }
 41 }
 42 int a[maxn],ans[maxn];
 43 vector<int>v[maxn];
 44 vector<int>edg[maxn],eid[maxn];
 45 int summ;
 46 bool vis[maxn];
 47 int sz[maxn],son[maxn];
 48 vector<int>vv;
 49 int getid(int x) {
 50     return lower_bound(vv.begin(),vv.end(),x)-vv.begin()+1;
 51 }
 52 void init(int now,int pre=-1){
 53     vis[now]=1;
 54     sz[now]=v[now].size();
 55     for(int it:v[now])vv.push_back(a[it]);
 56     for(int to:edg[now]){
 57         if(to==pre)continue;
 58         init(to,now);
 59         sz[now]+=sz[to];
 60         if(!son[now]||sz[to]>sz[son[now]])
 61             son[now]=to;
 62     }
 63 }
 64 int tp[maxn],tp2[maxn],cnt[maxn],cnt2[maxn],Max=0,Max2=0;
 65 bool big[maxn];
 66 void update(int nows,int pre,int val){
 67     for(int now:v[nows]){
 68         tp[cnt[a[now]]]--;
 69         cnt[a[now]]+=val;
 70         tp[cnt[a[now]]]++;
 71         if(cnt[a[now]]>Max)
 72             Max=cnt[a[now]];
 73         if(!tp[Max])Max--;
 74         tp2[cnt2[a[now]]]--;
 75         cnt2[a[now]]-=val;
 76         tp2[cnt2[a[now]]]++;
 77         if(cnt2[a[now]]>Max2)
 78             Max2=cnt2[a[now]];
 79         if(!tp2[Max2])Max2--;
 80     }
 81     for(int to:edg[nows])
 82         if(to!=pre&&big[to]==0)
 83             update(to,nows,val);
 84 }
 85 void update2(int nows,int pre,int val){
 86     for(int now:v[nows]){
 87         tp2[cnt2[a[now]]]--;
 88         cnt2[a[now]]+=val;
 89         tp2[cnt2[a[now]]]++;
 90         if(cnt2[a[now]]>Max2)
 91             Max2=cnt2[a[now]];
 92         if(!tp2[Max2])Max2--;
 93     }
 94 }
 95 int temp;
 96 void dfs(int now,int pre=-1,int kep=0,int id=0){
 97     int tid=0;
 98     for(register int i=0;i<edg[now].size();i++){
 99         int to=edg[now][i];
100         if(to==son[now])tid=eid[now][i];
101         if(to==pre||to==son[now])continue;
102         dfs(to,now,0,eid[now][i]);
103     }
104     if(son[now])
105         dfs(son[now],now,1,tid),big[son[now]]=1;
106     update(now,pre,1);
107     ans[id]=Max+Max2-temp;
108     big[son[now]]=0;
109     if(!kep)update(now,pre,-1);
110 }
111 void init2(int now,int pre=-1){
112     for(int it:v[now])a[it]=getid(a[it]);
113     update2(now,0,1);
114     for(int to:edg[now]){
115         if(to==pre)continue;
116         init2(to,now);
117     }
118 }
119 void solve(int now){
120     vv.clear();
121     init(now);
122     for(register int i=0;i<=sz[now];i++)tp[i]=tp2[i]=cnt[i]=cnt2[i]=big[i]=0;Max=Max2=0;
123     sort(vv.begin(),vv.end());
124     vv.erase(unique(vv.begin(),vv.end()),vv.end());
125     init2(now);
126     summ+=Max2;
127     temp=Max2;
128     dfs(now);
129 }
130 int main()
131 {
132     int T;
133     scanf("%d",&T);
134     while(T--){
135         int n,m;
136         scanf("%d%d",&n,&m);
137         for(register int i=1;i<=n;i++)head[i]=-1,dfn[i]=son[i]=vis[i]=Vis[i]=0,v[i].clear(),edg[i].clear(),eid[i].clear();
138         etot=tot=Cnt=top=0;
139         for(register int i=1;i<=n;i++)scanf("%d",a+i);
140         for(register int i=1;i<=m;i++){
141             int u,v;
142             scanf("%d%d",&u,&v);
143             addedge(v,u,i);
144             addedge(u,v,i);
145         }
146         for(register int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
147         for(register int i=1;i<=n;i++)v[id[i]].push_back(i);
148         summ=0;
149         for(register int i=1;i<=n;i++){
150             for(register int j=head[i];~j;j=edge[j].next){
151                 int u=id[i],to=id[edge[j].to];
152                 if(u==to){
153                     ans[edge[j].id]=0;
154                     continue;
155                 }
156                 edg[u].push_back(to);eid[u].push_back(edge[j].id);
157             }
158         }
159         for(register int i=1;i<=Cnt;i++)
160             if(!vis[i])
161                 solve(i);
162         for(register int i=1;i<=m;i++){
163             if(i>1)putchar(' ');
164             printf("%d",ans[i]+summ);
165         }
166         puts("");
167     }
168     return 0;
169 }

 

转载于:https://www.cnblogs.com/xseventh/p/9986194.html

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

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

相关文章

[css] 举例说明微信端兼容问题有哪些?

[css] 举例说明微信端兼容问题有哪些&#xff1f; 说一个微信小程序的iPhoneX适配吧&#xff0c; 因为iPhoneX底部没有虚拟按键&#xff0c;底部的横线会出现遮挡这时候就要处理下&#xff1a; 大概思路就是获取到客户端设备&#xff0c;然后判断是iPhoneX就换样式。 在app.js…

多线程创建方式 线程池、Future和CompletableFuture

大家好&#xff0c;我是烤鸭&#xff1a; 今天说一下 多线程的几种创建方式及使用。 1. Thread 和 Runnable 继承 Thread 类 和实现 Runnable 接口。 这种就不举例子了。 2.线程池 现在主要有5种线程池。 //缓存线程池ExecutorService cachedThreadPool Executors.newCa…

[css] 你有没有自己写过一套UI库?说下遇到哪些难点?

[css] 你有没有自己写过一套UI库&#xff1f;说下遇到哪些难点&#xff1f; 维护过&#xff0c;碰到的坑主要是 1&#xff09;同一个UI component在不同地方使用的customization问题。 2&#xff09;还有如果UI component如果有bug的话会导致所有使用的地方都出现bug 3&#x…

权限设计文章汇总

如何设计网站权限系统&#xff1f; https://www.zhihu.com/question/20313385/answer/118095995 我的转载&#xff1a;https://www.cnblogs.com/hao-1234-1234/p/9850967.html 应用程序权限设计 http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permiss…

dubbo 整合 zipkin,最简单的方式,亲测有效

大家好&#xff0c;我是烤鸭。 之前也试过网上很多版本&#xff0c;看了好多文章。现在分享最简单的方式&#xff0c;代码侵入性最小的。 1. 修改pom,引入jar。 <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency><…

[css] 说说你对GPU的理解,举例说明哪些元素能触发GPU硬件加速?

[css] 说说你对GPU的理解&#xff0c;举例说明哪些元素能触发GPU硬件加速&#xff1f; GPU: 图形处理器,用于处理图形有关的任务,用于渲染页面在css中使用 transform: translateZ(0),可以开启GPU硬件加速个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

@Retention 注解的作用

注解Retention可以用来修饰注解&#xff0c;是注解的注解&#xff0c;称为元注解。Retention注解有一个属性value&#xff0c;是RetentionPolicy类型的&#xff0c;Enum RetentionPolicy是一个枚举类型&#xff0c;这个枚举决定了Retention注解应该如何去保持&#xff0c;也可理…

fastjson 1.2 版本之前的bug, 反序列化时自动排序,导致签名不过

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一个问题&#xff0c;使用fastjson 导致签名不过。 1. 问题复现&#xff1a; fastjson 1.2.4 获取返回值&#xff1a; {"data":[{"id":"120190422110857284042111114","bankAccountTyp…

[css] 你知道CSS中的字母“C“代表什么吗?

[css] 你知道CSS中的字母"C"代表什么吗&#xff1f; CSS(Cascading Style Sheets)。"C" 即为 Cascading 层叠的意思&#xff0c;我们编写 CSS 的时候&#xff0c;写在后面的样式会覆盖前面的样式即层叠。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流…

[Network Architecture]DPN(Dual Path Network)算法详解(转)

https://blog.csdn.net/u014380165/article/details/75676216 论文&#xff1a;Dual Path Networks 论文链接&#xff1a;https://arxiv.org/abs/1707.01629 代码&#xff1a;https://github.com/cypw/DPNs MXNet框架下可训练模型的DPN代码&#xff1a;https://github.com/m…

[css] 怎么自定义鼠标指针的图案?

[css] 怎么自定义鼠标指针的图案&#xff1f; cursor: url() ,auto url是自定义光标图案的绝对路径&#xff0c;auto是默认光标&#xff0c;当我们自定义的光标不起作用时&#xff0c;就用默认光标代替。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

javax.script.ScriptException: ReferenceError: xxx is not defined in eval

大家好&#xff0c;我是烤鸭&#xff1a; 今天使用 javax.script.ScriptEngine 遇到一个奇怪的问题&#xff0c;无法识别js方法。 1. 报错内容&#xff1a; javax.script.ScriptException: ReferenceError: "a" is not defined in <eval> at line number…

Python的特殊成员

Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格&#xff1a;避免用下划线作为变量名的开始。 现在我们来总结下所有的系统定义属性和方法&#xff0c; 先来看下保留属性&#…

[css] Reset CSS和Normalize CSS的区别是什么?

[css] Reset CSS和Normalize CSS的区别是什么&#xff1f; Reset&#xff1a;将所有浏览器的默认样式都统一化&#xff0c;注重的是跨浏览器统一样式&#xff0c;用户还要自行添加一些默认样式。 Normalize&#xff1a;会根据各个浏览器的不同保留有用的浏览器特色样式&#x…

java 实现 常见排序算法(四)基数排序

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下基础排序算法之基数排序。 1. 基数排序&#xff1a; 原理&#xff1a;基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#…

vyos User Guide

vyos User Guide 来源 https://wiki.vyos.net/wiki/User_Guide The VyOS User Guide is focused on providing a general overview of the installation, configuration, and operation of the VyOS network operating system. Introduction VyOS is a Linux-based network ope…

[css] 为什么要使用css sprites?

[css] 为什么要使用css sprites&#xff1f; 减少HTTP请求增加图片显示速度个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Java 面试题(3)—— JVM

JVM的内存结构。 JVM主要结构&#xff1a;堆内存、栈、方法区&#xff0c;程序计数器&#xff0c;永久代&#xff09;&#xff08;jdk 8采用元空间替代&#xff09;。 堆内存又分成年轻代和年老代。 年轻代由三部分组成&#xff0c;Eden、From Survivor 和 To Survivor&#xf…

[css] 标签、class和id选择器三者的区别是什么?分别在什么时候用?

[css] 标签、class和id选择器三者的区别是什么&#xff1f;分别在什么时候用&#xff1f; 标签选择器&#xff1a;tag{} 选取对应的标签例如 a span div class选择器&#xff1a;.class-name{} 选取对应class-name的元素 id选择器&#xff1a;#id-name{} 选取对应id的元素 其中…

web前端开发怎么样学习?看这份web前端学习路线

前端开发是创建Web页面或app等前端界面呈现给用户的过程。前端开发通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互。它从网页制作演变而来&#xff0c;名称上有很明显的时代特征。在互联网的演化进程中…