首页 > 其他分享 >2021 Hubei Provincial Collegiate Programming Contest E. Revue

2021 Hubei Provincial Collegiate Programming Contest E. Revue

时间:2024-11-16 22:40:49浏览次数:1  
标签:Provincial ch Contest Revue max int 初始 define

题目描述

n个人,每个人的初始分数不同(具体分数未知)

有m次已知的Revue(按顺序发生),每次Revue形式为(x,y),意为x打败y,之后x的分变成二者max,y变成min

现在你要按顺序在最后加入w次Revue,要保证 在所有m+w次Revue中删掉任意k(k给出)次Revue后 的 所有初始分数的可能中,1都能获得最大分值

最小化w,当w<=1000时输出方案

n,m,k<=1e6

题解

顶级思维题

实际不需要关心其他的分数,只要考虑max最后能否到1上就行

问题等价于:两个人博弈,人A加入w次操作,之后另一个人B确定max位置,同时尽可能删操作使max到不了1
(你只能决定加操作,max位置、删哪些都决定不了,所以不妨设另一个人B来按最优方式干扰你)

假设max位置在x,B删f[x]次操作就可以阻止max到A,当f[x]<=K时你只要加入K+1-f[x]个(1,x)的Revue就可以使max在x时合法,对每个x加边即可保证所有情况合法

现在问题变成了求f[x],修正/严谨一下f[x]的定义,f[x]表示在当前的Revue序列下,要让max最终留在x的最小删次数(这里的最小是所有初始max位置情况的最小)

那么f[x]初始为0(max就在x),之后每加入一个Revue(x,y)时,对于x来说,多了用f[y]次操作让max留在y,然后利用最后/新加的Revue(x,y)把max移到x,所以f[x]←max(f[x],f[y]);
同时,y如果要把max留在y,那么多了这个Revue(x,y)必删,所以f[y]←f[y]+1

然后做完了,f[x]求出后直接构造就行,还是当f[x]<=K时加K+1-f[x]次Revue
这样当B想初始把max放到合适位置,然后删f[x]次操作后到x时,要额外多删K+1-f[x]次;做不到,所以合法

code

#include <bits/stdc++.h>
#define fo(a,b,c) for (int a=b; a<=c; a++)
#define fd(a,b,c) for (int a=b; a>=c; a--)
#define ll long long
//#define file
using namespace std;

const int N=1e6+10;
int n,m,K,T;
int f[N];

char ch;
int Read()
{
	int x=0;
	ch=getchar();
	while (!(ch>='0' && ch<='9')) ch=getchar();
	while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}

void solve()
{
	n=Read(),m=Read(),K=Read();
    fo(i,1,m)
    {
    	int x,y;
    	x=Read(),y=Read();
		f[x]=min(f[x],f[y]);
		++f[y];
	}
	
	ll w=0;
	fo(i,2,n) if (f[i]<=K) w+=K+1-f[i];
	
	printf("%lld\n",w);
	if (w<=1000)
	{
		fo(i,2,n)
		if (f[i]<=K)
		{
			fo(j,1,K+1-f[i])
			printf("%d %d\n",1,i);
		}
	}
}

int main()
{
//	freopen("E.in","r",stdin);
//	#ifdef file
//	freopen("a.out","w",stdout);
//	#endif

    T=1;
    //scanf("%d",&T);
    for (;T;--T) solve();

    return 0;
}

标签:Provincial,ch,Contest,Revue,max,int,初始,define
From: https://www.cnblogs.com/gmh77/p/18550020

相关文章

  • 2021 Hubei Provincial Collegiate Programming Contest/2021湖北省赛 题解
    按解决顺序排列目录FAIDHECKJGBF二分答案ans,放最小的前ans个bi(变成必须放完)因为bi=2^k,所以小的放了可能会拆散大的空间,大的把小的地方占了的话小的可以塞其他地方,所以先放大的然后暴力能放则放,最多log次指针回到开头所以一次求解O(nlogn),总复杂度log^2A模拟,暴力枚举暴力异......
  • AtCoder Beginner Contest 380
    A-123233题意给个\(6\)位数,判断是否是\(1\)个\(1\),\(2\)个\(2\),\(3\)个\(3\)。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ s......
  • AtCoder Grand Contests 杂做
    感觉AGC003及以前的题做了大部分,所以从AGC004开始,选一些我觉得合适的题做。AGC004E-*3200一直在往静态的几何(或者代数)限制想,结果没想到可以动态规划。为了更加直观可以看作出口在移动,然后到过的点加分,某些出界的点就被ban掉了。我们可以直接考虑定义\(f_{l,r,u,d}\)......
  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • The 2024 ICPC Asia Nanjing Regional Contest
    Preface因为最近大家都有考试啥的,实在太久没训练了,只好在成都到郑州的火车上VP了一场顶着喧闹的车厢以及电脑只能放在腿上打的巨大Debuff,成功打出7题巨大罚时不过可惜的是4h后就没出题了,剩下的C,F瞪了半天是一个不会,甚至赛后看C的题解也搞不明白,只能说计数苦手是这......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......
  • AtCoder Beginner Contest 379
    省流版A.模拟即可B.贪心,有\(k\)个就吃,模拟即可C.维护已经有棋子的格子,有多个棋子往右推,代价等差数列求和,模拟即可D.注意到植物高度=当前天-种植天,维护植物的种植天然后二分找对应高度的植物即可E.考虑最终答案每一个数位的值,然后处理进位即可F.单调栈处理建筑\(r\)......
  • Atcoder Beginner Contest 379 (A-F)
    AtcoderBeginnerContest379(A-F)题目链接A-Cyclic#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){chara,b,c;cin>>a>>b>>c;cout<<b<<c<<a<<""<......
  • AtCoder Beginner Contest 353 - VP 记录
    Preface这次比赛蛮简单的,就是黄题有点多,少了区分度。而且SigmaProblemAnotherSigmaProblemYetAnotherSigmaProblem是什么奇妙的题目名称?SigmaProblemAnotherSigmaProblemYetAnotherSigmaProblem\(\texttt{\scriptsizeYet\footnotesizeA......
  • AtCoder Beginner Contest 378 题解
    AtCoderBeginnerContest378题解比赛链接A-Pairing贪心#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){vector<int>a(5);for(inti=0;i<4;i++){intx;cin>>x;a[x]++;......