自己的智商又不够用了。。。。。
一直错查了一天
发现时New_Node的时候没有打return。。。。。
这个错误之前做的题目已经出现过很多次了 感觉自己瞬间拉低整条街 智商
很裸的静态区间k大值 用主席树
2223:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<set> using namespace std; set<int>D; char c; bool flag; inline void read(int&a) {a=0,flag=false;do c=getchar();while(c!='-'&&(c<'0'||c>'9'));if(c=='-')c=getchar(),flag=true;while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();if(flag)a=-a;} struct Node { int lc,rc; int sum; }; int Segement_Root[500001]; int data[500001]; int Sorted_data[500001]; Node a[10000010]; int con=10000010; inline int New_Node(){return con--;} int build(int l,int r) { int tp=New_Node(); a[tp].lc=0; a[tp].rc=0; a[tp].sum=0; if(l^r)a[tp].lc=build(l,(l+r)>>1),a[tp].rc=build(((l+r)>>1)+1,r); return tp; } int add(int last,int l,int r,int data) { if(l^r) { int tp=New_Node(); a[tp]=a[last]; if(data<=Sorted_data[(l+r)>>1]) a[tp].lc=add(a[last].lc,l,(l+r)>>1,data); else a[tp].rc=add(a[last].rc,((l+r)>>1)+1,r,data); a[tp].sum++; return tp; } else { int tp; tp=New_Node(); a[tp]=a[last]; a[tp].sum++; return tp; } } void K_th(int rr,int lr,int l,int r,int k) { if(l^r) { if(k>a[rr].sum-a[lr].sum) { puts("no");return;} if(a[a[rr].lc].sum-a[a[lr].lc].sum>=k) { K_th(a[rr].lc,a[lr].lc,l,(l+r)>>1,k);return;} K_th(a[rr].rc,a[lr].rc,((l+r)>>1)+1,r,k); } else if(a[rr].sum-a[lr].sum>=k) printf("yes %d\n",Sorted_data[l]); else puts("no"); } int main() { int n,m; read(n); read(m); for(int i=1;i<=n;i++) read(data[i]),D.insert(data[i]); set<int>::iterator tp; int con=0; for(tp=D.begin();tp!=D.end();tp++) Sorted_data[++con]=*tp; D.clear(); read(m); Segement_Root[0]=build(1,con); for(int i=1;i<=n;i++) Segement_Root[i]=add(Segement_Root[i-1],1,con,data[i]); int l,r,k; while(m--) { read(l),read(r); K_th(Segement_Root[r],Segement_Root[l-1],1,con,((r-l+1)>>1)+1); } return 0; }3524:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<set> #define youhua __attribute__((optimize("O"))) using namespace std; set<int>D; char c; bool flag; youhua inline void read(int&a) {a=0,flag=false;do c=getchar();while(c!='-'&&(c<'0'||c>'9'));if(c=='-')c=getchar(),flag=true;while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();if(flag)a=-a;} struct Node { int lc,rc; int sum; }; int Segement_Root[500001]; int data[500001]; int Sorted_data[500001]; Node a[10000010]; int con=10000010; youhua inline int New_Node(){return con--;} youhua int build(int l,int r) { int tp=New_Node(); a[tp].lc=0; a[tp].rc=0; a[tp].sum=0; if(l^r)a[tp].lc=build(l,(l+r)>>1),a[tp].rc=build(((l+r)>>1)+1,r); return tp; } youhua int add(int last,int l,int r,int data) { if(l^r) { int tp=New_Node(); a[tp]=a[last]; if(data<=Sorted_data[(l+r)>>1]) a[tp].lc=add(a[last].lc,l,(l+r)>>1,data); else a[tp].rc=add(a[last].rc,((l+r)>>1)+1,r,data); a[tp].sum++; return tp; } else { int tp; tp=New_Node(); a[tp]=a[last]; a[tp].sum++; return tp; } } youhua int K_th(int rr,int lr,int l,int r,int k) { if(l^r) { if(k>a[rr].sum-a[lr].sum) return 0; if(a[a[rr].lc].sum-a[a[lr].lc].sum>=k) return K_th(a[rr].lc,a[lr].lc,l,(l+r)>>1,k); return K_th(a[rr].rc,a[lr].rc,((l+r)>>1)+1,r,k); } else if(a[rr].sum-a[lr].sum>=k) return Sorted_data[l]; return 0; } youhua int main() { int n,m; read(n); read(m); for(int i=1;i<=n;i++) read(data[i]),D.insert(data[i]); set<int>::iterator tp; int con=0; for(tp=D.begin();tp!=D.end();tp++) Sorted_data[++con]=*tp; D.clear(); Segement_Root[0]=build(1,con); for(int i=1;i<=n;i++) Segement_Root[i]=add(Segement_Root[i-1],1,con,data[i]); int l,r,k; while(m--) { read(l),read(r); printf("%d\n",K_th(Segement_Root[r],Segement_Root[l-1],1,con,((r-l+1)>>1)+1)); } return 0; }