BZOJ2223: [Coci 2009]PATULJCI&&BZOJ3524: [Poi2014]Couriers

自己的智商又不够用了。。。。。

一直错查了一天

发现时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;
}


你可能感兴趣的:(bzoj,主席树)