题意: 有n个数据中心,m个客户,每天有h个小时,其中 n,m,h<=100000.每个数据中心i每天都会有一个数据维护的时间0<=u[i]<=h-1,在数据中心维护期间时不可以使用的.每个客户都选择两个不同的数据中心,以保证每天的数据使用不间断.保证初始时符合要求.找出最少的数据中心数,使每个数据中心的维护时间推迟一个小时(若u[i]<h-1推迟一小时变为u[i]+1,否则变为0),每个客户都能正常使用. 分析: 我们发现,只要每个客户选择的两个数据中心的维护时间不同就符合题目的…
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…
题 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\): 如果调整其中任何一个的时间不会导致与另外一个产生冲突,就说明…
题目: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…
题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条件,若$(w_x+1)\bmod h=w_y$,连上$x->y$:若$(w_y+1)\bmod h=w_x$,连上$y->x$.一条边的含义是,若起点加一,终点也要加一.缩点,强连通分量内的点要一起加.发现答案就是找最小的没有出边的点 卡点:无 C++ Code: #include <cst…
若推迟 \(u\) 必推迟 \(v\),则连边 <\(u,v\)>. 求强联通分量后缩点,答案显然是出度为 \(0\) 且 size 最小的 scc. #include <iostream> #include <cstdio> using namespace std; int n, m, h, a[100005], dfn[100005], uu, vv, loo[100005], bel[100005], scc, hav[100005], sta[100005],…
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…
首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推迟的,scc内点数为新图点权 根据贪心的思想,在缩完点的DAG里,一定是出度为0的点能获得更小的值,因为出度不为零的点还要加上出边所能到的点的点权 直接在出度为0的点里取min,然后记一下更新答案的新点,最后把属于这个新点的点的编号输出即可 #include<iostream> #include&…