• 题解 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;
    }
    

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

  • 相关阅读:
    24.纯 CSS 创作出平滑的层叠海浪特效
    23.1纯 CSS 创作一个菜单反色填充特效
    23.纯 CSS 创作一个菜单反色填充特效
    22.纯 CSS 创作出美丽的彩虹条纹文字
    21纯 CSS 创作文本滑动特效的 UI 界面
    BZOJ 2384: [Ceoi2011]Match (KMP,树状数组)
    BZOJ 1511: [POI2006]OKR-Periods of Words KMP
    UOJ #6. 【NOI2014】随机数生成器 贪心
    UOJ #25. 【IOI2014】Wall 线段树
    BZOJ 3670: [Noi2014]动物园 KMP
  • 原文地址:https://www.cnblogs.com/Rye-Catcher/p/8464902.html
Copyright © 2020-2023  润新知