2019 ICPC 南昌 Winner

题目链接:https://nanti.jisuanke.com/t/40259

题意:n个人在三种模式下举行party,每种模式下会有不同的能力值,主持人可以任意指定两个人,并能任意指定模式让该二人PK,能力值低的退场,最后一个人便是胜者

题目要求任意询问一个人,判断其是否有可能是胜者。

分析:我们可以在三种模式下分别排序,得到一个排名,然后建边,输家指向赢家,将三种模式下建的边加在一起建一个图,从每个模式下排名第一的人开始dfs(排名第一的人是一定有机会赢的,而能赢排名第一的人也一定有机会赢,我们建的边是输指向赢,则排名第一的人指向的人必定都有机会赢,这样不断dfs)

另外,在建图时,head数组next数组是非常常见的,前者是以该顶点为起点的第一条边,后者是与该边同起点的下一条边。

PS:正解其实不是DFS,是Tarjan,但我目前不知道咋用Tarjan写。。。。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+7;
const ll inf=1e18+7;
const double pi=acos(-1);
struct edge{
    int to,next;
}ed[3*maxn];

struct node{
    int v,id;
    bool operator <(const node& x) const{
        return v>x.v;
    }
}a[maxn];

int head[maxn],mark[maxn],ans[4],cnt;

void addedge(int u,int v){
    ed[++cnt].to=v;
    ed[cnt].next=head[u];
    head[u]=cnt;
}

void dfs(int x){
    mark[x]=1;
    for(int i=head[x];i;i=ed[i].next){
        int v=ed[i].to;
        if(!mark[v]) dfs(v);
    }
}

int main(){
    int n,q;scanf("%d%d",&n,&q);
    for(int x=1;x<=3;x++){
        for(int i=1;i<=n;i++)scanf("%d",&a[i].v),a[i].id=i;
        sort(a+1,a+n+1);
        ans[x]=a[1].id;//这种模式下最大的是肯定可以的
        for(int i=1;i<n;i++) addedge(a[i+1].id,a[i].id);
    }//cout<<233<<endl;
    for(int x=1;x<=3;x++) dfs(ans[x]);
    for(int i=0;i<q;i++){
        int x;scanf("%d",&x);
        if(mark[x]) puts("YES");
        else puts("NO");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/qingjiuling/p/11234478.html

时间: 2024-08-10 15:31:30

2019 ICPC 南昌 Winner的相关文章

2019 ICPC 南昌网络赛

2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 // 史上排名最高一次,开场不到两小时队友各A一题加水题共四题,排名瞬间升至三四十名 // 然后后三小时就自闭了,一题都没有突破...最后排名211 hhhh ? ? B. Fire-Fighting Hero 题意 队友做的,待补. ? AC代码 #include<cstdio> #includ

2019 ICPC南昌邀请赛比赛过程及题解

解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M题(shl的电脑终于打开了,然后输入密码,密码错误...自闭),说AC 自动机板题,然后找板子,,,突然发现自己读错题目.后来不知道怎么A的.shl copy了一遍密码终于登上账号.然后lfw一个人用单调栈A掉了I题:byf 秒了H题: shl和byf读j题,读完吧题意告诉lfw,lfw说水题,然后

2019 ICPC 南昌网络赛 - Subsequence (子串判断,预处理,超时)

?? ?? ?? 题意:一个字符串s,t个字符串p,判断p是不是s的子序列 预处理出对于字符串s,每个位置i之后第一个字母x的位置,匹配子序列的时候就相当于在母串上往后跳,如果跳到母串末尾,子序列还没有结束,匹配失败. 然而!超时了QAQ,只能过八组样例,网上也只能找到过九组的,,,希望有哪位大神路过指点一下了 int tag[33],nxt[MAXN][30]; char s[MAXN],p[MAXN]; void init() { int n=strlen(s); for(int j=0;j

2019 ICPC 南昌网络赛 - Max answer (区间和,区间最值)

?? ???? 题意:价值 = 区间和 × 区间最小值,求数组的子区间的最大价值 (1)区间和---->前缀和 (2)O(n^2) 枚举区间 ---> O( n ) 枚举元素,根据当前元素查询相应区间和 对每个元素,维护他作为最小值的左右端点,枚举数组中的元素,该元素大于0为例,查找( i , r [ i ] )的前缀和最大值,( l [ i ] - 1 , i - 1 )的前缀和最小值,注意这里 l [ i ] -1 可能会小于1 ,ST表应从0开始维护 丧心病狂的压行QWQ ll a[MA

icpc南昌邀请赛 比赛总结

上周末,我参加了icpc南昌区域赛邀请赛,这也是我的第一次外出参赛. 星期五晚上,在6个小时的火车和1个小时的公交后,我们终于抵达了江西师范大学,这次的比赛场地.江西师范大学周围的设施很齐全,各种烧烤,大型商场,地铁应有尽有,去酒店办好入住手续,放下东西后,我们便去吃饭,听说南昌的小龙虾很不错,我们就选择了一家烧烤店吃起了烧烤.还是很高兴的,就是因为吃太多了晚上睡不着有点休息不好. 第二天早上,大家都起到很晚,我9点钟醒时还没有人醒,等到10:30我们一起去签到,收获了自己的第一件参赛衣服,同时

2019 ICPC Malaysia National G(拓扑排序)

2019 ICPC Malaysia National G 有点绕,两层拓扑排序. 有空再补详细. 甚至有点丑,因为绕,为了区分,当时变量名写得很长. #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<vector> #define debug printf("!") using namespace std; type

2019 ICPC Malaysia National F(状态压缩)

2019 ICPC Malaysia National F 赛后补题.看了这个题解,说是状态压缩. 以第一行的士兵为主,第二行士兵为次,即,第二行被第一行士兵匹配,更新第一行士兵的状态. 用当前第i个士兵的状态更新第i+1个士兵的状态. f[i][j]:i为士兵的下标,j为第i个士兵的状态.(1<j<(1<<(e*2+1))). 比如e=3,二进制 j=1000011,表示第i个士兵之前包括第i个士兵,在[i-3,i+3]范围内,第二行的士兵已被匹配了下标为i-3,i+2,i+3的

2019年ICPC南昌网络赛 J. Distance on the tree 树链剖分+主席树

边权转点权,每次遍历到下一个点,把走个这条边的权值加入主席树中即可. #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; const int maxx = 2e5+10; struct node{ int l,r,cnt; }tree[maxx*40]; int head[maxx],rk[maxx],siz[maxx

2019 ICPC Malaysia National H题

题意:给定n个点,求出这些点构成的凸包,然后逆时针输出,另外还有q次询问,每次询问一个点是否在凸包里. 题解:二维凸包裸题,直接利用叉积判断点是否在凸包内即可,时间复杂度n2,不知为何这题给了15s,然后我代码只跑了15ms #include <bits/stdc++.h> using namespace std; double eps=1e-15; double pi=acos(-1); struct Point{ double x,y; Point(double x=0,double y=