zoukankan      html  css  js  c++  java
  • 【Codeforces 356A】Knight Tournament

    【链接】 我是链接,点我呀:)
    【题意】

    n个人矩形m场比赛 每场比赛由编号为li~ri且之前没有被淘汰的人进行。 已知第i场的winner是xi winner会把这一场其他所有的人都淘汰。 问你n个人每个人都是被谁给淘汰的. 【题解】 并查集 初始条件f[i] = i,nex[i] = i + 1; 每一轮战斗,让输的人的f[find_father(i)]变成x[i] 但是在执行f[find_father(i)]=x[i]的时候 我们要记录一下ans[find_father(i)] = x[i] 因为到最后并查集经过路径压缩以后,就没有明显的主从关系了 之后,让li~ri里面的每个nex[i]都等于r[i]+1(要先记录下nex[i]再改变nex[i],因为i需要跳到nex[i],进而继续将li~ri这个区间里面的nex[i]都指向r[i]+1,以及进行 合并操作,把对应区间的子winner指向新winner,记录ans值)就好 这样从左到右枚举的时候就会跳过败者了(只会通过find_father(i)找到这一棵子树的根) 最后输出ans[]就好 注意ans[i]=i的话 那个人是最后的winner

    【代码】

    import java.io.*;
    import java.util.*;
    
    public class Main {
        
        
        static InputReader in;
        static PrintWriter out;
            
        public static void main(String[] args) throws IOException{
            //InputStream ins = new FileInputStream("E:\rush.txt");
            InputStream ins = System.in;
            in = new InputReader(ins);
            out = new PrintWriter(System.out);
            //code start from here
            new Task().solve(in, out);
            out.close();
        }
        
        static int N = (int)3e5;
        static class Task{
            int n,m;
            int nex[],f[],ans[];
            
            int ff(int x) {
            	if (x==f[x]) return x;
            	else {
            		f[x] = ff(f[x]);
            		return f[x];
            	}
            }
            
            public void solve(InputReader in,PrintWriter out) {
            	nex = new int[N+10];f = new int[N+10];ans = new int[N+10];
            	for (int i = 1;i <= N;i++) {
            		nex[i] = i + 1;
            		f[i] = i;
            	}
            	n = in.nextInt();m = in.nextInt();
            	for (int i = 1;i <= m;i++) {
            		int li,ri,xi;
            		li = in.nextInt();ri = in.nextInt();xi = in.nextInt();
            		for (int j = li;j <= ri;) {
            			int fa = ff(j);
            			f[fa] = xi;
            			ans[fa] = xi;
            			int temp = nex[j];
            			nex[j] = ri+1;
            			j = temp;
            		}
            	}
            	for (int i = 1;i <= n;i++) {
            		if (ans[i]==i)
            			out.print(0);
            		else
            			out.print(ans[i]);
            		out.print(" ");
            	}
            }
        }
    
        
    
        static class InputReader{
            public BufferedReader br;
            public StringTokenizer tokenizer;
            
            public InputReader(InputStream ins) {
                br = new BufferedReader(new InputStreamReader(ins));
                tokenizer = null;
            }
            
            public String next(){
                while (tokenizer==null || !tokenizer.hasMoreTokens()) {
                    try {
                    tokenizer = new StringTokenizer(br.readLine());
                    }catch(IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                return tokenizer.nextToken();
            }
             
            public int nextInt() {
                return Integer.parseInt(next());
            } 
        }
    }
    
  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10457118.html
Copyright © 2011-2022 走看看