读题总是读错是不是没救了。。。

T1 Median

中位数:按顺序排列的一组数据中居于中间位置的数。

能用上的高亮符号都用上了。。。

当时忘了就离谱。。。。

理解什么是中位数(真是个憨憨)后就可以开始理解题目了

线性筛素肯定用上

然后按照$k$的奇偶性进行分类求解

用一个东西,叫经典指针,我们都这么叫它

用它标记每段序列的中间数,因为扫一边相当与一个移动窗口滑动,每次序列里改变的元素只有头和尾

所以就移动指针就行了,因为$S_2$序列明显是在教你如何随机数,他的单调性在一定区间内是有保证的

所以指针位移不会太大

奇数用单指针,偶数用双指针

关于巨大的常数:

这题调了好久,最后什么方法都用了。

偶然将%换成同等意义的-*/,他就对了

发现%真是个好东西,反正我的代码筛素数的时候不能用%,把%换成-,*,/的组合可以降低复杂度至少

$17second$ 就离谱。。。。。。

 1 #include<bits/stdc++.h>
2 #define LL long long
3 #define rin register int
4 using namespace std;
5 inline int read(){
6 int x=0,f=1; char ch=getchar();
7 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
8 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
9 return x*f;
10 }
11 const int NN=1e7+2;
12 int n,k,w,prime[NN],cnt;
13 bool vis[200000000];
14 int s[NN],g[NN],bin[NN],use[NN];
15 inline void getprime(){
16 for(rin i=2;cnt<n;i++){
17 if(!vis[i]) prime[++cnt]=i;
18 for(rin j=1;j<=cnt&&i*prime[j]<=200000000;j++){
19 vis[i*prime[j]]=1;
20 if(i/prime[j]*prime[j]==i) break;
21 }
22 }
23 }
24 inline void work1(){
25 LL ans=0;
26 sort(use+1,use+k+1);
27 int it=use[k/2+1],l=0;
28 for(rin i=1;i<=k;++i) ++bin[g[i]];
29 for(rin i=1;i<it;++i) l+=bin[i];
30 ans+=it;
31 for(rin i=2;i<=n-k+1;++i){
32 --bin[g[i-1]]; ++bin[g[i+k-1]];
33 if(g[i-1]<it) --l;
34 if(g[i+k-1]<it) ++l;
35 if(l+bin[it]<=k/2){
36 l+=bin[it]; ++it;
37 while(!bin[it]) ++it;
38 }
39 if(l>=1+k/2){
40 --it;
41 while(!bin[it]) --it;
42 l-=bin[it];
43 }
44 ans+=it;
45 } printf("%.1lf\n",ans*1.0);
46 }
47 inline void work2(){
48 LL ans=0;
49 sort(use+1,use+k+1);
50 int it1=use[k>>1],it2=use[(k>>1)+1],l1=0,l2=0;
51 for(rin i=1;i<=k;++i) ++bin[g[i]];
52 for(rin i=1;i<it1;++i) l1+=bin[i];
53 it1==it2 ? l2=l1 : l2=l1+bin[it1];
54 ans+=it1+it2;
55 for(rin i=2;i<=n-k+1;++i){
56 --bin[g[i-1]]; ++bin[g[i+k-1]];
57 if(g[i-1]<it1) --l1;
58 if(g[i+k-1]<it1) ++l1;
59 if(g[i-1]<it2) --l2;
60 if(g[i+k-1]<it2) ++l2;
61 if(l1+bin[it1]<k/2){
62 l1+=bin[it1]; ++it1;
63 while(!bin[it1]) ++it1;
64 }
65 if(l1>=k/2){
66 --it1;
67 while(!bin[it1]) --it1;
68 l1-=bin[it1];
69 }
70 if(l2+bin[it2]<k/2+1){
71 l2+=bin[it2]; ++it2;
72 while(!bin[it2]) ++it2;
73 }
74 if(l2>=k/2+1){
75 --it2;
76 while(!bin[it2]) --it2;
77 l2-=bin[it2];
78 }
79 ans+=it1+it2;
80 } printf("%.1lf\n",ans/2.0);
81 }
82 namespace WSN{
83 inline int main(){
84 n=read(); k=read(); w=read();
85 getprime();
86 for(rin i=1;i<=n;++i) s[i]=1ll*prime[i]*i%w;
87 for(rin i=1;i<=n;++i) g[i]=s[i]+s[i/10+1];
88 for(rin i=1;i<=k;++i) use[i]=g[i];
89 if(k&1) work1();
90 if(!(k&1)) work2();
91 return 0;
92 }
93 }
94 signed main(){return WSN::main();}

T2 Game

还是经典指针,用桶记录出现次数,扫一边就可以了

不用取$abs$,不过我也不知道为什么,就当题目里面没说吧。。。

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int max(int a,int b){return a>b?a:b;}
5 inline int read(){
6 int x=0,f=1; char ch=getchar();
7 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
8 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
9 return x*f;
10 }
11 const int NN=100005;
12 int n,K,a[NN],cnt[NN],ans1,ans2,it,rond;
13 namespace WSN{
14 inline int main(){
15 n=read();K=read();
16 for(int i=1;i<=n;i++) a[i]=read();
17 while(K--){
18 int p=read();
19 it=ans1=ans2=0,rond=1;
20 for(int i=1;i<=p;i++)
21 cnt[a[i]]++, it=max(it,a[i]);
22 cnt[it]--; ans1+=it; rond++;
23 for(int i=1;i<=n-p;i++){
24 while((!cnt[it])&&it) it--;
25 if(it<=a[i+p]){
26 rond&1 ? ans1+=a[i+p] : ans2+=a[i+p];
27 rond++; continue;
28 }
29 cnt[a[i+p]]++; cnt[it]--;
30 rond&1 ? ans1+=it : ans2+=it;
31 rond++;
32 }
33 while((!cnt[it])&&it) it--;
34 while(cnt[it]){
35 cnt[it]--;
36 rond&1 ? ans1+=it : ans2+=it;
37 while((!cnt[it])&&it) it--;
38 rond++;
39 }
40 printf("%lld\n",ans1-ans2);
41 }
42 return 0;
43 }
44 }
45 signed main(){return WSN::main();}

T3 Park

树形$dp$好题,状态转移记录一个$up$一个$down$

鸣谢HEOI动动,写dp太麻烦了。。。

然后因为正序枚举情况不全

再$reverse$ 倒序枚举一遍即可

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
8 return x*f;
9 }
10 const int NN=1e6+2;
11 int n,v,p[NN],sum[NN];
12 int up[NN][101],dw[NN][101],ans;
13 vector<int> g[NN];
14 inline void dfs(int f,int x){
15 sum[x]+=p[f];
16 for(int i=0;i<g[x].size();i++){
17 int y=g[x][i];if(y==f) continue;
18 dfs(x,y); sum[x]+=p[y];
19 }
20 }
21 inline void dp(int f,int x){
22 for(int i=1;i<=v;i++){
23 up[x][i]=sum[x];
24 dw[x][i]=sum[x]-p[f];
25 }
26 for(int i=0;i<g[x].size();i++){
27 int y=g[x][i];
28 if(y==f) continue;
29 dp(x,y);
30 for(int j=1;j<v;j++)
31 ans=max(ans,up[x][j]+dw[y][v-j]);
32 for(int j=1;j<=v;j++){
33 up[x][j]=max(up[x][j],max(up[y][j],up[y][j-1]+sum[x]-p[y]));
34 dw[x][j]=max(dw[x][j],max(dw[y][j],dw[y][j-1]+sum[x]-p[f]));
35 }
36 }
37 reverse(g[x].begin(),g[x].end());
38 for(int i=1;i<=v;i++){
39 up[x][i]=sum[x];
40 dw[x][i]=sum[x]-p[f];
41 }
42 for(int i=0;i<g[x].size();i++){
43 int y=g[x][i];
44 if(y==f) continue;
45 for(int j=1;j<v;j++)
46 ans=max(ans,up[x][j]+dw[y][v-j]);
47 for(int j=1;j<=v;j++){
48 up[x][j]=max(up[x][j],max(up[y][j],up[y][j-1]+sum[x]-p[y]));
49 dw[x][j]=max(dw[x][j],max(dw[y][j],dw[y][j-1]+sum[x]-p[f]));
50 }
51 }
52 ans=max(ans,max(up[x][v],dw[x][v]));
53 }
54 namespace WSN{
55 inline int main(){
56 n=read(); v=read(); if(!v) {puts("0");return 0;}
57 for(int i=1;i<=n;i++) p[i]=read();
58 for(int i=1;i<n;i++){
59 int x=read(),y=read();
60 g[x].push_back(y);
61 g[y].push_back(x);
62 }dfs(0,1); dp(0,1);
63 printf("%lld\n",ans);
64 return 0;
65 }
66 }
67 signed main(){return WSN::main();}

Noip模拟21(持续翻车)2021.7.20的更多相关文章

  1. NOIP模拟21+22

    模拟21确实毒瘤...考场上硬刚T3 2.5h,成功爆零 T1.数论 看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律. 正解貌似是乱搞,我们考虑一个比较显然的结论: ...

  2. Noip模拟33垫底反思 2021.8.8

    T1 Hunter 考场上没写$%p$挂了25分.也是很牛皮,以后打完过了样例一定要检查 因为样例太小了......很容易忘记%%%% 正解随便手模就出来了. 1 #include<bits/s ...

  3. NOIP 模拟 $21\; \rm Park$

    题解 \(by\;zj\varphi\) 首先,分析一下这个答案:本质上是求在一条路径上,选择了一些点,这些点的贡献是它周围的点权和 - 它上一步的点权 对于一棵树,可以先确定一个根,然后每条路径就可 ...

  4. [考试总结]noip模拟21

    中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 分差不加绝对值!!!! 分差不加绝对值!!!! 分差不加绝对值!!!! ...

  5. NOIP 模拟 $21\; \rm Median$

    题解 \(by\;zj\varphi\) 对于这个序列,可以近似得把它看成随机的,而对于随机数列,每个数的分布都是均匀的,所以中位数的变化可以看作是常数 那么可以维护一个指向中位数的指针,同时维护有多 ...

  6. NOIP 模拟 $21\; \rm Game$

    题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...

  7. NOIP模拟 21

    可爱的Dybala走了..(当然只是暂时) 又考了大众分.从rank5到rank17一个分. T1 折纸 秒切,爽啊 天皇偷看我代码,结束看见我A了还很惊讶,说我代码有锅 好沙雕哦 就跟个2b似的. ...

  8. noip模拟21

    开题发现这场考过,定睛一看,发现是省选前最后一场,没改过呀--但是还是讲武德的赛时没提交 A. Median 神奇之处在于 \(1e7\) 个质数居然能线性筛出来~ 那么 \(S2\) 可以直接筛出来 ...

  9. NOIP模拟21:「Median·Game·Park」

    T1:Median   线性筛+桶+随机化(??什么鬼?).   首先,题解一句话秀到了我: 考虑输入如此诡异,其实可以看作随机数据   随机数据??   这就意味着分布均匀..   又考虑到w< ...

随机推荐

  1. python库--tensorflow

    方法 返回值类型 参数 说明 张量    .constant() Tensort 张量 实例t value 创建一个常量tensor dtype=None 输出类型 shape=None 返回tens ...

  2. C语言学习笔记---3.字符串格式化输入输出

    1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...

  3. python-引用/模块

    导入文件,先从当前目录下找,找不到从环境变量中找 1.导入模块,实质是把制定的py文件执行一遍. 自己写的模块:要导入的文件在当前目录下的:form 文件夹.py文件名 import 函数名 标准模块 ...

  4. 【Sass/SCSS 完整自学中文版教程02】SCSS 官方英文文档翻译整理

    Sass 调试 目录 Sass 调试 @error @warn @debug 如果对本文有任何问题,建议,或者在前端技术体系方面有任何问题,可以添加我的微信: drylint , 我会尽可能为你解答, ...

  5. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  6. 使用Java MVC模式设计一个学生管理系统

    最近在做web实验,要求是用jsp+servlet+mysql实现一个学生管理系统,完成对数据库的增删改查. 效果图:   代码: package dao; import java.util.List ...

  7. 无序数组求第K大的数

    问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...

  8. 在PHP中操作临时文件

    关于文件相关的操作,想必大家已经非常了解了,在将来我们刷到手册中相关的文件操作函数时也会进行详细的讲解.今天,我们先来了解一下在 PHP 中关于临时文件相关的一些内容. 获取 PHP 的默认临时创建文 ...

  9. css 限制字数

    text-overflow: ellipsis; overflow: hidden; 不过需设置宽高

  10. Linux系列(41) - 监听命令Vmstart,Top(还需完善)

    一.简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控:属于sysstat包:它是对系统的整体情况进行统计 ...