获取中...

-

Just a minute...

Codeforces Round #576 (Div. 2)

A.City Day

啊,爆哭,还想着怎么能优化一下,感觉会超时

结果优化wa了,真好,那就纯暴力

对每一个a,都找到l,r判断区间符不符合条件

注意0天的时候就好

B.Water Lily

贼气,杆子的长度是不变的,设x解出来

C.MP3

题目思路:

题意是如果有K种数字,转化为系数$k = log_2K$,就需要nk个bit储存,让你选一个区间(l,r),使得数字可以存的下,并且删的数字最少,问你最少删除多少个数字

现在给了你N个数字,还有M个bity

所以现在就有8Mbit,k = 8 * M / N;(向下取整)

K就等于了$2 ^k$,所以我们最多能有K种数字

读入数字的时候记录下有多少种和数量(map)

然后计算出最多能存多少种数字

如果存不下就要删减,因为删的种数是确定的,把数排序好之后,你只能从左边拿一部分,右边拿一部分,(因为你选的是区间l,r,不能从中间随便挑数字删)枚举找到最小就好了

题目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
LL T,N,M,K;
/*-------------------------------------------------------------------------------------------*/
map<int,int> cnt;
set<int> num;
vector<int> a;
int sumcnt[MAX];
/* ------------------------------------------------------------------------------------------*/

int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("input.in","r",stdin);
//freopen("output.out","w",stdout);
/* -----------------------------------------------------------------------------------------*/
cin >> N >> M;
int x;
for(int i = 0;i < N;i++)
{
cin >> x;
num.insert(x);
cnt[x]++;
}
M *= 8;
if(N == 0)
{
cout << "0" <<endl;
return 0;
}
int k = M / N;
if(k > 30)
{
cout << 0 << endl;
return 0;
}
K = 1<<k;
//cout << K <<endl;
for(auto it = num.begin();it != num.end();it++)
{
a.push_back(*it);
}
int len = a.size();
for(int i = len-1;i >= 0;i--)
{
sumcnt[i] = sumcnt[i+1] + cnt[a[i]];
}
int ans = INF,temp;
if(num.size() <= K)
{
cout << 0 <<endl;
return 0;
}
else
{
K = len - K;
int sum = 0;
int cntm = 0;
temp = sumcnt[len - K];
ans = min(ans,temp);
for(int i = 0;i < len;i++)
{
if(cntm == K) break;
cntm++;
sum += cnt[a[i]];
temp = sum;
temp += sumcnt[len - K + cntm];
ans = min(ans,temp);
}
}
cout << ans <<endl;
return 0;
}

D.Welfare State

题意就是给你一个数组,有俩个操作

1.把a[i]变为x

2.把小于x的所有a[i]变为x(发福利)

问你最后数组是什么

题目思路:

一开始想着是把改变的操作记住,然后每到发福利的时候,更新一次,找到他发福利之前是多少钱,发完多少钱

但是仔细想一下,根本没有必要,操作1是把一个数变为了x,而不是增减x

我们可以发现,福利对一个数的影响为在他最后一次改变之后发的福利中的最大福利

所以说我们只需要记住,每个数最后一次操作1变为了什么,他是在哪一次福利之后变得就可以

然后我们处理出来每一次福利之后后面最大的福利是什么就可以了

题目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*-------------------------------------------------------------------------------------------*/
int a[MAX];//初始数组
int reduce[MAX];//改变为的值
int flag[MAX];//还能享受的福利开始点
int dp[MAX];//之后福利最大值
vector<int> pay;//福利按顺序
/* ------------------------------------------------------------------------------------------*/

void find_max()
{
int tempmax;
for(int i = pay.size()-1;i >= 0;i--)
{
dp[i] = max(dp[i+1],pay[i]);
}
}

int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("input.in","r",stdin);
//freopen("output.out","w",stdout);
/* -----------------------------------------------------------------------------------------*/
cin >> N;
for(int i = 1;i <= N;i++)
{
cin >> a[i];
}
cin >> M;
int sign,pos,x;
vector<int> change;
while(M--)
{
cin >> sign;
if(sign == 1)
{
cin >> pos >> x;
reduce[pos] = x;
change.push_back(pos);
}
else
{
cin >> x;
for(int i = 0;i < change.size();i++)
{
int p = change[i];
flag[p] = pay.size()+1;
a[p] = reduce[p];
a[p] = max(a[p],x);
}
change.clear();
pay.push_back(x);
}
}
for(int i = 0;i < change.size();i++)
{
int p = change[i];
flag[p] = pay.size()+1;
a[p] = reduce[p];
}
find_max();
for(int i = 1;i <= N;i++)
{
cout << max(a[i],dp[flag[i]]);
if(i != N) cout << " ";
}
return 0;
}
相关文章
评论
分享
  • ECF-70-2

    Educational Codeforces Round 70 (Rated for Div. 2)A.You Are Given Two Binary Strings乘2^k次,其实就是把二进制左移了k位 加法就是对应位加就好了,然...

    ECF-70-2
  • CF-577-2

    Codeforces Round #577 (Div. 2)A.Important Exam问学生分数总和最大为多少 那么就是每道题选的最多的选项为答案,计算即可 B.Zero Array如果sum是奇数的一定不行 如果是偶数的话就看...

    CF-577-2
  • CF-569-2

    吹爆这一场,第一次打到这么前,虽然赛后打得 Codeforces Round #569 (Div. 2)A.Alex and a Rhombus每次增多(i-1)*4个 B.Nick and Array他的操作真正的意思就是,变负数绝...

    CF-569-2
  • ECF-69-2

    Educational Codeforces Round 69 (Rated for Div. 2)A.DIY Wooden Ladder找最长的的俩个,然后看是能放的木板多,还是给的木板多 B.Pillars观察发现这个序列有三种情...

    ECF-69-2
  • CF-575-3

    Codeforces Round #575 (Div. 3)A.Three Piles of Candies傻逼题,一人拿一堆,剩下一堆还能随便分,加起来除2 B.Odd Sum Segments一个序列里只有奇数个奇数时和才是奇数 ...

    CF-575-3
  • CF-574-2

    Codeforces Round #574 (Div. 2)A.Drinks Choosing就把可以凑对的凑在一起,不能的俩俩组合 B.Sport Mafia题目思路:算出全放糖果的sum,算出与留下糖果的差cha 可知,每少放一次...

    CF-574-2
  • CF-571-2

    Codeforces Round #571 (Div. 2)Vus the Cossack and a Contestm,k都不小于n Vus the Cossack and Strings通过观察可以发现当字符串中’1’的数量奇偶相...

    CF-571-2
  • ECF-68-2

    Educational Codeforces Round 68 (Rated for Div. 2)Remove a Progression找到规律,隔一个删一个 Yet Another Crosses Problem这个气死了,存的...

    ECF-68-2
  • CF-559-2(未完待续)

    就学了一个lower把,先放在这里 还要学习读题23333 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748...

    CF-559-2(未完待续)
  • CF-554-2(未完待续)

    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263...

    CF-554-2(未完待续)
Please check the parameter of comment in config.yml of hexo-theme-Annie!