示例#1
0
	void search(D &d, typename D::State &s0) {
		bool optimal = false;
		rowhdr();
		this->start();
		closed.init(d);
		incons.init(d);

		Node *n0 = init(d, s0);
		closed.add(n0);
		open.push(n0);

		unsigned long n = 0;
		do {
			if (improve(d)) {
				n++;
				double epsprime = wt == 1.0 ? 1.0 : findbound();
				if (wt < epsprime)
					epsprime = wt;
				row(n, epsprime);
			}

			if (wt <= 1.0) {
				optimal = true;
				break;
			}
			nextwt();
			updateopen();
			closed.clear();

		} while(!this->limit() && !open.empty());

		this->finish();
		dfpair(stdout, "converged", "%s", optimal ? "yes" : "no");
	}
示例#2
0
文件: 4012.cpp 项目: scPointer/OI
int main()
{
	int Qs,lim;
	scanf("%d%d%d",&n,&Qs,&lim);
	for(int i=1;i<=n;i++){
		scanf("%d",&ag[i].sc);
		ag[i].id=i;
	}
	std::sort(ag+1,ag+1+n);
	for(int i=1,p1,p2,dis;i<=n-1;i++)
	{
		scanf("%d%d%d",&p1,&p2,&dis);
		addEdge(p1,p2,dis);
		addEdge(p2,p1,dis);
	}
	distort[1]=0;esum[0]=0;
	dfs(1);
	dfs2(1,1);
	for(int i=1;i<=n;i++) esum[i]+=esum[i-1];
	for(int i=1;i<=n;i++) sumdis[i]=sumdis[i-1]+distort[ag[i].id];
	for(int i=1,p;i<=n;i++)
	{
		p=ag[i].id; rot[i]=rot[i-1];
		while(top[p]!=1){rot[i]=update(rot[i],dfo[top[p]],dfo[p],1,n);p=fa[top[p]];}
		rot[i]=update(rot[i],1,dfo[p],1,n);
	}
	long long preans=0;
	for(int i=1,mise,ra,rb,ll,rr;i<=Qs;i++)
	{
		scanf("%d%d%d",&mise,&ra,&rb);
		ll=Min((preans+ra)%lim,(preans+rb)%lim);
		rr=Max((preans+ra)%lim,(preans+rb)%lim);
		ll=findbound(ll);
		rr=findupper(rr);
		printf("%lld\n",(preans=(sumdis[rr]-sumdis[ll-1])+distort[mise]*(rr-ll+1)-(query(rot[rr],mise)-query(rot[ll-1],mise))*2));
	}
}