Codeforces 950.E Data Center Maintenance】的更多相关文章

E. Data Center Maintenance time limit per test 1 second memory limit per test 512 megabytes input standard input output standard output BigData Inc. is a corporation that has n data centers indexed from 1 to n that are located all over the world. The…
http://codeforces.com/contest/950/problem/E 贴一份板子 #include<cstdio> #include<vector> #include<algorithm> using namespace std; struct E { int to,nxt; }e[]; ],ne,a[],sccc,sccnum[],top,dfn[],low[],dfsc; ],n,m,h,ou[],anss=0x3f3f3f3f,ans1; vec…
题 OvO http://codeforces.com/contest/949/problem/C codeforces 949C 950E 解 建图,记原图为 G1,缩点,记缩完点后的新图为G2 缩完点后的图 G2 必定无环,求这个无环图 G2 中每个点的入度, 找出 的那些点,记这些点的集合为 S,然后把 S 中这些点映射到 G1 中,则这些点各自对应一个点集.S 的各点中,对应的最小集合即为所求集合 #include <iostream> #include <cstring>…
tarjan 题意: 有n个数据维护中心,每个在h小时中需要1个小时维护,有m个雇主,他们的中心分别为c1,c2,要求这两个数据中心不能同时维护. 现在要挑出一个数据中心的子集,把他们的维护时间都推后一个小时.问最小推几个?   建图,如果对于一个顾客,两个数据维护中心维护时间正好差一个小时,那么前者向后者连一条边.在一个强连通分量里面的所有点必须选..如果有连向其他的强连通分量,那么那个也必须选,这种情况肯定不是最优,所以舍弃所有有出度的强连通分量.   tarjan缩点,然后判一判. #in…
题目链接 题意 有\(n\)个信息中心,每个信息中心都有自己的维护时间\((0\leq t\lt h)\),在这个时刻里面的信息不能被获得. 每个用户的数据都有两份备份,放在两个相异的信息中心(维护时间也相异). 现要挑选出信息中心的一个尽量小的子集,使得将这个子集的维护时间向后推移一个小时后,不会导致问题(存在一个用户,其数据所在的两个信息中心维护时间相同). 思路 强连通分量 考虑每个用户的信息存放的两个信息中心,\(u,v\): 如果调整其中任何一个的时间不会导致与另外一个产生冲突,就说明…
首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推迟的,scc内点数为新图点权 根据贪心的思想,在缩完点的DAG里,一定是出度为0的点能获得更小的值,因为出度不为零的点还要加上出边所能到的点的点权 直接在出度为0的点里取min,然后记一下更新答案的新点,最后把属于这个新点的点的编号输出即可 #include<iostream> #include&…
题意 : 给出 n 个点,每个点有一个维护时间 a[i].m 个条件,每个条件有2个点(x,y)且 a[x] != a[y].选择最少的 k (最少一个)个点,使其值加1后,m个条件仍成立. 分析 :  发现改变某些数加一后可能产生联动效应 换句话说就是改变某些数则必须改变另一些数来维持 m 个条件的成立 这个可以用图来表示,对于给出来的每一个 (x, y) 如果改变 x 后等于 y 则连 x => y 边 表示要改变 x 则必须改变 y,然后对于 y 进行同样的判断是否连边 最后建完图后,若有…
难度系数:1900 graphs 题意:有 n 个银行,m 个客户,每个客户都把自己的资料放在 2 个银行,一天总共有 h 小时,每个银行每天都要维护一小时,这一小时内银行无法工作,但是这一小时客户仍然可以在另一个银行提取资料,于是客户就可以一天 h 小时随时提取资料.现在要选择 k 个银行进行实验,每个进行实验的银行,它每天的维护时间都推迟一小时,如果原来的维护时间是 h−1 时,进行实验后银行的维护时间就为 0 时.问最少选择几个银行(至少一个)进行实验,才能仍然保证每一个客户随时都能提取到…
题目:http://codeforces.com/contest/949/problem/C 可以想到可能是每组c有连边的可能. 但别直接给c1.c2连边,那样之后会变得很不好做. 可以把一些限制放在连边这个环节上. 也就是只有(c1+1)%h==c2才从c1向c2连边表示选了c1必须选c2!c2向c1也是一样. 然后缩个点找无出度的最小的点就行了. 边注意开成两倍——一组c也可能连两条边,%2之类的. #include<iostream> #include<cstdio> #in…
题目:http://codeforces.com/contest/949/problem/C 把一个点指向修改它会影响到的点就可以做了: 有取模,所以多出一些要注意的地方,首先是可能出现环,所以需要 tarjan 求边双: 其次,边集数组的大小应该开成两倍,因为取模可能导致一对 ci 互相连边: 然后找出不影响别的点的.最小的边双,输出即可: 而我竟然把 tarjan 都少写了一个 top-- !真是对自己无语了... 代码如下: #include<iostream> #include<…