Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

RE代码 求找错

Posted by suyang16 at 2014-11-29 11:21:11 on Problem 2777
#include <cstdlib>
#include <iostream>

using namespace std;

int n,len=1;

struct _tree
{
	int left,right,cnt,lazy;
};

_tree t[3000000];

void init()
{
	while(len<n)
		len*=2;
	for(int i=len;i<len+n;i++)
	{
		t[i].left=t[i].right=i-len+1;
		t[i].cnt=1;
	}
	for(int i=len+n;i<=2*len;i++)
		t[i].left=t[i].right=i-len+1;
	for(int i=len-1;i>=1;i--)
	{
		t[i].left=t[2*i].left;
		t[i].right=t[2*i+1].right;
		t[i].cnt=t[2*i].cnt|t[2*i+1].cnt;
	}
}

void change(int id,int left,int right,int c)
{
	int tmp;
	if(t[id].left==left&&t[id].right==right)
	{
		t[id].lazy=1;
		t[id].cnt=1<<(c-1);
		tmp=id/2;
		while(tmp!=0)
		{
			t[tmp].cnt=t[2*tmp].cnt|t[2*tmp+1].cnt;
			tmp/=2;
		}
		return;
	}
	if(t[id].lazy!=0)
	{
		t[2*id].lazy=t[2*id+1].lazy=1;
		t[2*id].cnt=t[2*id+1].cnt=t[id].cnt;
		t[id].cnt=0;
		t[id].lazy=0;
	}
	if(t[2*id].right>=right)
		change(2*id,left,right,c);
	else if(t[2*id+1].left<=left)
		change(2*id+1,left,right,c);
	else
	{
		change(2*id,left,t[2*id].right,c);
		change(2*id+1,t[2*id+1].left,right,c);
	}
}

int query(int id,int left,int right)
{
	if(t[id].left==left&&t[id].right==right)
		return t[id].cnt;
	if(t[id].lazy!=0)
	{
		t[2*id].lazy=t[2*id+1].lazy=1;
		t[2*id].cnt=t[2*id+1].cnt=t[id].cnt;
		t[id].cnt=0;
		t[id].lazy=0;
	}
	if(t[2*id].right>=right)
		return query(2*id,left,right);
	else if(t[2*id+1].left>=left)
		return query(2*id+1,left,right);
	else
		return query(2*id,left,t[2*id].right)|query(2*id+1,t[2*id+1].left,right);
}

int cnt(int x)
{
	int sum=0;
	while(x!=0)
	{
		if(x%2==1)
			sum++;
		x/=2;
	}
	return sum;
}

int main(int argc, char* argv[])
{
	ios::sync_with_stdio(false);
	int a,t;
	char x;
	int y,z,l;
	cin>>n>>t>>a;
	init();
	change(1,1,n,1);
	while(a--)
	{
		cin>>x;
		if(x=='C')
		{
			cin>>y>>z>>l;
			if(y>z)
				swap(y,z);
			change(1,y,z,l);
		}
		else if(x=='P')
		{
			cin>>y>>z;
			if(y>z)
				swap(y,z);
			cout<<cnt(query(1,y,z))<<endl;
		}
	}
	return EXIT_SUCCESS;
}
re了无限次,不知为何

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator