第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)(重现赛)

C:

很简单一道签到题,3不用管,把1和2先尽可能合并掉,然后剩下的自己合并。

打的时候2合并了两次一直算成代价2,死活过不去        本周+5道罚题

下附代码:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 int main(){
 5     ll a,b,c;
 6     scanf("%lld%lld%lld",&a,&b,&c);
 7     if (a==b){
 8         ll ret=a*2;
 9         printf("%lld",ret);
10     }
11     else if (a>b){
12         ll ret=b*2;
13         a-=b;
14         ret+=3*(a/3);
15         if (a%3==2) ret+=1;
16         printf("%lld",ret);
17     }
18     else {
19         ll ret=a*2;
20         b-=a;
21         ret+=6*(b/3);
22         if (b%3==2) ret+=4;
23         printf("%lld",ret);
24     }
25 }
View Code

 

D:

排序完之后按照相同的R作为等级,按照L赋值。

题目里说了排名大等于原来,也就是说本来要差的几个人往前面并列是可以接受的,打的时候没看见,wa了好久。

再加+5罚题

下附代码:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 struct node{
 5     ll l,r,w;
 6 }a[100005];
 7 bool cmp(node x,node y){
 8     return x.r<y.r;
 9 }
10 int main(){
11     int n;
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++){
14         scanf("%lld%lld",&a[i].l,&a[i].r);
15     }
16     sort(a+1,a+1+n,cmp);
17     ll sum=0;
18     ll maxl=0;
19     a[0].r=a[1].r-1;
20     ll num=0;
21     a[n+1].r=a[n].r+1;
22     for(int i=1;i<=n+1;i++){
23         if(a[i].r!=a[i-1].r){
24             sum+=num*maxl;
25             maxl=max(maxl,a[i].l);
26             num=1;
27         }
28         else {
29             maxl=max(1ll*a[i].l,maxl);
30             num++;
31         }
32     }
33     printf("%lld\n",sum);
34 }
View Code

 

 

L:

数位DP,处理出除了后七位以外其他的1的奇偶性以及进位后的奇偶性,然后直接枚举找答案。

下附代码:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll dp[100][2][2],a[105];
 5 ll dim[100];
 6 ll m,l;
 7 ll cal(int jb,int sum,int st){
 8     ll ret=0,maxn=127;
 9     if (jb) maxn=l%128;
10     for (int i=0; i<=maxn; i++){
11         int flag=1;
12         for (int j=0; j<m; j++){
13             if (i+j<128){
14                 if ((__builtin_parity(i+j)^sum)!=a[j]){
15                     flag=0;
16                     break;
17                 }
18             }
19             else if ((__builtin_parity(i+j)^sum^st)!=a[j]){
20                 flag=0;
21                 break;
22             }
23         }
24         if (flag) ret++;
25     }
26     return ret;
27 }
28 ll dfs(int x,int sum,int st,int jb){
29     if (x<=7){
30         return cal(jb,sum,st);
31     }
32     if (!jb && dp[x][sum][st]!=-1) return dp[x][sum][st];
33     int maxn=1;
34     if (jb) maxn=dim[x];
35     ll ret=0;
36     for (int i=0; i<=maxn; i++){
37         if (i==1) ret+=dfs(x-1,sum^i,st^1,(jb==1 && maxn==i));
38         else ret+=dfs(x-1,sum,0,(i==maxn && jb==1));
39     }
40     if (!jb) return dp[x][sum][st]=ret;
41     return ret;
42 }
43 int main(){
44     int T;
45     scanf("%d",&T);
46     while (T--){
47         memset(dp,-1,sizeof(dp));
48         scanf("%lld%lld",&m,&l);
49         for (int i=0; i<m; i++) 
50             scanf("%lld",&a[i]);
51         ll tmp=l;
52         int len=0;
53         while (tmp){
54             dim[++len]=tmp%2;
55             tmp/=2;
56         }
57         printf("%lld\n",dfs(len,0,0,1));
58     }
59 }
View Code

 

posted @ 2021-01-31 21:15  我是菜狗QAQ  阅读(152)  评论(0编辑  收藏  举报