AOJ 2489,2490,2494

RUPC 2013 の阪大セットで解けそうなものを解いてみました。

2489
これはやるだけです

#include<stdio.h>
#include<algorithm>
using namespace std;
int ABS(int a){return max(a,-a);}
bool palin(int a){
	int b=0;
	int c=a;
	while(c){
		b*=10;
		b+=c%10;
		c/=10;
	}
	return a==b;
}
int main(){
	int a;
	scanf("%d",&a);
	int ret=0;
	int d=99999999;
	for(int i=0;i<10000;i++){
		if(palin(i)){
			if(d>ABS(a-i)){
				d=ABS(a-i);
				ret=i;
			}
		}
	}
	printf("%d\n",ret);
}

2490
左から見ていって(の個数が常に)の個数より多く、最終的に同じ個数になればよいです。

#include<stdio.h>
char str[2];
int main(){
	int a;
	scanf("%d",&a);
	bool ok=true;
	int now=0;
	for(int i=0;i<a;i++){
		int b;
		scanf("%s%d",str,&b);
		if(str[0]=='(')now+=b;
		else now-=b;
		if(now<0)ok=false;
	}
	if(ok&&now==0)printf("YES\n");
	else printf("NO\n");
}

2494
まず、3つ以上の数のGCDは無視していいです。
また、ある数nを使うと決めたとき、GCDは必ずその数の約数tになりますが、ここでt

#include<stdio.h>
#include<algorithm>
using namespace std;
pair<int,int> event[5000000];
int now[100001];
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	int at=0;
	for(int i=1;i<=a;i++){
		event[at++]=make_pair(i-b+1,i);
		event[at++]=make_pair(i+1,-i);
		for(int j=1;j*j<=i;j++){
			if(i%j==0){
				int c=i/j;
				if(j<b){
					event[at++]=make_pair(i-b+1,j);
					event[at++]=make_pair(i-j+1,-j);
					event[at++]=make_pair(i+j-b+1,j);
					event[at++]=make_pair(i+1,-j);
				}
				if(c<b){
					event[at++]=make_pair(i-b+1,c);
					event[at++]=make_pair(i-c+1,-c);
					event[at++]=make_pair(i+c-b+1,c);
					event[at++]=make_pair(i+1,-c);
				}
			}
		}
	}
	std::sort(event,event+at);
	int ret=0;
	int right=0;
	int left=0;
	for(int i=1;i<=a-b+1;i++){
		while(event[right].first<=i){
			if(event[right].second>0){
				now[event[right].second]++;
				if(now[event[right].second]==1)ret++;
			}
			right++;
		}
		while(event[left].first<=i){
			if(event[left].second<0){
				now[-event[left].second]--;
				if(now[-event[left].second]==0)ret--;
			}
			left++;
		}
		//for(int j=1;j<=10;j++)printf("%d ",now[j]);

		printf("%d",ret);
		if(i<a-b+1)printf(" ");
		else printf("\n");
	}
}