[WITACM 선발 전] B 문제 와 C 문제 [최 단 길] [접두사 와 + 2 점]

50042 단어 일기
Pro
경 기 는 우 객 에서 훈련 할 때 치 는 재현 경기 입 니 다.
B 문제 C 문제
Sol
훈련 시: 왜 잘못 한 거 야?생각 은 괜 찮 은 것 같은 데!
끝 난 후: 왜 계속 틀 렸 어 요?생각 이 똑 같 으 면서!
잘못 찾 은 후: woc!!
B 문제: bfs 를 써 서 사고방식 에 큰 문제 가 있 음 을 발 견 했 습 니 다. 왜냐하면 bfs 가 최 단 로 를 구하 면 반드시 첫 번 째 로 방 문 했 을 것 입 니 다. 그러나 본 문제 의 첫 번 째 방문 이 반드시 가장 좋 은 것 은 아 닙 니 다.(여기까지 쓰 고 갑자기 생각 나 는 게 있어 요. 소박 한 bfs 는 안 된다 고 해 야 하 는데 우선 대기 열 까지 합치 면 안 될 지 모 르 겠 어 요.)
B 문제 정 해: 각 점 과 주위 의 점 을 직접 연결 하고 전송 문의 양 끝 에 연결 하 며 (함정 인지 아 닌 지 를 주의 하여 판단) 최 단 로 (dij 더미 최적화 템 플 릿) 를 한 번 뛰 면 됩 니 다.
내 가 뭘 잘 못 했 지?2 차원 에서 점 으로 전환 하 는 번호 이기 때문에 줄 번호 곱 하기 열 수 에 열 번 호 를 추가 해 야 합 니 다!
C 문제: 생각 이 간단 해 요. 기본 을 보면 접두사 와 2 점 이 생각 나 요. 그런데!그냥 WA.
내 가 뭘 잘 못 했 지? 우선 w0 은 0 일 것 이다. 사실은 n + 1 길이 의 배열 이다. n 으로 착각 했다. 이 오 류 를 발견 한 후에 정렬 할 때 도 n 개 로 정렬 되 었 다 는 것 을 의식 하지 못 했 기 때문에 WA 에서 계속 했다. 사실은 n + 1 이라는 것 만 알 고 고 고 쳐 야 할 곳 을 A 로 고 쳤 다.
Code
B 문제
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define lowbit(_) _&(-_)
inline LL read() {
     
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
      if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

#define MAXN 90005
struct Node {
     
	LL to , next , val;
};
Node e[MAXN*4+1005];
struct Seg {
     
	LL  x , y;
	Seg() {
     
		x=-1 , y=-1;
	};
	Seg(LL xx , LL yy) {
     
		x=xx , y=yy;
	}
}; 
vector<Seg>cq[305][305];
struct Que {
     
	LL len , num;
	Que(LL ll , LL nn) {
     
		len = ll , num = nn;
	}
};
LL tot , head[MAXN] , n , m , q , sx=-1 , sy=-1 , tx=-1 , ty=-1 , dis[MAXN]; 
string mp[305];

void add(LL x , LL y , LL z) {
     
	tot++;
	e[tot].to = y;
	e[tot].next = head[x];
	e[tot].val = z;
	head[x] = tot;
}

bool operator < (Que a , Que b) {
     
	return a.len > b.len;
}

void dij(LL s) {
     
	Fo(i,0,MAXN)
		dis[i] = INF;
	dis[s] = 0;
	priority_queue<Que>q;
	q.push(Que(0,s));
	while(!q.empty()) {
     
		Que u=q.top();
		q.pop();
		if(u.len!=dis[u.num]) continue;
		for(int i=head[u.num]; i;i=e[i].next) {
     
			LL v=e[i].to;
			if(dis[v]>dis[u.num]+e[i].val) {
     
				dis[v] = dis[u.num]+e[i].val;
				q.push(Que(dis[v] , v));
			}
		}
	}
}

int main() {
     
//	freopen("datad.txt","r",stdin);
	n=read(); m=read(); q=read();
	Fo(i,0,n-1) cin>>mp[i];
	Fo(i,1,q) {
     
		LL x1 , z1 , x2 , z2;
	//	x1=read(); z1=read(); x2=read(); z2=read();
		scanf("%lld%lld%lld%lld",&x1,&z1,&x2,&z2);
		cq[x1][z1].push_back(Seg(x2,z2));
		cq[x2][z2].push_back(Seg(x1,z1));
	}
	Fo(i,0,n-1) {
     
		Fo(j,0,m-1) {
     
			if(mp[i][j]=='#') continue;
			if(mp[i][j]=='S') {
     
				sx = i , sy = j;
			}
			if(mp[i][j]=='T') {
     
				tx = i , ty = j;
			}
			if(i-1>=0&&mp[i-1][j]!='#')
				add(i*m+j , (i-1)*m+j , 1);
			if(i+1<n&&mp[i+1][j]!='#')
				add(i*m+j , (i+1)*m+j , 1);
			if(j-1>=0&&mp[i][j-1]!='#')
				add(i*m+j , i*m+j-1 , 1);
			if(j+1<m&&mp[i][j+1]!='#')
				add(i*m+j , i*m+j+1 , 1);
			if(cq[i][j].size()!=0)
				Fo(k,0,cq[i][j].size()-1)
					if(mp[cq[i][j][k].x][cq[i][j][k].y]!='#')
						add(i*m+j , cq[i][j][k].x*m+cq[i][j][k].y , 3);	
		}
	}
	if((sx==-1&&sy==-1)&&(tx==-1&&ty==-1)) {
     
		printf("0");
		return 0;
	}
	if((sx==-1&&sy==-1)||(tx==-1&&ty==-1)) {
     
		printf("-1");
		return 0;
	}
	
	dij(sx*m+sy);
	if(dis[tx*m+ty]==INF)
		printf("-1");
	else
		printf("%lld",dis[tx*m+ty]);
	return 0;
}



C 문제
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define PI acos(-1)
#define INF 2147483647
#define eps 1e-7
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define lowbit(_) _&(-_)
inline LL read() {
     
	LL x = 0, f = 1;char c = getchar();
	while (!isdigit(c)) {
      if (c == '-')f = -f;c = getchar(); }
	while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48ll), c = getchar();
	return x * f;
}

#define MAXN 100005
struct Node {
     
	LL data , id;
	Node(){
     };
	Node(LL dd , LL ii) {
     
		data = dd , id = ii;
	}
	bool operator < (const Node &a) {
     
		return data<a.data;
	}
};
Node a[MAXN];
LL n , m , tt[MAXN] , ans;

struct cmp {
     
	bool operator() (const Node& s1,  const Node& s2) {
     
		return s1.data<s2.data;
	}
};

int main() {
     
//	freopen("data.txt","r",stdin);	
	n=read(); m=read();
	a[0].id = a[0].data = 0;
	Fo(i,1,n) {
     
		LL x = read();
		a[i].data = a[i-1].data + x;
		a[i].id = i;
	}
	sort(a , a+n+1);
	Fo(i,0,n)
		tt[i] = a[i].data;
	Fo(i,1,m) {
     
		LL k=read();
		LL pos = upper_bound(tt , tt+n+1 , k)-tt-1;
		LL sum = k-tt[pos];
		ans = a[pos].id;
		Ro(j,pos-1,0) {
     
			if(k-tt[j]!=sum)
				break;
			ans = max(ans , a[j].id);
		}
		printf("%lld
"
,ans); } return 0; }

좋은 웹페이지 즐겨찾기