2018-2019 ACM-ICPC, Asia Nanjing Regional Contest

 

https://codeforces.com/gym/101981

 

Problem A. Adrien and Austin

贪心,注意细节

f[x]=1:先手必赢。

f[x]: 分成两部分(或一部分),长度分别为a和b,只要存在f[a] xor f[b]=0,则f[x]=1。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define minv 1e-6
 5 #define inf 1e9
 6 #define pi 3.1415926536
 7 #define nl 2.7182818284
 8 const ll mod=1e9+7;//998244353
 9 const int maxn=1e5+10;
10 
11 
12 int main()
13 {
14     int n,k;
15     scanf("%d%d",&n,&k);
16     if (k==1)
17     {
18         if (n & 1)
19             printf("Adrien");
20         else
21             printf("Austin");
22     }
23     else if (n==0)
24         printf("Austin");
25     else
26         printf("Adrien");
27     return 0;
28 }

 

Problem D. Country Meow

三分套三分套三分

某种三分的写法是不行的!(x x+minv 精度不够)

 

拓展:

in k-dimension Cartesian coordinate, find a point that sum of Euclidean distance from some points to it is smallest

k次三分

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define minv 1e-8
 5 #define inf 1e9
 6 #define pi 3.1415926536
 7 #define nl 2.7182818284
 8 const ll mod=1e9+7;//998244353
 9 const int maxn=1e2+10;
10 
11 double dx[maxn],dy[maxn],dz[maxn],value=1e-8;
12 int n;
13 
14 double Euc(int i,double xx,double yy,double zz)
15 {
16     return sqrt((dx[i]-xx)*(dx[i]-xx) + (dy[i]-yy)*(dy[i]-yy) + (dz[i]-zz)*(dz[i]-zz));
17 }
18 
19 double dist(double xx,double yy,double zz)
20 {
21     double re=0;
22     int i;
23     for (i=1;i<=n;i++)
24         re=max(re,Euc(i,xx,yy,zz));
25     return re;
26 }
27 
28 double work3(double x,double y)
29 {
30     double zl=-100000,zr=100000,z1,z2,d1,d2;
31     while (zr-zl>value)
32     {
33         z1=(zl+zr)/2;
34         z2=(z1+zr)/2;
35         d1=dist(x,y,z1);
36         d2=dist(x,y,z2);
37         if (d1>d2)
38             zl=z1;
39         else
40             zr=z2;
41     }
42     return min(d1,d2);
43 }
44 
45 double work2(double x)
46 {
47     double yl=-100000,yr=100000,y1,y2,d1,d2;
48     while (yr-yl>value)
49     {
50         y1=(yl+yr)/2;
51         y2=(y1+yr)/2;
52         d1=work3(x,y1);
53         d2=work3(x,y2);
54         if (d1>d2)
55             yl=y1;
56         else
57             yr=y2;
58     }
59     return min(d1,d2);
60 }
61 
62 double work1()
63 {
64     double xl=-100000,xr=100000,x1,x2,d1,d2;
65     while (xr-xl>value)
66     {
67         x1=(xl+xr)/2;
68         x2=(x1+xr)/2;
69         d1=work2(x1);
70         d2=work2(x2);
71         if (d1>d2)
72             xl=x1;
73         else
74             xr=x2;
75     }
76     return min(d1,d2);
77 }
78 
79 int main()
80 {
81     int i;
82     scanf("%d",&n);
83     for (i=1;i<=n;i++)
84         cin>>dx[i]>>dy[i]>>dz[i];
85     printf("%.10f",work1());
86     return 0;
87 }

 

Problem E. Eva and Euro coins

看错题意了,难受!

 

Problem G. Pyramid
急需队友协助。。。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define minv 1e-6
 5 #define inf 1e9
 6 #define pi 3.1415926536
 7 #define nl 2.7182818284
 8 const ll mod=1e9+7;//998244353
 9 const int maxn=1e5+10;
10 
11 ll pow(ll a,ll b)
12 {
13     ll y=1;
14     while (b)
15     {
16         if (b & 1)
17             y=y*a%mod;
18         a=a*a%mod;
19         b>>=1;
20     }
21     return y;
22 }
23 
24 int main()
25 {
26     int t;
27     ll sum,v,vv,n,ni2=pow(2ll,mod-2),ni3=pow(3ll,mod-2),ni4=pow(4ll,mod-2),ni6=pow(6ll,mod-2);
28     scanf("%d",&t);
29     while (t--)
30     {
31         scanf("%lld",&n);
32         sum=0;
33         sum=(sum + n*(n+1)%mod*(n+2)%mod*ni6 )%mod;
34 
35         v=0;
36         v=(v + (n-1)*n%mod*(n+1)%mod*ni6 )%mod;
37         if (n & 1)
38             v=(v + (n*n-1)%mod*ni4 )%mod;
39         else
40             v=(v + (n*n)%mod*ni4 )%mod;
41         sum=(sum + v*ni2 )%mod;
42 
43         v=0;
44         v=(v + (n-2)*(n-1)%mod*n%mod*(n+1)%mod*ni4 )%mod;
45 
46         vv=0;
47         vv=(vv + (n-2)*(n-1)%mod*n%mod*ni6 )%mod;
48         if (n & 1)
49             vv=(vv + (n-1)*(n-1)%mod*ni4 )%mod;
50         else
51             vv=(vv + ((n-1)*(n-1)-1)%mod*ni4 )%mod;
52         v=(v + vv*3)%mod;
53         sum=(sum + v*ni6 )%mod;
54 
55         printf("%lld\n",(sum+mod)%mod);
56     }
57     return 0;
58 }

 

Problem I. Magic Potion

网络最大流。

差点以为是上下界网络流,看到这么多人对,感觉特别诧异。。。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define minv 1e-6
  5 #define inf 1e9
  6 #define pi 3.1415926536
  7 #define nl 2.7182818284
  8 const ll mod=1e9+7;//998244353
  9 const int maxn=1e3+10;
 10 
 11 struct node
 12 {
 13     int d,len;
 14     node *next,*opp;
 15 }*e[maxn],*pre[maxn];
 16 
 17 queue<int> st;
 18 int s,t,sum=0,add[maxn];
 19 bool vis[maxn];
 20 
 21 void add_edge(int x,int y,int len)
 22 {
 23     node *p1=(node*) malloc (sizeof(node));
 24     node *p2=(node*) malloc (sizeof(node));
 25 
 26     p1->d=y;
 27     p1->len=len;
 28     p1->next=e[x];
 29     p1->opp=p2;
 30     e[x]=p1;
 31 
 32     p2->d=x;
 33     p2->len=0;
 34     p2->next=e[y];
 35     p2->opp=p1;
 36     e[y]=p2;
 37 }
 38 
 39 void bfs()
 40 {
 41     int d,dd,v;
 42     node *p;
 43     while (1)
 44     {
 45         memset(vis,0,sizeof(vis));
 46         memset(add,0,sizeof(add));
 47         add[s]=inf;
 48         vis[s]=1;
 49         st.push(s);
 50         while (!st.empty())
 51         {
 52             d=st.front();
 53             st.pop();
 54             p=e[d];
 55             while (p)
 56             {
 57                 dd=p->d;
 58                 v=min(add[d],p->len);
 59                 if (add[dd]<v)
 60                 {
 61                     add[dd]=v;
 62                     pre[dd]=p->opp;
 63                     if (!vis[dd])
 64                     {
 65                         vis[dd]=1;
 66                         st.push(dd);
 67                     }
 68                 }
 69                 p=p->next;
 70             }
 71             vis[d]=0;
 72         }
 73 
 74         if (add[t]==0)
 75             return;
 76 
 77         sum+=add[t];
 78         d=t;
 79         while (d!=s)
 80         {
 81             pre[d]->len+=add[t];
 82             pre[d]->opp->len-=add[t];
 83             d=pre[d]->d;
 84         }
 85     }
 86 }
 87 
 88 int main()
 89 {
 90     int n,m,k,d,g,i;
 91     scanf("%d%d%d",&n,&m,&k);
 92     s=n+m+2,t=n+m+1;
 93     add_edge(s,0,k);
 94     for (i=1;i<=n;i++)
 95     {
 96         add_edge(s,i,1);
 97         add_edge(0,i,1);
 98     }
 99     for (i=n+1;i<=n+m;i++)
100         add_edge(i,t,1);
101     for (i=1;i<=n;i++)
102     {
103         scanf("%d",&g);
104         while (g--)
105         {
106             scanf("%d",&d);
107             add_edge(i,n+d,1);
108         }
109     }
110     bfs();
111     printf("%d",sum);
112     return 0;
113 }

 

Problem J. Prime Game

预处理一个数的所有质因数。

同一个质因数,分段处理。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define minv 1e-6
 5 #define inf 1e9
 6 #define pi 3.1415926536
 7 #define nl 2.7182818284
 8 const ll mod=1e9+7;//998244353
 9 const int maxn=1e6+10;
10 
11 int zhi[maxn],zys[maxn][10],s[maxn],a[maxn];
12 bool vis[maxn];
13 
14 int main()
15 {
16     int n,g=0,value=1e6,i,j,k,l;
17     ll sum=0;
18     for (i=2;i<=value;i++)
19     {
20         if (!vis[i])
21         {
22             zhi[++g]=i;
23             zys[i][0]=1;
24             zys[i][1]=g;
25         }
26         for (j=1;j<=g;j++)
27         {
28             k=i*zhi[j];
29             if (k>value)
30                 break;
31             if (i%zhi[j]==0)
32             {
33                 zys[k][0]=zys[i][0];
34                 for (l=1;l<=zys[i][0];l++)
35                     zys[k][l]=zys[i][l];
36             }
37             else
38             {
39                 zys[k][0]=zys[i][0]+1;
40                 zys[k][1]=j;
41                 for (l=1;l<=zys[i][0];l++)
42                     zys[k][l+1]=zys[i][l];
43             }
44             vis[k]=1;
45             if (i%zhi[j]==0)
46                 break;
47         }
48     }
49 
50     scanf("%d",&n);
51     for (i=1;i<=n;i++)
52         scanf("%d",&a[i]);
53     for (i=1;i<=n;i++)
54     {
55         k=a[i];
56         for (j=1;j<=zys[k][0];j++)
57         {
58             sum+=1ll*(i-s[zys[k][j]])*(n-i+1);
59             s[zys[k][j]]=i;
60         }
61     }
62     printf("%lld",sum);
63     return 0;
64 }

 

Problem K. Kangaroo Puzzle

一旦两个数在一起,那么两个数之后永远都在一起

神仙方法!(看n,m数据那么小,操作次数那么多……)

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <ctime>
 5 #include <cstring>
 6 #include <string>
 7 #include <map>
 8 #include <set>
 9 #include <list>
10 #include <queue>
11 #include <stack>
12 #include <vector>
13 #include <bitset>
14 #include <algorithm>
15 #include <iostream>
16 using namespace std;
17 #define ll long long
18 const int maxn=1e5+10;
19 
20 char str[5]="LRUD";
21 
22 int main()
23 {
24     int g=10;//50000
25     srand(time(NULL));
26     for (int i=1;i<=g;i++)
27         printf("%c",str[rand()%4]);
28     return 0;
29 }

 

Problem M. Mediocre String Problem

以待后续埋坑

网络赛也有一题Manacher的

 

posted @ 2018-11-17 23:38  congmingyige  阅读(1107)  评论(0编辑  收藏  举报