杭州邀请赛再现~~~

总结:1、实力弱成渣,2、配合还不够~~3、水题正确率不够高~~

A:概率水题~~~暴力搞搞~~(队友看完没有想法,当时正在想B,就木有去看~~后来队友说了下题意,感觉纯暴力就能裸过~~)

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cctype>
#include <ctime>

#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <stack>

#define SQR(x) ((x)*(x))
#define rep(i, n) for (int i=0; i<(n); ++i)
#define repd(i,n)  for(int i=1;i<=(n);++i)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define reps(i, a, b) for (int i=(a); i>=(b); --i)
#define PB push_back
#define MP(A, B) make_pair(A, B)
#define pow2(n) (1<<(n))
#define pi acos(-1)
#define eps 0.00000001
#define lg(n) log10((n)*1.0)
#define MaxN  1000000
#define mod 10e+7
#define ll long long
#define typed int
using namespace std;
void data(){
   freopen("data3.out","r",stdin);
   freopen("data.out","w",stdout);
}
#define len ((1<<21)+100)

double ans[len]; 
double p[210],q[210];

int main(){
    //data();
   int n,m,l,r;
   while(~scanf("%d%d%d%d",&n,&m,&l,&r)&&n){
      repf(i,0,n){q[i]=0;p[i]=0;}
      int k;
      p[0]=1;
      rep(i,m){
	   scanf("%d",&k);	
	   rep(j,n)	     
	  	{ 
          if(p[j]-0<eps)continue; 		  				 
		  q[(j+k)%n]+=p[j]*0.5;
		  q[(j-k+n)%n]+=p[j]*0.5; 		   
	    }
	    rep(j,n){p[j]=q[j];q[j]=0.0;} 
      }
      double sum=0;
      repf(i,l-1,r-1)   sum+=p[i];             
      printf("%.4lf\n",sum);  
   }
   return 0;
}

  

B:java大数+数学(比赛的时候没能想起出正解~~~噢活~~弱者为何要战斗~~~渣)

C:裸的线段树

3种操作,1种查询~~~区间赋值,区间加上一个值,区间每个元素乘以一个值~~查询区间的p次方的和(p=1,2,3);

p只有1,2,3~~维护区间的3个和就好了~~延迟标记(加法与惩罚冲突),强制向下标记(如果操作的区间存在延迟标记的话);

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cctype>
#include <ctime>

#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <stack>

#define SQR(x) ((x)*(x))
#define rep(i, n) for (int i=0; i<(n); ++i)
#define repd(i,n)  for(int i=1;i<=(n);++i)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define reps(i, a, b) for (int i=(a); i>=(b); --i)
#define PB push_back
#define MP(A, B) make_pair(A, B)
#define pow2(n) (1<<(n))
#define pi acos(-1)
#define eps 0.00000001
#define lg(n) log10((n)*1.0)
#define MaxN  1000000
#define mod 10007
#define mod2 1000000009
#define mod3 1000007
#define inf 2147483647
#define inf2 0x7fffffffffffffff
#define ll long long
#define lson(i) ((i)<<1)
#define rson(i) ((i)<<1|1)
#define typed int
using namespace std;
void data(){
   freopen("data.in","r",stdin);
   freopen("data.out","w",stdout);
}
struct Tree{
   int l,r;
   int mark;
   int val;
   int s1,s2,s3;
};
Tree T[(MaxN<<2)+10];
//初始化 
void init(int i,int l,int r){
     T[i].l=l;T[i].r=r;T[i].mark=1;
     T[i].s1=0;T[i].s2=0;T[i].s3=0;
     T[i].val=0;
     if(l!=r){
 		  int mid=(l+r)/2;
          init(lson(i),l,mid);
     	  init(rson(i),mid+1,r);
     }
}
//计算1,2,3次方和 
void cnt(int id,int k){
    int len =(T[id].r-T[id].l + 1);
	T[id].s1 = k * len % mod;
    T[id].s2 = ((k * k)%mod) * len %mod;
	T[id].s3 = ((k * k )%mod *k)%mod*len%mod; 
}
//向下延迟标记 
void pushdown(int id){
	if(T[id].mark){  
        T[lson(id)].val=T[rson(id)].val=T[id].val%mod;
		cnt(lson(id),T[id].val%mod);
		cnt(rson(id),T[id].val%mod);
		
		T[lson(id)].mark = T[rson(id)].mark = T[id].mark;
		T[id].mark=0;
	} 
}
//更新到父亲节点 
void pushup(int id){
    T[id].s1=T[lson(id)].s1 + T[rson(id)].s1;
	T[id].s2=T[lson(id)].s2 + T[rson(id)].s2;
	T[id].s3=T[lson(id)].s3 + T[rson(id)].s3; 
}
/*
 * root:根节点,l:更新左区间,r:右区间,
 *c:更新值,p:操作(0:赋值,1:加,2:乘) 
 */
void update(int root,int l,int r,int c,int p){
     if(T[root].mark||!p) 	 
	 if(l<=T[root].l&&r>=T[root].r){
         if(!p)T[root].mark=1;
		 if(p==0) T[root].val=c;   
		 else if(p==1)  T[root].val+=c;
		 else T[root].val*=c;
		 T[root].val%=mod;
		 cnt(root,T[root].val);    
		 return ;
	 }
     pushdown(root);
     int mid=(T[root].l+T[root].r)/2;
	 if(l <= mid) update(lson(root),l,r,c,p);
	 if(r > mid)  update(rson(root),l,r,c,p); 	 
	 pushup(root);
}
//查询区间p次方和 
int qurry(int root,int l,int r,int p){
     
	 if(T[root].mark){
       if(l<=T[root].l&&r>=T[root].r){
           if(p==1) return T[root].s1;
           if(p==2) return T[root].s2;
           if(p==3) return T[root].s3;
	   } 
	 }
	 if(T[root].mark)pushdown(root);
     int mid=(T[root].l+T[root].r)/2;
	 if(r <= mid) return  qurry(lson(root),l,r,p);
	 if(l > mid)  return qurry(rson(root),l,r,p); 
	 return  (qurry(lson(root),l,r,p)+qurry(rson(root),l,r,p))%mod;
	 pushup(root);
}
void show(int n){
    repf(i,1,(n<<2)){
	   cout<<i<<" "<<T[i].l<<"  "<<T[i].r<<"  "<<T[i].mark<<"  "<<T[i].val;
	   cout<<"  "<<T[i].s1<<"  "<<T[i].s2<<"  "<<T[i].s3<<endl; 				   
    } 
}
int main(){
   //data();	
   int  n,m; 
   int k,x,y,c;
   while(~scanf("%d%d",&n,&m)&n){
       init(1,1,n);
   	   rep(i,m){
			scanf("%d%d%d%d",&k,&x,&y,&c);      
         	if(k==4)printf("%d\n",(qurry(1,x,y,c)+mod)%mod);
         	else  update(1,x,y,c,k%3);
           //show(n);
       }          
   }
   return 0;
}

  

I:水题,队友水过~~~

J:树状数组或者STL乱搞~~队友写STL挂掉了。。。结果是第一次固定的输出没对~~居然样例没过都能交了。。ORz,而且没人发现~~~而且导致我重写树状数组想复杂了写的很糟糕~~中间浪费大堆时间~~~比赛结束查队友代码,发现bug时候各种Orz~~~

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cctype>
#include <ctime>

#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <stack>

#define SQR(x) ((x)*(x))
#define rep(i, n) for (int i=0; i<(n); ++i)
#define repd(i,n)  for(int i=1;i<=(n);++i)
#define repf(i, a, b) for (int i=(a); i<=(b); ++i)
#define reps(i, a, b) for (int i=(a); i>=(b); --i)
#define PB push_back
#define MP(A, B) make_pair(A, B)
#define pow2(n) (1<<(n))
#define pi acos(-1)
#define eps 0.00000001
#define lg(n) log10((n)*1.0)
#define MaxN  100000
#define mod 1000000007
#define mod2 1000000009
#define mod3 1000007
#define inf 2147483647
#define inf2 0x7fffffffffffffff
#define ll long long
#define typed int
using namespace std;
void data(){
   freopen("data.in","r",stdin);
   freopen("data.out","w",stdout);
}
struct point{
   int id;	   
   int k;
   int g;
};
int hashg[MaxN+10];
int hashk[MaxN+10];
point p[MaxN+100];
int c[MaxN+10],n;
bool cmp(point a,point b){
   return a.g<b.g;
}
bool cmp2(point a,point b){
   return a.id<b.id;
}
void hsp(){
   rep(i,n){
      hashg[i+1]=p[i].g;
      p[i].g=i+1;
      hashk[i+1]=p[i].id;
   }  
      hashg[n+1] = 1000000000;
      hashk[n+1] = n+1;
}

int Lowbit(int t) 
{ 
    return (t & ( -t )); 
} 
int Sum(int end) 
{ 
    int sum = 0; 
    while(end > 0) 
    { 
        sum += c[end]; 
        end -= Lowbit(end); 
    } 
    return sum; 
} 


int bitsearch(int n,int key)
{
    
int min=0,max=n+1,mid;
while(min<max){
  mid=(min+max)/2; 
  int cnt=Sum(mid);
  if(key>cnt)min=mid+1;
  else max=mid;
 
}
return min;
}

void plus2(int pos,int num) 
{ 
    while(pos <= n) 
    { 
          c[pos] += num; 
          pos += Lowbit(pos); 
    } 
}
int bit1(int l,int r,int key){
    while(l<r){
       int mid=(l+r)/2;
       int t=Sum(mid);
       if(t>key) r=mid-1;
	   else if(t<key) l=mid+1;
	   else r=mid;  
	}
	return l;
}
int bit2(int l,int r,int key){
    while(l<r){
       int mid=(l+r)/2;
       int t=Sum(mid);
       if(t>key) r=mid;
	   else  l=mid+1; 
	}
	return l;
}
int main(){
    //data();
    while(~scanf("%d",&n)&&n){
        memset(c,0,sizeof(c));
        rep(i,n){scanf("%d%d",&p[i].k,&p[i].g);p[i].id=i;}
        sort(p,p+n,cmp);
        hsp();
        sort(p,p+n,cmp2);
        plus2(p[0].g,1);
        int q=n,ans;
        n=n+1;
        plus2(n,1);
        printf("%d %d\n",p[hashk[p[0].g]].k,1);
        p[n].k=1;p[n].g=n;
        repf(i,1,q-1){
            int k1=bit1(0,n,Sum(p[i].g));
            plus2(p[i].g,1);
            int k2=bit2(1,n,Sum(p[i].g));
            if(k1==0) ans=p[hashk[k2]].k;  
           
            else{
            if(abs(hashg[p[hashk[k1]].g]-hashg[p[i].g])<abs(hashg[p[hashk[k2]].g]-hashg[p[i].g]))
            { 
			  	 ans=p[hashk[k1]].k;															 
			 }else if(abs(hashg[p[hashk[k1]].g]-hashg[p[i].g])>abs(hashg[p[hashk[k2]].g]-hashg[p[i].g])){
	             ans=p[hashk[k2]].k;
			 }else{
	              if((hashg[p[hashk[k1]].g])<(hashg[p[hashk[k2]].g]))
	                ans=p[hashk[k1]].k;
	              else
				    ans=p[hashk[k2]].k;  
			 }
			 }
            
          //  cout<<k1<<"  "<<k2<<"  "<<hashg[k1]<<"  "<<hashg[k2]<<endl;
          //  cout<<"ans: "<<p[hashk[k1]].k<<"  "<<p[hashk[k2]].k<<endl;
         	printf("%d %d\n",p[i].k,ans);
		}
	}

   return 0;
}

  

posted @ 2013-08-11 00:42  UnkelTao  阅读(144)  评论(0编辑  收藏  举报