2013 장사 인터넷 경기 J 문제 캔디 스 (차분 구속 또는 수학 법칙) \ # by zh
계차 제약: 전 i 개인 이 돌 개 수 를 가 진 최대 가능 치 와 최소 가능 치 를 각각 유지 합 니 다. i 개인 이 가능 한 최대 수 치 는 dismax [i] - dismin [i - 1] 입 니 다.
수학 규칙: 3, 6, 9,..........................................................................
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define MAXN 100005
int dismax[MAXN],dismin[MAXN];
int vis[MAXN];
const int INF=0x3f3f3f3f;
struct Node
{
    int v,w;
    Node(int a,int b){v=a,w=b;}
};
int n;
vector<Node> gmin[MAXN],gmax[MAXN];
void spfamax()
{
    for(int i=0;i<=n;i++)
        dismax[i]=INF;
    memset(vis,0,sizeof(vis));
    dismax[0]=0;
    queue<int> q;
    q.push(0);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=false;
        int len=gmax[u].size();
        for(int i=0;i<len;i++)
        {
            int v=gmax[u][i].v,w=gmax[u][i].w;
            if(dismax[v]>dismax[u]+w)
            {
                dismax[v]=dismax[u]+w;
                if(!vis[v])
                {
                    vis[v]=true;
                    q.push(v);
                }
            }
        }
    }
}
void spfamin()
{
    for(int i=0;i<=n;i++)
        dismin[i]=-INF;
    memset(vis,0,sizeof(vis));
    dismin[0]=0;
    queue<int> q;
    q.push(0);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=false;
        int len=gmin[u].size();
        for(int i=0;i<len;i++)
        {
            int v=gmin[u][i].v,w=gmin[u][i].w;
            if(dismin[v]<dismin[u]+w)
            {
                dismin[v]=dismin[u]+w;
                if(!vis[v])
                {
                    vis[v]=true;
                    q.push(v);
                }
            }
        }
    }
}
int main()
{
    //freopen("test.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<=n;i++)
            gmin[i].clear(),gmax[i].clear();
        for(int i=1;i<=n;i++)
        {
            gmax[i].push_back(Node(i-1,0));
            gmin[i-1].push_back(Node(i,0));
        }
        for(int i=1;i<=n;i++)
        {
            int temp;
            scanf("%d",&temp);
            if(temp!=-1)
            {
                gmax[i-1].push_back(Node(i,temp));
                gmax[i].push_back(Node(i-1,-temp));
                gmin[i-1].push_back(Node(i,temp));
                gmin[i].push_back(Node(i-1,-temp));
            }
        }
        for(int i=1;i<=n;i++)
        {
            int w;
            scanf("%d",&w);
            int u=max(0,i-2),v=min(n,i+1);
            gmax[u].push_back(Node(v,w));
            gmax[v].push_back(Node(u,-w));
            gmin[u].push_back(Node(v,w));
            gmin[v].push_back(Node(u,-w));
        }
        spfamax();
        spfamin();
        int q;
        scanf("%d",&q);
        for(int i=0;i<q;i++)
        {
            int temp;
            scanf("%d",&temp);
            temp++;
            printf("%d
",dismax[temp]-dismin[temp-1]);
        }
    }
}
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.