zoukankan      html  css  js  c++  java
  • ACM-ICPC 2018 南京网络赛

    A

     1 /*Huyyt*/
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 typedef long long ll;
     5 const int mod = 998244353;
     6 const int maxn = 1e3 + 5;
     7 int main()
     8 {
     9         int T;
    10         cin >> T;
    11         while(T--)
    12         {
    13                 ll x;
    14                 scanf("%lld",&x);
    15                 printf("%lld
    ",x-1);
    16         }
    17         return 0;
    18 }
    //A

    B

    #include<bits/stdc++.h>
    #define lc(x) (2*x)
    #define rc(x) (2*x+1)
    #define fi first
    #define se second
    using namespace std;
    typedef long long ll;
    
    const ll mod = 998244353;
    const int maxn = 1e5+5;
    const int maxm = 1e2+5;
    int n,m,k;
    vector<int> v[maxm];
    int lit[maxn];
    int near[maxm];
    
    int main(){
        int t;
        scanf("%d",&t);
        for(int quq=1;quq<=t;quq++){
            scanf("%d%d%d",&n,&m,&k);
            int i,j,a,b;
            for(i=1;i<=m;i++)v[i].clear();
            for(i=1;i<=k;i++){
                scanf("%d%d",&a,&b);
                v[b].push_back(a);
            }
            ll ans=0;
            memset(lit,0,sizeof(lit));
            for(i=1;i<=m;i++){
                memset(near,0,sizeof(near));
                for(j=1;j<=n;j++){
                    lit[j]++;
                }
                for(j=0;j<v[i].size();j++)lit[v[i][j]]=0;
                for(j=1;j<=n;j++){
                    b = near[0];
                    for(a=1;a<=lit[j];a++){
                        ans+=(j-b);
                        b = max(b,near[a]);
                    }
                    near[lit[j]]=j;
                }
            }
            printf("Case #%d: %lld
    ",quq,ans);
        }
    }
    //B

    C

      1 /*Huyyt*/
      2 #include<bits/stdc++.h>
      3 #define mem(a,b) memset(a,b,sizeof(a))
      4 using namespace std;
      5 typedef long long ll;
      6 const int mod = 998244353;
      7 const int maxn = 2e4 + 5;
      8 int n, m;
      9 int num[maxn];
     10 int ren[205][20];
     11 int sum[205];
     12 int ans[205];
     13 int cur, biggestnum;
     14 int biggestman;
     15 int numcur;
     16 bool flag = true;
     17 void get_ans()
     18 {
     19         for (int i = 1; i <= n; i++)
     20         {
     21                 for (int j = 1; j <= 13; j++)
     22                 {
     23                         ans[i] += ren[i][j] * j;
     24                 }
     25         }
     26         return ;
     27 }
     28 int get_min(int x)
     29 {
     30         for (int i = 3; i <= 13; i++)
     31         {
     32                 if (ren[x][i])
     33                 {
     34                         return i;
     35                 }
     36         }
     37         if (ren[x][1])
     38         {
     39                 return 1;
     40         }
     41         if (ren[x][2])
     42         {
     43                 return 2;
     44         }
     45 }
     46 int get_next(int x)
     47 {
     48         if (x == 2)
     49         {
     50                 return -1;
     51         }
     52         if (x >= 3 && x <= 12)
     53         {
     54                 return (x + 1);
     55         }
     56         if (x == 1)
     57         {
     58                 return 2;
     59         }
     60         if (x == 13)
     61         {
     62                 return 1;
     63         }
     64 }
     65 int change_man(int x)
     66 {
     67         if (x > n)
     68         {
     69                 return 1;
     70         }
     71         return x;
     72 }
     73 void chouka(int x)
     74 {
     75         for (int i = x; i <= n && cur <= m; i++)
     76         {
     77                 ren[i][num[cur++]]++;
     78                 sum[i]++;
     79         }
     80         for (int i = 1; i < x && cur <= m; i++)
     81         {
     82                 ren[i][num[cur++]]++;
     83                 sum[i]++;
     84         }
     85 }
     86 void go(int mannow)
     87 {
     88         if (!flag)
     89         {
     90                 return ;
     91         }
     92         mannow = change_man(mannow);
     93         if (mannow == biggestman)
     94         {
     95                 chouka(biggestman);
     96                 return ;
     97         }
     98         if (biggestnum == 2)
     99         {
    100                 chouka(biggestman);
    101                 return ;
    102         }
    103         int aim = get_next(biggestnum);
    104         if (aim == -1)
    105         {
    106                 chouka(biggestman);
    107                 return ;
    108         }
    109         if (ren[mannow][aim])
    110         {
    111                 ren[mannow][aim]--;
    112                 sum[mannow]--;
    113                 if (sum[mannow] == 0)
    114                 {
    115                         flag = false;
    116                         get_ans();
    117                         return ;
    118                 }
    119                 biggestman = mannow, biggestnum = aim;
    120                 go(mannow + 1);
    121         }
    122         else
    123         {
    124                 if (ren[mannow][2])
    125                 {
    126                         ren[mannow][2]--;
    127                         sum[mannow]--;
    128                         if (sum[mannow] == 0)
    129                         {
    130                                 flag = false;
    131                                 get_ans();
    132                                 return ;
    133                         }
    134                         biggestman = mannow, biggestnum = 2;
    135                         go(mannow + 1);
    136                 }
    137                 else
    138                 {
    139                         go(mannow + 1);
    140                 }
    141         }
    142 }
    143 int main()
    144 {
    145         int T;
    146         cin >> T;
    147         for (int cas = 1; cas <= T; cas++)
    148         {
    149                 flag = true;
    150                 numcur = 1, cur = 1, biggestnum = -1;
    151                 mem(ren, 0), mem(ans, 0), mem(sum, 0);
    152                 scanf("%d %d", &n, &m);
    153                 for (int i = 1; i <= m; i++)
    154                 {
    155                         scanf("%d", &num[i]);
    156                 }
    157                 for (int i = 1; i <= n; i++)
    158                 {
    159                         int add = 0;
    160                         for (; cur <= m && add <= 4;)
    161                         {
    162                                 //cout<<i<<" "<<num[cur]<<endl;
    163                                 ren[i][num[cur++]]++;
    164                                 sum[i]++;
    165                                 add++;
    166                         }
    167                 }
    168                 biggestman = 1;
    169                 while (flag)
    170                 {
    171                         if (sum[biggestman] == 0)
    172                         {
    173                                 get_ans();
    174                                 flag = false;
    175                                 continue;
    176                         }
    177                         biggestnum = get_min(biggestman);
    178                         ren[biggestman][biggestnum]--;
    179                         sum[biggestman]--;
    180                         if (sum[biggestman] == 0)
    181                         {
    182                                 get_ans();
    183                                 flag = false;
    184                                 continue;
    185                         }
    186                         go(biggestman + 1);
    187                 }
    188                 printf("Case #%d:
    ", cas);
    189                 for (int i = 1; i <= n; i++)
    190                 {
    191                         if (ans[i] == 0)
    192                         {
    193                                 printf("Winner
    ");
    194                         }
    195                         else
    196                         {
    197                                 printf("%d
    ", ans[i]);
    198                         }
    199                 }
    200         }
    201         return 0;
    202 }
    //C

    D

      1 /*
      2  Author: LargeDumpling
      3  Email: LargeDumpling@qq.com
      4  Edit History:
      5     2018-09-01    File created.
      6 */
      7 
      8 #include<iostream>
      9 #include<cstdio>
     10 #include<cstdlib>
     11 #include<cstring>
     12 #include<cmath>
     13 #include<algorithm>
     14 using namespace std;
     15 const int MAXN=1050;
     16 const double eps=1e-10;
     17 int dcmp(const double &x) { if(fabs(x)<eps) return 0; return x<0?-1:1; }
     18 typedef struct Poi Vec;
     19 struct Poi
     20 {
     21     double x,y;
     22     Poi(const double &a=0,const double &b=0):x(a),y(b) { }
     23     Poi operator+(const Poi &P)const { return Poi(x+P.x,y+P.y); }
     24     Poi operator-(const Poi &P)const { return Poi(x-P.x,y-P.y); }
     25     Poi operator*(const double &P)const { return Poi(x*P,y*P); }
     26     Poi operator/(const double &P)const { return Poi(x/P,y/P); }
     27     bool operator<(const Poi &P)const { return !dcmp(x-P.x)?dcmp(y-P.y)<=0:dcmp(x-P.x)<=0; }
     28 }PP[MAXN],NP[MAXN<<1],IP[MAXN];
     29 struct Line
     30 {
     31     Poi Ps; Vec Dir;
     32     double ang;
     33     Line(const Poi &ps=Poi(),const Vec &dir=Vec()):Ps(ps),Dir(dir) { ang=atan2(Dir.y,Dir.x); }
     34     bool operator<(const Line &L1)const { return ang<L1.ang; }
     35 }lines[MAXN],q[MAXN];
     36 double dOt(const Vec &V1,const Vec &V2) { return V1.x*V2.x+V1.y*V2.y; }
     37 double cRoss(const Vec &V1,const Vec &V2) { return V1.x*V2.y-V1.y*V2.x; }
     38 double lEnth(const Vec V) { return sqrt(dOt(V,V)); }
     39 Vec Normal(const Vec &V) { return Vec(-V.y,V.x); }
     40 Poi iNtersect(const Poi &P1,const Vec &V1,const Poi &P2,const Vec &V2)
     41 { return P1+V1*(cRoss(V2,P1-P2)/cRoss(V1,V2)); }
     42 Poi iNtersect(const Line &L1,const Line &L2)
     43 { return iNtersect(L1.Ps,L1.Dir,L2.Ps,L2.Dir); }
     44 int HPI(Line *L,int N,Poi *Pol)
     45 {
     46     int l,r,m=0;
     47     sort(L,L+N);//按极角排序
     48     q[l=r=0]=L[0];
     49     for(int i=1;i<N;i++)
     50     {
     51         while(l<r&&dcmp(cRoss(L[i].Dir,IP[r-1]-L[i].Ps))<=0) r--; //新加入的直线可能是尾部的一些交点失效
     52         while(l<r&&dcmp(cRoss(L[i].Dir,IP[l]-L[i].Ps))<=0) l++; //首部
     53         q[++r]=L[i]; //加入
     54         if(!dcmp(cRoss(q[r].Dir,q[r-1].Dir)))
     55         { //对于平行直线要取靠左的
     56             r--;
     57             if(dcmp(cRoss(q[r+1].Dir,q[r].Ps-q[r+1].Ps))<0) q[r]=q[r+1];
     58         }
     59         if(l<r) IP[r-1]=iNtersect(q[r-1],q[r]); //如果队列中有至少两条线,则取交点
     60     }
     61     while(l<r&&dcmp(cRoss(q[l].Dir,IP[r-1]-q[l].Ps))<=0) r--; //后面一些交点可能实际上是无用的
     62     if(r-l<2) return 0; //如果只有不到两条线,则失败了
     63     IP[r]=iNtersect(q[l],q[r]); //将最后一条线和第一条线交起来
     64     for(int i=l;i<=r;i++) Pol[m++]=IP[i];
     65     Pol[m]=Pol[0];
     66     return m;
     67 }
     68 double area(const Poi &P1,const Poi &P2,const Poi &P3)
     69 {
     70     return fabs(cRoss(P3-P1,P2-P1));
     71 }
     72 double calc(int n,Poi *P)
     73 {
     74     int l,r,mid1,mid2,tem;
     75     double ans=0;
     76     for(int i=0;i<=n;i++)
     77         P[i+n]=P[i];
     78     for(int i=0;i<n;i++)
     79         for(int j=i+1;j<n;j++)
     80         {
     81             l=i; r=j;
     82             while(l<r-1)
     83             {
     84                 tem=(r-l+1)/3;
     85                 mid1=l+tem;
     86                 mid2=r-tem;
     87                 if(area(P[i],P[j],P[mid1])<area(P[i],P[j],P[mid2])) l=mid1;
     88                 else r=mid2;
     89             }
     90             ans=max(ans,max(area(P[i],P[j],P[l]),area(P[i],P[j],P[r])));
     91             l=j; r=i+n;
     92             while(l<r-1)
     93             {
     94                 tem=(r-l+1)/3;
     95                 mid1=l+tem;
     96                 mid2=r-tem;
     97                 if(area(P[i],P[j],P[mid1])<area(P[i],P[j],P[mid2])) l=mid1;
     98                 else r=mid2;
     99             }
    100             ans=max(ans,max(area(P[j],P[i+n],P[l]),area(P[j],P[i+n],P[r])));
    101         }
    102     return ans;
    103 }
    104 int main()
    105 {
    106     int T_T,n,m;
    107     double r;
    108     Vec Nv;
    109     scanf("%d",&T_T);
    110     while(T_T--)
    111     {
    112         scanf("%d%lf",&n,&r);
    113         for(int i=0;i<n;i++) scanf("%lf%lf",&PP[n-i-1].x,&PP[n-i-1].y);
    114         PP[n]=PP[0];
    115         for(int i=0;i<n;i++)
    116         {
    117             Nv=Normal(PP[i+1]-PP[i]);
    118             Nv=Nv/lEnth(Nv);
    119             lines[i]=Line(PP[i]+Nv*r,PP[i+1]-PP[i]);
    120         }
    121         m=HPI(lines,n,NP);
    122         printf("%lf
    ",calc(m,NP));
    123     }
    124     fclose(stdin);
    125     fclose(stdout);
    126     return 0;
    127 }
    //D

    E

     1 /*
     2  Author: LargeDumpling
     3  Email: LargeDumpling@qq.com
     4  Edit History:
     5     2018-09-01    File created.
     6 */
     7 
     8 #include<iostream>
     9 #include<cstdio>
    10 #include<cstdlib>
    11 #include<cstring>
    12 #include<cmath>
    13 #include<queue>
    14 #include<algorithm>
    15 using namespace std;
    16 const int MAXN=25;
    17 struct jz
    18 {
    19     int u,S,cnt;
    20     jz(const int &U=0,const int &SS=0,const int &C=0):u(U),S(SS),cnt(C) { }
    21 };
    22 bool aa;
    23 int n,pre[MAXN];
    24 long long a[MAXN],b[MAXN],f[1100000],ans=0;
    25 bool exist[1100000],vis[1100000];
    26 bool bb;
    27 void SPFA()
    28 {
    29     int S=0;
    30     long long cnt=0;
    31     queue<jz> q;
    32     f[0]=0;
    33     for(int i=0;i<n;i++) if((pre[i]&S)==pre[i]
    34             &&(!vis[S|(1<<i)]||f[S|(1<<i)]<f[S]+a[i]*(cnt+1LL)+b[i]))
    35     {
    36         f[S|(1<<i)]=f[S]+a[i]*(cnt+1LL)+b[i];
    37         vis[S|(1<<i)]=true;
    38         q.push(jz(i,S|(1<<i),cnt+1));
    39         exist[S|(1<<i)]=true;
    40     }
    41     while(q.size())
    42     {
    43         S=q.front().S;
    44         cnt=q.front().cnt;
    45         q.pop();
    46         exist[S]=false;
    47         for(int i=0;i<n;i++) if((!((S>>i)&1))&&((pre[i]&S)==pre[i])
    48                 &&(!vis[S|(1<<i)]||f[S|(1<<i)]<f[S]+a[i]*(cnt+1LL)+b[i]))
    49         {
    50             f[S|(1<<i)]=f[S]+a[i]*(cnt+1LL)+b[i];
    51             vis[S|(1<<i)]=true;
    52             ans=max(ans,f[S|(1<<i)]);
    53             if(!exist[S|(1<<i)])
    54             {
    55                 exist[S|(1<<i)]=true;
    56                 q.push(jz(i,S|(1<<i),cnt+1));
    57             }
    58         }
    59     }
    60     return;
    61 }
    62 int main()
    63 {
    64     int pn,x;
    65     scanf("%d",&n);
    66     for(int i=0;i<n;i++)
    67     {
    68         scanf("%lld%lld%d",&a[i],&b[i],&pn);
    69         while(pn--)
    70         {
    71             scanf("%d",&x); x--;
    72             pre[i]|=(1<<x);
    73         }
    74     }
    75     SPFA();
    76     printf("%lld
    ",ans);
    77     fclose(stdin);
    78     fclose(stdout);
    79     return 0;
    80 }
    //E

    F

    G

      1 /*
      2  Author: LargeDumpling
      3  Email: LargeDumpling@qq.com
      4  Edit History:
      5     2018-09-01    File created.
      6 */
      7 
      8 #include<iostream>
      9 #include<cstdio>
     10 #include<cstdlib>
     11 #include<cstring>
     12 #include<cmath>
     13 #include<algorithm>
     14 using namespace std;
     15 const int MAXN=100050;
     16 const int M=131072;
     17 const int INF=2147483647;
     18 int n,m;
     19 int mbl[MAXN],d[M<<1];
     20 int ans[MAXN][2];
     21 void read1n(int &x)
     22 {
     23     char ch;
     24     for(ch=getchar();ch<'0'||'9'<ch;ch=getchar())
     25         if(ch==-1) return;
     26     for(x=0;'0'<=ch&&ch<='9';ch=getchar())
     27         x=(x<<1)+(x<<3)+ch-'0';
     28     return;
     29 }
     30 void build()
     31 {
     32     for(int i=1;i<=n;i++)
     33         d[i+M]=mbl[i];
     34     for(int i=M-1;i;i--)
     35         d[i]=min(d[i<<1],d[i<<1|1]);
     36     return;
     37 }
     38 void del(int x)
     39 {
     40     mbl[x]=d[x+M]=INF;
     41     for(int i=(x+M)>>1;i;i>>=1)
     42         d[i]=min(d[i<<1],d[i<<1|1]);
     43     return;
     44 }
     45 int query(int L,int R)
     46 {
     47     int ans=INF;
     48     for(L=L+M-1,R=R+M+1;L<R-1;L>>=1,R>>=1)
     49     {
     50         if(!(L&1)) ans=min(ans,d[L^1]);
     51         if(R&1) ans=min(ans,d[R^1]);
     52     }
     53     return ans;
     54 }
     55 void calc()
     56 {
     57     int nex,cnt,now,l,mid,r,left=0;
     58     ans[0][0]=ans[0][1]=0;
     59     build();
     60     cnt=0;
     61     for(int i=1;i<MAXN;i++)
     62     {
     63         if(cnt==n)
     64         {
     65             ans[i][0]=ans[i-1][0];
     66             ans[i][1]=ans[i-1][1];
     67             continue;
     68         }
     69         left+=m;
     70         now=1;
     71         while(true)
     72         {
     73             if(mbl[now]<=left) nex=now;
     74             else if(left<query(now,n)) nex=n+1;
     75             else
     76             {
     77                 l=now; r=n;
     78                 while(l<r-1)
     79                 {
     80                     mid=(l+r)>>1;
     81                     if(query(now,mid)<=left) r=mid;
     82                     else l=mid;
     83                 }
     84                 nex=r;
     85             }
     86             if(nex==n+1) break;
     87             left-=mbl[nex];
     88             cnt++;
     89             del(nex);
     90             now=nex;
     91         }
     92         ans[i][0]=cnt;
     93         ans[i][1]=left;
     94     }
     95 }
     96 int main()
     97 {
     98     int Q,x;
     99     read1n(n); read1n(m);
    100     for(int i=1;i<=n;i++)
    101         scanf("%d",&mbl[i]);
    102     calc();
    103     read1n(Q);
    104     while(Q--)
    105     {
    106         read1n(x);
    107         printf("%d %d
    ",ans[x][0],ans[x][1]);
    108     }
    109     fclose(stdin);
    110     fclose(stdout);
    111     return 0;
    112 }
    //G

    H

    I

     1 /*
     2  Author: LargeDumpling
     3  Email: LargeDumpling@qq.com
     4  Edit History:
     5     2018-09-01    File created.
     6 */
     7 
     8 #include<iostream>
     9 #include<cstdio>
    10 #include<cstdlib>
    11 #include<cstring>
    12 #include<cmath>
    13 #include<algorithm>
    14 using namespace std;
    15 const int MAXN=2000050;
    16 const int MAXC=10;
    17 const long long mod=1000000007LL;
    18 char str[MAXN];
    19 int ch[MAXN][MAXC],len[MAXN],fail[MAXN],last,sz;
    20 long long num[MAXN],ans,p[MAXN];
    21 int getfail(char T[],int x,int i)
    22 {
    23     while(T[i-len[x]-1]!=T[i]) x=fail[x];
    24     return x;
    25 }
    26 void init()
    27 {
    28     memset(ch[0],last=0,sizeof(ch[0]));//last为当前的最长后缀回文
    29     memset(ch[1],0,sizeof(ch[1]));
    30     len[0]=0; len[1]=-1;
    31     fail[0]=1;
    32     num[0]=num[1]=0;
    33     sz=1;
    34     ans=0;
    35     return;
    36 }
    37 void insert(char T[])
    38 {
    39     int lenth=strlen(T),cur=0;
    40     for(int i=0;i<lenth;i++)
    41     {
    42         cur=getfail(T,last,i);
    43         if(!ch[cur][T[i]-'0'])
    44         {
    45             fail[++sz]=ch[ getfail(T,fail[cur],i) ][T[i]-'0'];
    46             ch[cur][T[i]-'0']=sz;
    47             memset(ch[sz],0,sizeof(ch[sz]));
    48             len[sz]=len[cur]+2;
    49             if(cur==1) num[sz]=T[i]-'0';
    50             else num[sz]=(num[cur]*10LL%mod+p[len[cur]+1]*(T[i]-'0')%mod+(T[i]-'0'))%mod;
    51             ans=(ans+num[sz])%mod;
    52         }
    53         last=ch[cur][T[i]-'0'];
    54     }
    55     return;
    56 }
    57 void pre_calc()
    58 {
    59     p[0]=1;
    60     p[1]=10LL;
    61     for(int i=2;i<MAXN;i++) p[i]=p[i-1]*p[1]%mod;
    62     return;
    63 }
    64 int main()
    65 {
    66     init();
    67     pre_calc();
    68     scanf("%s",str);
    69     insert(str);
    70     printf("%lld
    ",ans);
    71     fclose(stdin);
    72     fclose(stdout);
    73     return 0;
    74 }
    //I

    J

     1 #include<bits/stdc++.h>
     2 #define lc(x) (2*x)
     3 #define rc(x) (2*x+1)
     4 #define fi first
     5 #define se second
     6 using namespace std;
     7 typedef long long ll;
     8 
     9 const ll mod = 998244353;
    10 const int maxn = 2e7+5;
    11 const int maxm = 1e4;
    12 int num[maxn],is[maxn];
    13 int n;
    14 
    15 void yuchuli(){
    16     int i,j,a,b;
    17     for(i=2;;i++){
    18         if(i*i>=maxn)break;
    19         a=i*i;
    20         for(j=a;j<maxn;j+=a)is[j]=1;
    21     }
    22     for(i=1;i<maxn;i++)num[i]=num[i-1]+1-is[i];
    23 }
    24 
    25 int main(){
    26     int t;
    27     yuchuli();
    28     scanf("%d",&t);
    29     while(t--){
    30         scanf("%d",&n);
    31         int i,j,a,b;
    32         ll ans=0;
    33         for(i=1;i<=maxm;i++){
    34             if(is[i])continue;
    35             j=n/i;
    36             ans += num[j];
    37             if(j>maxm)ans+=num[j]-num[maxm];
    38         }
    39         printf("%lld
    ",ans);
    40     }
    41 }
    //J

    K

    L

      1 /*
      2  Author: LargeDumpling
      3  Email: LargeDumpling@qq.com
      4  Edit History:
      5     2018-09-01    File created.
      6 */
      7 
      8 #include<iostream>
      9 #include<cstdio>
     10 #include<cstdlib>
     11 #include<cstring>
     12 #include<cmath>
     13 #include<queue>
     14 #include<algorithm>
     15 using namespace std;
     16 const int MAXN=100050;
     17 const int MAXM=200050;
     18 struct jz
     19 {
     20     int u;
     21     long long dis;
     22     jz(const int &U=0,const long long &D=0):u(U),dis(D) { }
     23     bool operator<(const jz &X)const { return dis==X.dis?u>X.u:dis>X.dis; }
     24 };
     25 bool aaa;
     26 int T_T,n,m,k;
     27 int fir[MAXN*15],eNd[MAXM*25],nxt[MAXM*25],ed=0;
     28 bool vis[MAXN*15];
     29 long long len[MAXM*25],dis[MAXN*15],ans;
     30 bool bbb;
     31 void addedge(int u,int v,int w)
     32 {
     33     eNd[++ed]=v;
     34     nxt[ed]=fir[u];
     35     len[ed]=w;
     36     fir[u]=ed;
     37     return;
     38 }
     39 void read1n(int &x)
     40 {
     41     char ch=getchar();
     42     while(ch<'0'||'9'<ch) ch=getchar();
     43     for(x=0;'0'<=ch&&ch<='9';ch=getchar())
     44         x=(x<<1)+(x<<3)+ch-'0';
     45     return;
     46 }
     47 void init()
     48 {
     49     memset(fir,ed=0,sizeof(fir));
     50     memset(dis,-1,sizeof(dis));
     51     memset(vis,false,sizeof(vis));
     52     return;
     53 }
     54 void Hijkstra()
     55 {
     56     int u;
     57     priority_queue<jz> q;
     58     dis[1]=0;
     59     q.push(jz(1,0));
     60     while(q.size())
     61     {
     62         while(q.size()&&(vis[q.top().u]||dis[q.top().u]!=q.top().dis))
     63             q.pop();
     64         if(!q.size()) break;
     65         u=q.top().u; q.pop();
     66         vis[u]=true;
     67         for(int i=fir[u];i;i=nxt[i]) if(dis[eNd[i]]==-1||dis[u]+len[i]<dis[eNd[i]])
     68         {
     69             dis[eNd[i]]=dis[u]+len[i];
     70             q.push(jz(eNd[i],dis[eNd[i]]));
     71         }
     72     }
     73     return;
     74 }
     75 int Rand()
     76 {
     77     return (rand()<<15)+rand();
     78 }
     79 int main()
     80 {
     81     int u,v,w;
     82     read1n(T_T);
     83     //T_T=5;
     84     while(T_T--)
     85     {
     86         init();
     87         read1n(n);
     88         //n=100000;
     89         read1n(m);
     90         //m=200000;
     91         read1n(k);
     92         //k=10;
     93         for(int i=1;i<=m;i++)
     94         {
     95             read1n(u);
     96             //u=Rand()%n+1;
     97             read1n(v);
     98             //v=Rand()%n+1;
     99             read1n(w);
    100             //w=1000000000;
    101             for(int j=0;j<=k;j++)
    102             {
    103                 addedge(u+j*n,v+j*n,w);
    104                 if(j<k) addedge(u+j*n,v+(j+1)*n,0);
    105             }
    106         }
    107         Hijkstra();
    108         ans=dis[n];
    109         for(int i=1;i<=k;i++)
    110             ans=min(ans,dis[(i+1)*n]);
    111         printf("%lld
    ",ans);
    112     }
    113     fclose(stdin);
    114     fclose(stdout);
    115     return 0;
    116 }
    //L
  • 相关阅读:
    默认构造函数
    Android笔记(二十八) Android中图片之简单图片使用
    Android笔记(二十七) Android中的动态广播和静态广播
    Android笔记(二十六) Android中的广播——BroadcastReceiver
    <转> Android LayoutInflater详解
    Android笔记(二十五) ListView的缓存机制与BaseAdapter
    Android笔记(二十四) Android中的SeekBar(拖动条)
    Android笔记(二十三) Android中的ProgressBar(进度条)
    Android笔记(二十二) Android中的GridView
    Android笔记(二十一) Android中的Adapter
  • 原文地址:https://www.cnblogs.com/Aragaki/p/9582009.html
Copyright © 2011-2022 走看看