日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2761

發(fā)布時間:2025/7/25 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2761 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/* 換一種更高效的方法。之前的方法之所以超時,是因為找第K大數(shù)的方法很慢。 查找第K大,可以利用樹狀數(shù)組和二分的方法,二分答案,然后樹狀數(shù)組高效回答這個答案是否靠譜 很多細(xì)節(jié)需要注意,WA,TLE N多 */// include file #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <ctime>#include <iostream> #include <sstream> #include <fstream> #include <iomanip> #include <bitset>#include <algorithm> #include <string> #include <vector> #include <queue> #include <set> #include <list> #include <functional>using namespace std;// typedef typedef long long LL; typedef unsigned long long ULL;// #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout)#define Z(a) (a<<1) #define Y(a) (a>>1)const double eps = 1e-6; const double INFf = 1e100; const int INFi = 1000000000; const LL INFll = (LL)1<<62; const double Pi = acos(-1.0);template<class T> inline T sqr(T a){return a*a;} template<class T> inline T TMAX(T x,T y) {if(x>y) return x;return y; } template<class T> inline T TMIN(T x,T y) {if(x<y) return x;return y; } template<class T> inline T MMAX(T x,T y,T z) {return TMAX(TMAX(x,y),z); } template<class T> inline T MMIN(T x,T y,T z) {return TMIN(TMIN(x,y),z); } template<class T> inline void SWAP(T &x,T &y) {T t = x;x = y;y = t; }// code begin int N,M; //100000 50000 struct node {int v;int dx;friend bool operator<(node a,node b){return a.v<b.v;} }; node data[100010]; int dx[100010]; //離散化后的結(jié)果 int rdx[100010]; // 反映射struct range {int l;int r;int k;int dx;friend bool operator<(range a,range b){return a.l< b.l;} }; range rg[50011]; //區(qū)間不交集 int ans[50011];int Bit[100010]; int Nx;inline int lowBit(int x) {return x&(-x); }void update(int x,int c) {for(int i=x;i<Nx;i+=lowBit(i)){Bit[i] += c;} }int getSum(int x) {int sum = 0;for(int i=x;i>0;i-=lowBit(i)){sum += Bit[i];}return sum ; }int main() {read;write;while(scanf("%d %d",&N,&M)==2){for(int i=1;i<=N;i++){scanf("%d",&data[i].v);data[i].dx = i;}for(int i=1;i<=M;i++){scanf("%d %d %d",&rg[i].l,&rg[i].r,&rg[i].k);rg[i].dx = i;}sort(data+1,data+N+1); //排序是為了重新編號Nx = 1;for(int i=1;i<=N;i++) //在這里相同的數(shù)也算兩個{rdx[Nx] = data[i].v;dx[data[i].dx] = Nx++;}// 離散完成了// 由于區(qū)間不重疊,所以對區(qū)間排序sort(rg+1,rg+M+1);// int l,r,mid,tmp;memset(Bit,0,sizeof(Bit));for(int i=1;i<=M;i++){//memset(Bit,0,sizeof(Bit)); 為了避免這個費事的初始化if(i>1) for(int j=rg[i-1].l;j<=rg[i-1].r&&j<rg[i].l;j++){update(dx[j],-1);}for(int j=i>1?(rg[i].l>rg[i-1].r?rg[i].l:(rg[i-1].r+1)):rg[i].l;j<=rg[i].r;j++) //這里出錯很久,千萬不要想當(dāng)然{//printf("%d ",dx[j]);update(dx[j],1);}//printf("\n");// 二分答案l = 1;r = Nx;while(l<r){mid = Y(l+r);tmp = getSum(mid);if(tmp>=rg[i].k) {r = mid;}else{l = mid+1;}}ans[rg[i].dx] = rdx[r];}for(int i=1;i<=M;i++){printf("%d\n",ans[i]);}}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/ac2012/archive/2011/04/14/2015946.html

總結(jié)

以上是生活随笔為你收集整理的2761的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。