zoukankan      html  css  js  c++  java
  • codeforces1353D 优先队列

    1353D

    D题解题思路就是利用优先队列模拟过程即可

    只要每次把某一段的起点和终点压入队列,根据段长来排序,一直到处理完所有的点为止

    这里先扩展一下优先队列相关的用法

    定义:priority_queue<Type, Container, Functional>

    Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。

    //升序队列,小顶堆
    priority_queue <int,vector<int>,greater<int> > q;
    //降序队列,大顶堆
    priority_queue <int,vector<int>,less<int> >q;
    
    //greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

    这个题就需要自己重写比较方法,和重写sort的cmp差不多

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #include <stdio.h>
    #include <cmath>
    #include <string.h>
    #include <deque>
    
    using namespace std;
    #define ll long long
    static const int WHITE=0;
    static const int GRAY=1;
    static const int BLACK=2;
    static const int INF=0x3f3f3f3f;
    int gcd(int a,int b){return b == 0 ? a : gcd(b,a%b);}
    int lcm(int a,int b){return a*b/gcd(a,b);}
    ll Pow(ll a,ll b,ll mod){if(b==0) return 1%mod; ll sum=1; a=a%mod; while(b>0) { if(b%2==1) sum=(sum*a)%mod; b/=2; a=(a*a)%mod;}return sum;}
    
    typedef pair<int,int> pos;
    struct cmp
    {
        bool operator()(const pos p1,const pos p2)
        {
            if(p1.second-p1.first==p2.second-p2.first)
            return p1.first>p2.first;
            return p1.second-p1.first<p2.second-p2.first;
        }
    };
    priority_queue<pos,vector<pos>,cmp> que;
    int v[200005];
    int main()
    {
        freopen("C:\Users\16599\Desktop\in.txt","r",stdin);
        int _;
        cin>>_;
        while (_--)
        {
            memset(v,0,sizeof(v));
            int n;
            cin>>n;
            int k=1;
            que.push(make_pair(1,n));
            while(!que.empty())
            {
                pair<int,int> p=que.top();
                que.pop();
                int l=p.first;
                int r=p.second;
                int mid=(l+r)/2;
                v[mid]=k++;
                if(mid-1>=l)
                que.push(make_pair(l,mid-1));
                if(mid+1<=r)
                que.push(make_pair(mid+1,r));
            }
            for(int i=1;i<=n;i++)
            cout<<v[i]<<" ";
            cout<<endl;
        }
        
        return 0;
    }
  • 相关阅读:
    Cocos2d-x 3.0 lua规划 真正的现在Android在响应Home密钥和Back纽带
    SICP 练习 (2.9)解决摘要:宽度和区间运算的关系间隔
    编tuxedo遇到服务问题
    数据库关闭
    三维CAD塑造——基于所述基本数据结构一半欧拉操作模型
    采用proguard困惑android代码
    a中国天气网pi(json格式)
    android 内存优化
    如何获得最近的餐馆谁
    采购入库单已暂估生成凭证,当月后来又收到采购发票,结算后如何处理?
  • 原文地址:https://www.cnblogs.com/zlhdbk/p/12913446.html
Copyright © 2011-2022 走看看