zoukankan      html  css  js  c++  java
  • 【VK Cup 2015

    【题目链接】:http://codeforces.com/problemset/problem/566/D

    【题意】

    给你n个人;
    一开始每个人都隶属于一个部门;
    之后给你q个操作;
    3种操作类型;
    1.把x和y所在的部门的所有人都并在一个新的部门
    2.把x..y这个区间范围里面的人所在的部门的所有人都并在一个部门;
    3.查询x和y是否在同一个部门;

    【题解】

    并查集;
    这里把x..y并在一起;
    相当于有y-x个合并操作
    ①for (int i = x+1;i<=y;i++) merge(i-1,i);
    而且显然这个合并操作是不可逆的,合并了就不会改变
    这样我们就能找到节省时间的策略;
    即如果下次又进行了这个2操作;
    且又到了x这个人,则我们可以跳过x+1..y这一段人的①操作
    且进行过①操作之后
    无论进行到x+1..y中的哪一个人,下一个进行merge(i,i-1)的都可以直接跳到y+1那个人;
    用一个nex数组记录某个人合并完之后要跳到哪一个操作就好;
    这样就能解决这个2操作了;
    而对于1操作,直接合并就是了;

    【Number Of WA

    1

    【反思】

    cin,cout是真的慢…
    1个WA是判断写错了。。
    下次测试的时候要把所有的操作都试一遍。
    尝试从暴力算法中找到优化的方案。

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 2e5;
    
    int n,q,f[N+100],nex[N+100];
    
    int ff(int x){
        if (f[x]==x)
            return x;
        else
            return f[x] = ff(f[x]);
    }
    
    void hebing(int x,int y){
        for (int i = x+1;i <= y; ){
            int r1 = ff(i),r2 = ff(i-1);
            if (r1!=r2){
                f[r1] = r2;
            }
            int temp = nex[i];
            nex[i] = nex[y];
            i = temp;
        }
    }
    
    int main(){
        //Open();
        Close();
        cin >> n >> q;
        rep1(i,1,n)
            f[i] = i,nex[i] = i + 1;
        rep1(i,1,q){
            int x,y,z;
            cin >> x >> y >> z;
            if (x == 3){
                if (ff(y)!= ff(z)){
                    cout << "NO" << endl;
                }else{
                    cout << "YES" << endl;
                }
            }else if (x==1){
                        int r1 = ff(y),r2 = ff(z);
                        if (r1!=r2)
                            f[r1] = r2;
                    }else
                        hebing(y,z);
        }
        return 0;
    }
  • 相关阅读:
    工厂设计模式
    Java 注解 (Annotation)你可以这样学
    java的多线程和并发库
    NIO高并发基础
    Java编写画图板程序细节-保存已画图形
    程序员必须知道的知识
    慢慢读懂经济【持续更新】-经济浅谈
    Spring IOC与AOP的简单实现
    Python网络爬虫【持续更新】-BeautifulSoup库的使用
    Python网络爬虫【持续更新】-requests库的使用
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626216.html
Copyright © 2011-2022 走看看