The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest

打网络赛

比赛前的准备工作要做好

确保 c++/java/python的编译器能用

打好模板,放在桌面

A. PERFECT NUMBER PROBLEM

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12
13 #define ll long long
14
15 const int maxn=1e8+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18
19 int sum[maxn];
20
21 int main()
22 {
23     int n=100000000,i,j;
24     for (i=1;i<n;i++)
25         for (j=i;j<n;j+=i)
26             sum[j]+=i;
27     for (i=1;i<n;i++)
28         if (sum[i]==i+i)
29             printf("%d ",i);
30     return 0;
31 }
32 /*
33 6 28 496 8128 33550336
34 Process returned 0 (0x0)   execution time : 24.646 s
35 */

较差的打表方法

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12
13 #define ll long long
14
15 const int maxn=1e4+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18
19
20
21 int main()
22 {
23     ///我相信很大一部分同学是网上找答案的,这不好
24 //    printf("6\n28\n496\n8128\n33550336");
25     ll sum,i,j,k;
26     for (i=1;i<=1000000000;i++)
27     {
28         sum=0;
29         k=sqrt(i);
30         for (j=1;j<=k;j++)
31             if (i%j==0)
32                 sum+=j+i/j;
33         if (k*k==i)
34             sum-=i;
35         sum-=i;
36         if (sum==i)
37             printf("%d ",i);
38         if (i%1000000==0)
39             printf("i=%d\n",i);
40     }
41     return 0;
42 }
43 /*
44 6 28 496 8128 33550336
45 18 min
46 */

C. Angry FFF Party

fib(x) 逐渐变得很大

而fib(fib(x))更是如此,

感觉可以打表

于是用python打表验证一下

 1 import math
 2
 3 ?
 4
 5 a=1/math.sqrt(5)
 6
 7 b=(1+math.sqrt(5))/2
 8
 9 c=(1-math.sqrt(5))/2
10
11 a
12
13 0.4472135954999579
14
15 a
16
17 for n in range(1,16):
18
19     print(n)
20
21     x=a*(pow(b,n) - pow(c,n))
22
23     x=round(x)
24
25     print(x)
26
27 ?
28
29     y=a*(pow(b,x) - pow(c,x))
30
31     print(y)
32
33     print()
34
35 1
36 1
37 1.0
38
39 2
40 1
41 1.0
42
43 3
44 2
45 1.0
46
47 4
48 3
49 2.0
50
51 5
52 5
53 5.000000000000001
54
55 6
56 8
57 21.000000000000004
58
59 7
60 13
61 233.00000000000006
62
63 8
64 21
65 10946.000000000007
66
67 9
68 34
69 5702887.0000000065
70
71 10
72 55
73 139583862445.00024
74
75 11
76 89
77 1.7799794160047194e+18
78
79 12
80 144
81 5.555654042242954e+29
82
83 13
84 233
85 2.2112364063039317e+48
86
87 14
88 377
89 2.746979206949977e+78
90
91 15
92 610
93 1.3582369791278544e+127

开始用java写 BigInteger

  1 import java.math.BigInteger;
  2 import java.util.Scanner;
  3
  4 public class Main {
  5     static class mat {
  6         BigInteger [][]a=new BigInteger[2][2];
  7         mat() {
  8             a[0][0]=a[0][1]=a[1][0]=a[1][1]=BigInteger.ZERO;
  9         }
 10         static mat mul(mat a,mat b) {
 11             mat c=new mat();
 12             for (int k=0;k<2;k++)
 13                 for (int i=0;i<2;i++)
 14                     for (int j=0;j<2;j++)
 15                         c.a[i][j]=c.a[i][j].add(a.a[i][k].multiply(b.a[k][j]));
 16             return c;
 17         }
 18         void print() {
 19             for (int i=0;i<2;i++) {
 20                 for (int j=0;j<2;j++)
 21                     System.out.print(a[i][j]+" ");
 22                 System.out.println();
 23             }
 24             System.out.println();
 25         }
 26     }
 27
 28     static BigInteger _pow(int n) {
 29         mat a=new mat();
 30         mat b=new mat();
 31         a.a[0][0]=BigInteger.ONE;
 32         a.a[0][1]=BigInteger.ZERO;
 33         a.a[1][0]=BigInteger.ZERO;
 34         a.a[1][1]=BigInteger.ONE;
 35
 36         b.a[0][0]=BigInteger.ONE;
 37         b.a[0][1]=BigInteger.ONE;
 38         b.a[1][0]=BigInteger.ONE;
 39         b.a[1][1]=BigInteger.ZERO;
 40
 41         while (n>0) {
 42             if (n%2==1)
 43                 a=mat.mul(a,b);
 44             b=mat.mul(b,b);
 45 //            b.print();
 46             n>>=1;
 47         }
 48         return a.a[1][0];
 49     }
 50
 51     public static void main(String[] args) throws Exception {
 52
 53         int i,len=100000;//10
 54         int []a=new int[100];
 55         BigInteger []b=new BigInteger[100];
 56         StringBuffer s=new StringBuffer("1");
 57         for (i=0;i<len;i++)
 58             s=s.append("0");
 59         String ss=new String(s);
 60         BigInteger maxb=new BigInteger(ss);
 61 //        System.out.println(maxb);
 62
 63 //        _pow(10);
 64
 65         a[1]=a[2]=1;
 66         mat ma = new mat();
 67         for (i=1;i<100;i++) {
 68             if (i<3)
 69                 a[i]=1;
 70             else
 71                 a[i]=a[i-1]+a[i-2];
 72 //            System.out.println(a[i]);
 73             b[i]=_pow(a[i]);
 74 //            if (i<10)
 75 //                System.out.println(b[i]);
 76             if (b[i].compareTo(maxb)>=0)
 77                 break;
 78         }
 79 //        System.out.println("i="+i);
 80         int maxg=i;
 81
 82         Scanner in=new Scanner(System.in);
 83         int t=in.nextInt();
 84         BigInteger m;
 85
 86         int []num=new int[100];
 87             int g=0;
 88             BigInteger[] bb=new BigInteger[11];
 89             for (i=0;i<=10;i++)
 90                 bb[i]=new BigInteger(Integer.toString(i));
 91             String []pr=new String[11];
 92
 93         /*
 94         1 1 1 2 5 21
 95         */
 96             pr[1]="1";
 97             pr[2]="1 2";
 98             pr[3]="1 2 3";
 99             pr[4]="1 2 4";
100             pr[5]="1 2 3 4";
101             for (i=6;i<=10;i++)
102                 pr[i]=pr[i-5]+" 5";
103
104         while (t-->0) {
105             m=in.nextBigInteger();
106
107             g=0;
108             if (m.compareTo(bb[10])>0) {
109                 for (i=maxg;i>5;i--)
110                     if (m.compareTo(b[i])>=0) {
111                         m=m.subtract(b[i]);
112                         g=g+1;
113                         num[g]=i;
114                     }
115             }
116             if (m.compareTo(bb[10])>0)
117                 System.out.println(-1);
118             else {
119                 for (i=1;i<=10;i++)
120                     if (m.compareTo(bb[i])==0)
121                         System.out.print(pr[i]);
122                 if (m.compareTo(bb[0])!=0 && g!=0)
123                     System.out.print(" ");
124                 if (g==0)
125                     System.out.println();
126                 for (i=g;i>=1;i--) {
127                     System.out.print(num[i]);
128                     if (i==1)
129                         System.out.println();
130                     else
131                         System.out.print(" ");
132                 }
133             }
134         }
135     }
136 }
137 /*
138 1 1 1 2 5 21
139
140 1
141 1
142 1
143 2
144 5
145 21
146 233
147 10946
148 5702887
149
150 100
151 1-10
152 11
153 21
154 27
155 */

H. Coloring Game

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12
13 #define ll long long
14
15 const int maxn=1e4+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18 const ll mod=1e9+7;
19
20 ll mul(ll a,ll b)
21 {
22     ll y=1;
23     while (b)
24     {
25         if (b&1)
26             y=y*a%mod;
27         a=a*a%mod;
28         b>>=1;
29     }
30     return y;
31 }
32
33 int main()
34 {
35     int n;
36     scanf("%d",&n);
37     if (n==1)
38         printf("1");
39     else
40         printf("%lld",mul(3,n-2)*4%mod);
41     return 0;
42 }
43 /*
44 1000000000
45 */

K. MORE XOR

找规律

推公式较为复杂,据说用插板法

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std;

#define ll long long

const int maxn=1e5+10;
const int inf=1e9;
const double eps=1e-8;

int f[4][maxn],a[maxn];

int main()
{
//    printf("%d",1^2^5^6^9^10);
    int T,n,q,i,j,k,x,y,s,t,v;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        for (i=1;i<=n;i++)
            scanf("%d",&a[i]);

        for (k=0;k<4;k++)
            for (i=(k==0)?4:k,j=1;i<=n;i+=4,j++)
                f[k][j]=f[k][j-1]^a[i];

        scanf("%d",&q);
        while (q--)
        {
            scanf("%d%d",&i,&j);
            y=(j-i+1)%4;
            if (y==1)
            {
                ///i,i+4,i+8 ...
                x=i%4;
                s=(i+3)/4;
                t=s+(j-i)/4;
                printf("%d\n",f[x][t]^f[x][s-1]);
            }
            else if (y==2)
            {
                x=i%4;
                s=(i+3)/4;
                t=s+(j-i)/4;
                v=f[x][t]^f[x][s-1];

                i++;
                x=i%4;
                s=(i+3)/4;
                t=s+(j-i)/4;
                printf("%d\n",v^f[x][t]^f[x][s-1]);
            }
            else if (y==3)
            {
                i++;
                x=i%4;
                s=(i+3)/4;
                t=s+(j-i)/4;
                printf("%d\n",f[x][t]^f[x][s-1]);
            }
            else
                printf("0\n");
        }
    }
    return 0;
}
/*
1
10
1 2 3 4 5 6 7 8 9 10
100
1 7
*/
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12
13 #define ll long long
14
15 const int maxn=1e4+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18
19 int n=10;
20
21 struct node
22 {
23     int a[30];
24     node operator+(const node &y)
25     {
26         node z;
27         for (int i=1;i<=n;i++)
28             z.a[i]=a[i]+y.a[i];
29         return z;
30     }
31 }f[4][30][30];
32
33 int main()
34 {
35     int i,j,k,l;
36     int x=3;
37     for (i=1;i<=n;i++)
38         f[0][i][i].a[i]=1;
39     for (l=1;l<=x;l++)
40     {
41 //        for (i=1;i<n;i++)
42 //        {
43 //            f[l][i][i]=f[l-1][i][i];
44 //            for (j=i+1;j<=n;j++)
45 //                f[l][i][j]=f[l][i][j-1]+f[l-1][j][j];
46 //        }
47
48         for (i=1;i<=n;i++)
49             for (j=i;j<=n;j++)
50             {
51                 if (i!=j)
52                     f[l][i][j]=f[l][i][j-1];
53                 for (k=i;k<=j;k++)
54                     f[l][i][j]=f[l][i][j]+f[l-1][k][j];
55             }
56     }
57     int y=3;
58     for (i=1;i<=n;i++)
59     {
60         for (j=1;j<=n;j++)
61 //            printf("%d%c",f[y][1][i].a[j],j==n?‘\n‘:‘ ‘);
62             printf("%d%c",f[y][1][i].a[j] &1,j==n?‘\n‘:‘ ‘);
63     }
64     return 0;
65 }
66 /*
67 1 0 0 0 0 0 0 0 0 0
68 1 1 0 0 0 0 0 0 0 0
69 0 1 0 0 0 0 0 0 0 0
70 0 0 0 0 0 0 0 0 0 0
71 1 0 0 0 1 0 0 0 0 0
72 1 1 0 0 1 1 0 0 0 0
73 0 1 0 0 0 1 0 0 0 0
74 0 0 0 0 0 0 0 0 0 0
75 1 0 0 0 1 0 0 0 1 0
76 1 1 0 0 1 1 0 0 1 1
77
78 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
79 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
80 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
81 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
82 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
83 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
87 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0
88 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
91 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0
92 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
93 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
95 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
96 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0
97 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98 */

M. Subsequence

dp

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <iostream>
11 using namespace std;
12
13 #define ll long long
14
15 const int maxn=1e5+10;
16 const int inf=1e9;
17 const double eps=1e-8;
18
19 int f[maxn][128],pre[maxn];
20 char s[maxn];
21
22 int main()
23 {
24     int i,j,len,t;
25     memset(pre,0xff,sizeof(pre));
26     s[0]=‘a‘;
27     scanf("%s",s+1);
28     len=strlen(s+1);
29     for (i=len;i>=0;i--)
30     {
31         for (j=0;j<128;j++)
32             f[i][j]=pre[j];
33         pre[s[i]]=i;
34     }
35     scanf("%d",&t);
36     while (t--)
37     {
38         scanf("%s",s);
39         len=strlen(s);
40         j=f[0][s[0]];
41         for (i=1;i<len;i++)
42         {
43             if (j==-1)
44                 break;
45             j=f[j][s[i]];
46         }
47         if (j!=-1)
48             printf("YES\n");
49         else
50             printf("NO\n");
51     }
52     return 0;
53 }
54 /*
55
56 */

C. Angry FFF Party

数位dp

原来的数据是完全无用的,
只需要火柴棒总数保持一致,
只需要对于每一位,火柴棒加的次数完全一样

不用考虑前导0
+0 -> +9
-0  -> +5

w为数字的位数,y使用的火柴数
f[w][y] 的最大值
f[w][y]=max(f[w-1][y-g[i]]+i*10^(w-1))    i=0..9
w<10,y<w*7+2

-11..1 无法改变
f[1][3]=-1
f[p][p*2+1]=-11..1
其它时候不用减法(至少可以节省一根火柴,使负号变为加号)
这个不成立,在第一个数时(潜在加法)
预处理

对于当前的前x个数字,y为使用的火柴棒总数,以此最大的值
对于第x个数字,位数为w
a[x][y]=max(a[x-1][z]+f[w][z-y])
x<=50,y<=7*50+2*49=448
[49个加号,50个数]

易错点:
+/- 不能单独每一位,而要整体求

正确通过 2019-04-21 00:57 5ms 448kB c++14
  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <string>
  6 #include <algorithm>
  7 #include <set>
  8 #include <map>
  9 #include <queue>
 10 #include <iostream>
 11 using namespace std;
 12
 13 #define ll long long
 14
 15 const int maxn=1e4+10;
 16 const int inf=1e9;
 17 const double eps=1e-8;
 18
 19 /**
 20 其实最多只有9位,
 21 是小于10^9,没有等于
 22
 23 999999999+999999999+...
 24 超过int
 25 **/
 26
 27 int g[10]={6,2,5,5,4,5,6,3,7,6};
 28 int f[12][100];
 29 int mul[12];
 30 ll a[51][500];
 31 int fv[12];
 32 int add[128];
 33 char s[110];
 34
 35 int main()
 36 {
 37     bool vis;
 38     int i,j,k,l,maxw,w,t,n,tot,sum,c;
 39
 40 //    printf("%d\n",‘+‘);///43
 41 //    printf("%d\n",‘-‘);///45
 42     add[43]=2,add[45]=1;
 43     for (i=48;i<48+10;i++)
 44         add[i]=g[i-48];
 45
 46     mul[1]=1;
 47     for (i=2;i<=9;i++)
 48         mul[i]=mul[i-1]*10;
 49
 50     fv[1]=-1;
 51     for (i=2;i<=9;i++)
 52         fv[i]=fv[i-1]*10-1;
 53
 54     memset(f,0x8f,sizeof(f));
 55     f[0][2]=0;///+
 56     for (i=1;i<=10;i++)
 57     {
 58         maxw=(i-1)*7+2;
 59         for (j=0;j<=maxw;j++)
 60             for (l=0;l<=9;l++)  ///或者只要用火柴数在一个数量时最大的数即可
 61                 f[i][j+g[l]]=max(f[i][j+g[l]],f[i-1][j]+l*mul[i]);
 62     }
 63
 64     scanf("%d",&t);
 65     while (t--)
 66     {
 67         memset(a,0x8f,sizeof(a));
 68         scanf("%d",&n);
 69         scanf("%s",s);
 70         tot=0;
 71         vis=0;
 72         sum=0;
 73         a[0][0]=0;
 74         i=0;
 75         c=0;
 76         for (w=0;w<=n;w++)
 77         {
 78             tot+=add[s[w]];
 79             if (s[w]==‘+‘ || s[w]==‘-‘ || w==n)
 80             {
 81                 c++;
 82                 maxw=i*7+2;
 83                 for (j=0;j<=sum;j++)
 84                     for (k=0;k<=maxw;k++)
 85                         ///f[i][k](int memset)相比a[j](ll memset)小很多,减很多次,仍不会到达下界
 86                         a[c][j+k]=max(a[c][j+k],a[c-1][j]+f[i][k]); ///可以使用滚动数组
 87
 88                 if (vis)
 89                     for (j=0;j<=sum;j++)
 90                         a[c][j+2*i+1]=max(a[c][j+2*i+1],a[c-1][j]+fv[i]);
 91
 92                 sum+=maxw; ///当然也可以求出tot后再求
 93                 vis=1;
 94                 i=0;
 95                 continue;
 96             }
 97             else
 98                 i++;
 99         }
100         printf("%lld\n",a[c][tot+2]);  ///第一个加号是没有的
101     }
102     return 0;
103 }
104 /*
105 10
106 11
107 100000000+9
108 13
109 111-111111-11
110 20
111 100000000-99999999+1
112 36
113 10000000+12345+0+1+2+3+4+5+6+7+8+9
114
115 */

未完待续

I. Max answer

J. Distance on the tree

原文地址:https://www.cnblogs.com/cmyg/p/10743597.html

时间: 2024-11-01 15:50:19

The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest的相关文章

The Preliminary Contest for ICPC China Nanchang National Invitational I题

Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values in the interval, multiplied by the smallest value in the interval. Now she is planning to find the max value of the intervals in her array. Can you h

The Preliminary Contest for ICPC China Nanchang National Invitational I.Max answer单调栈

题面 题意:一个5e5的数组,定义一个区间的值为 这个区间的和*这个区间的最小值,注意数组值有负数有正数,求所有区间中最大的值 题解:如果全是正数,那就是原题 POJ2796 单调栈做一下就ok 我们现在有负数,考虑这段区间,他的和必须是负数,由于导致和为负数,最小值一定也是负数, 那对于这样一个和为负的区间进行扩展的时候,遇见下一个数,是负数,我们一定会扩展,无论这个负数大小 遇见下一个是正数,如果和没有变正,那就可以继续扩展下去(不更新答案罢了) 所以我们对于那些和为负的区间,单独统计一下答

The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest C. Xyjj’s sequence(动态规划+欧拉降幂)

题目链接:https://nanti.jisuanke.com/t/40255 中文题面: 解题思路:先用欧拉降幂求出A,B两个序列,定义dp[0][i][j]为取A的前i个元素,B的前j个元素,且C的最后一个元素为B[j],同理dp[1][i][j]为取A的前i个元素,B的前j个元素,且C的最后一个元素为A[i],那么就很容易得到状态转移方程.那么最后答案即为max(dp[0][n][n],dp[1][n][n]).还有值得注意的是:该题需要使用滚动数组,不然会超内存. 在此贴两个关于欧拉降幂

The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest E. Interesting Trip 长链剖分

题库链接 考虑莫比乌斯, 套上去之后就是变成了统计长度为d的一共有多少路径, 直接长链剖分, 在计蒜客上极度卡常, 卡了一万年才卡过去, 现场好像还有用点分治过去的, 这都能过?? #include<bits/stdc++.h> #define LL long long using namespace std; const int N = (int)5e5 + 7; const int M = 30000; int n, d, a[N], vis[N], miu[M + 1]; int now

The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)

题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+1)\oplus ...\oplus f(l,r)\oplus f(l+1,l+1)\oplus ...f(l+1,r)\oplus ...\oplus f(r,r)$,有两种操作,第一种将数组中某个元素$a[x]$变为$y$,第二种计算$F(l,r)$的值. 思路:打表后发现只有当$l$和$r$同

The Preliminary Contest for ICPC Asia Nanchang 2019

目录 Solutions B. Fire-Fighting Hero E. Magic Master Link Solutions B. Fire-Fighting Hero 题意: 思路: dijkstra最短路 先以 hero 为起点 跑一遍 dijkstra 建立 起点 \(p\) 并与各 fire-fighting point 建立权为 \(0\) 的边,跑一遍 dijkstra 第二次 dijkstra 中 dis[i] 为各 fire-fighting point 到各点的最短路径中

C:Dawn-K&#39;s water (The Preliminary Contest for ICPC Asia Shenyang 2019)

Dawn-K recently discovered a very magical phenomenon in the supermarket of Northeastern University: The large package is not necessarily more expensive than the small package. On this day, Dawn-K came to the supermarket to buy mineral water, he found

The Preliminary Contest for ICPC Asia Shenyang 2019

The Preliminary Contest for ICPC Asia Shenyang 2019 Texas hold'em Poker #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; int num[1000]; int shun(){ for (int i=15;i>=5;i--){ if (num[i]&&num[i-1]&&num[i-2]&&a

The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)

The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门:https://nanti.jisuanke.com/t/41400 题意: 给你三个数组a,b,c,要你求有多少个三元组(i,j,k),使得 \[ \begin{array}{l}{\left|A_{i}-B_{j}\right| \leq C_{k}, \text { and }} \\ {\left|B_{j}-C_{k}\right| \leq