zoukankan      html  css  js  c++  java
  • 题解 P1801 【黑匣子_NOI导刊2010提高(06)】

    我看正解已经有一大堆了,我就发个不太正经的吧


    最近不会高级数据结构的蒟蒻在搞STL,搞完普通平衡树后就看到了这道题,本来想用黑科技pb_ds中的红黑树做的,发现已经有大佬贴了一篇。set的做法也有人发了。

    然后蒟蒻的我又想出一个歪法---暴力模拟!!!


    • 你要知道:

      首先介绍个STL中应该挺少人知道的函数nth_element(),顾名思义,就是求出区间内第n大的元素,搞这道题刚好合适。

    • 使用:

      它的使用也非常方便,直接调用nth_element(pos1,pos2,pos3),

      • 参数介绍:

        pos1是区间的开始位置

        pos2是你要查的元素的在排序后位置,见下面代码实现,一看就懂

        pos3是区间结束的下一个位置

        所以pos1,pos3其实是个左闭右开的区间,如果你不知道这什么意思你就记着pos3是要越界的

    • 其他:

      这个时间复杂度好像是O(NlogN),但是不开O2 有80分,开了O2 90分。
      STL真是个救急的神器,非常适合对拍

      我的代码里还有另一用vector实现方法,但只有50分就不介绍了,有兴趣的可以看一下

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <cctype>
    #pragma GCC optimize(3)
    #define ll int
    using namespace std;
    const int maxn=200010;
    int n,m;
    void print(int x)
    {
        if(x<0){//负数
           putchar('-');
          x=-x;
        }
        if(x>9)  print(x/10);
    	//递归完后栈里面x的每一位是倒过来的
        putchar(x%10+'0');
    }
    ll add[maxn],Get[maxn];
    ll read()
    {
    	ll x=0;char ch;short int neg=0;ch=getchar();
    	while(!isdigit(ch)){
    		neg|=(ch=='-');ch=getchar();
    	}
    	while(isdigit(ch)){
    		x=x*10+ch-48;ch=getchar();
    	}
    	return neg?-x:x;
    }
    void solve_1()
    {
        vector <ll>a;
    	int cnt=1,node=0;
    	cin>>m>>n;
    	for(register int i=1;i<=m;i++)add[i]=read();
    	for(register int i=1;i<=n;i++)Get[i]=read();
    	sort(Get+1,Get+1+n);
    	for(register int i=1;i<=m&&cnt<=n+1;i++)
    	{
    	   ll x=add[i];	   a.insert(upper_bound(a.begin(),a.end(),x),x); 
    	   while(i==Get[cnt]&&cnt<=n+1)
    	   {
               cout<<a[++node-1]<<endl;
    		   cnt++;   	
    	   }
    	}
    }
    void solve_2()
    {
    	int cnt=1,node=0;
    	ll a[maxn];
    	cin>>m>>n;
    	for(register int i=1;i<=m;i++)add[i]=read();
    	for(register int i=1;i<=n;i++)Get[i]=read();
    	sort(Get+1,Get+1+n);	
    	for(register int i=1;i<=m&&cnt<=n+1;i++)
    	{
    	   a[i]=add[i];
    	   while(i==Get[cnt]&&cnt<=n+1)
    	   {
    	   	   nth_element(a+1,a+(++node),a+i+1);
               printf("%d
    ",a[node]);//print(a[node]);putchar('
    ');
    		   cnt++;   	
    	   }
    	}
    }
    int main()
    {
    	//solve_1();
        solve_2();
    	return 0;
    }
    

    感觉这篇题解太水了-逃)

  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/Rye-Catcher/p/8464902.html
Copyright © 2011-2022 走看看