2 条题解

  • 0
    @ 2025-10-8 17:07:37
    #include<bits/stdc++.h>
    using namespace std;
    const int N=110000;
    int n,a[N];double ansand,ansor,ansxor;
    
    void solve(int k)
    {
    	int last[2]={0,0},c1=0,c2=0;
    	//last[0]为[1~r]最后一个0的位置,last[1]同理
    	//c1记录从r-1 前,第 1、3、5……段的总度
    	//c2记录从r-1 前,第 2、4、6……段的总度
    	//每一段以1结尾,前面都是0,可以是0个0 
    
    	double p=double(1<<k)/n/n;
    	for(int r=1;r<=n;r++)
    	{
    		int v=(a[r]>>k) & 1;
    		//长度为1的情况 
    		if(v){ansxor+=p;ansand+=p;ansor+=p;} 
    		//长度大于1的情况 
    		if(v)
    		{
    			ansand+=p*(r-last[0] -1)*2;
    			ansor+=p*(r-0 -1)*2;
    			ansxor+=p*c1*2;
    		}
    		else
    		{
    			ansand+=0;
    			ansor+=p*last[1]*2;
    			ansxor+=p*c2*2;
    		}
    		
    		c1++; if(v)swap(c1,c2);
    		last[v]=r;
    	}
    }
    int main()
    {
        scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	ansand=ansor=ansxor=0.0;
    	for(int k=0;k<=30;k++) solve(k);
    	
    	printf("%.3lf %.3lf %.3lf\n",ansxor,ansand,ansor);
        
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:07:24
      #include<bits/stdc++.h>
      using namespace std;
      const int N=110000;
      int n,a[N];double ansand,ansor,ansxor;
      
      void solve(int k)
      {
      	int last[2]={0,0},c1=0,c2=0;
      	//last[0]为[1~r]最后一个0的位置,last[1]同理
      	//c1记录从r-1 前,第 1、3、5……段的总度
      	//c2记录从r-1 前,第 2、4、6……段的总度
      	//每一段以1结尾,前面都是0,可以是0个0 
      
      	double p=double(1<<k)/n/n;
      	for(int r=1;r<=n;r++)
      	{
      		int v=(a[r]>>k) & 1;
      		//长度为1的情况 
      		if(v){ansxor+=p;ansand+=p;ansor+=p;} 
      		//长度大于1的情况 
      		if(v)
      		{
      			ansand+=p*(r-last[0] -1)*2;
      			ansor+=p*(r-0 -1)*2;
      			ansxor+=p*c1*2;
      		}
      		else
      		{
      			ansand+=0;
      			ansor+=p*last[1]*2;
      			ansxor+=p*c2*2;
      		}
      		
      		c1++; if(v)swap(c1,c2);
      		last[v]=r;
      	}
      }
      int main()
      {
          scanf("%d",&n);
      	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
      	ansand=ansor=ansxor=0.0;
      	for(int k=0;k<=30;k++) solve(k);
      	
      	printf("%.3lf %.3lf %.3lf\n",ansxor,ansand,ansor);
          
          return 0;
      }
      • 1

      E40_1*【概率DP:求期望】Rainbow的信号

      信息

      ID
      4719
      时间
      1000ms
      内存
      128MiB
      难度
      10
      标签
      递交数
      3
      已通过
      2
      上传者