码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #627 (Div. 3)

时间:2020-03-13 18:22:58      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:line   size   超出   display   printf   hid   bit   clu   signed   

A 只有判段相邻的差是不是有奇数,有奇数NO,反之YES

B 因为题目说随便两个相等+另一个数就是YES,所以map存第一次出现的数字的位置,如果再次出现,只要那个数的第一个位置不是i-1就是YES反之NO

C蛋疼题意,其实只要找两个RR之间最短的距离就行了

D

题意:

老师的n个想法价值ai,同学的n个想法价值bi,相互对应,找一共有多少对 ai+aj-bi-bj>0

思路:
直接将老师的思路减学生的思路,从小到大排序,用upper_lound去找他的相反数的大一点的位置,复杂度是O(lgn*n)

但是n是2e5的范围,答案可能会爆int,别忘了开ll

 

E

题意(题目描述进行魔改,但内容大致不变):

给n,h,l,r 四个值,表示n长度的数组,0~h-1的范围,在【l,r】区间得分能获得一个奖品(1<=n<=2000)

接下来的n个数,是按顺序的比赛得分,但是你有一个权力,每次得分可以保持不变,或者减一,进行累加,如果超出h,%h,问最多有多少奖品

思路:

dp【i】【j】,i表示第i个数字,j表示前面减了几次一,状态转移方程就是

cc数字i 全部累加情况(无减一)- j,这里有一个坑就是cc可能小于0,一定要while(cc<0)cc+h;而不是(cc+h)%h,因为这个h可能过小。//u1s1,比赛的时候如果写出,也会在这里被hack,因为惯性思维下意识写了(cc+h)%h

k=(l<=cc && r>=cc);

dp[i][j]=max(dp[i-1][j-1]+k,dp[i-1][j]+k); (当j==0的时候特判一下,因为没有-1这种

再最好比较max(dp【n】【i】0<=i<=n)中

技术图片
 1 #include<iostream>
 2 #include<map>
 3 #include<set>
 4 #include<queue>
 5 #include<stdio.h>
 6 #include<string.h>
 7 #include<algorithm>
 8 using namespace std;
 9 #define ll long long
10 #define ull unsigned long long
11 #define il inline
12 #define it register int
13 #define inf 0x3f3f3f3f
14 #define lowbit(x) (x)&(-x)
15 #define pii pair<int,int>
16 #define mak(n,m) make_pair(n,m)
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define mod 998244353
19 const int maxn=2e3+10;
20 int n,m,t,h,l,r;
21 int a[maxn],dp[maxn][maxn];
22 int zhi[maxn][2];
23 int main(){
24     scanf("%d%d%d%d",&n,&h,&l,&r);
25     int ans=0,c=0;mem(dp,0);
26     for(it i=1;i<=n;i++){
27         scanf("%d",&a[i]);
28     }
29     for(it i=1;i<=n;i++){
30         c+=a[i];c%=h;
31         if(l<=c && r>=c){
32             dp[i][0]=dp[i-1][0]+1;
33         }
34         else{
35             dp[i][0]=dp[i-1][0];
36         }
37         for(it j=1;j<=i;j++){
38             int cc=(c-j+h)%h;while(cc<0){cc+=h;}
39             if(l<=cc && r>=cc){
40                 dp[i][j]=max(dp[i-1][j-1]+1,dp[i-1][j]+1);
41             }
42             else{
43                 dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
44             }
45         }
46     }
47     for(int i=0;i<=n;i++){
48         ans=max(dp[n][i],ans);
49     }
50     printf("%d\n",ans);
51     return 0;
52 }
View Code

 

F是个树

cf现在进不去,D题代码待会再放

Codeforces Round #627 (Div. 3)

标签:line   size   超出   display   printf   hid   bit   clu   signed   

原文地址:https://www.cnblogs.com/luoyugongxi/p/12488050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!