[WITACM 선발 전] B 문제 와 C 문제 [최 단 길] [접두사 와 + 2 점]
50042 단어 일기
경 기 는 우 객 에서 훈련 할 때 치 는 재현 경기 입 니 다.
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Google 애널리틱스의 지원 담당자가 비밀번호 유출 위험을보고 Google 애널리틱스에 등록했습니다. 그러면 Google 자회사 직원이 비밀번호를 사용하는 데 동의했습니다 . Google 애널리틱스 이용약관에 다음과 같이 쓰여 있다. 기술적 문제 또는 수수료 문제가 발생...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.