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

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. docker的网络基础

    docker使用的与Linux网络有关的主要技术: Network Namespace Veth 设备对 Iptables/Netfilter 网桥 路由 <1> 网络命令空间 names ...

  2. 这篇 Java 基础,我吹不动了

    Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章我补充了一些关于<Java基础核心总结>的内容,修改了部分错别字和语句不通顺的地方,并且对内部类.泛型等内容进 ...

  3. Vue+element基本增删改查

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. NLP与深度学习(四)Transformer模型

    1. Transformer模型 在Attention机制被提出后的第3年,2017年又有一篇影响力巨大的论文由Google提出,它就是著名的Attention Is All You Need[1]. ...

  5. python库--pandas--文本文件读取

    .read_table() / read_csv()     filepath_or_buffer 文件路径 sep='\t' 分隔符. 设置为N, 将尝试自动确定 delimiter=N sep的备 ...

  6. [第十六篇]——Docker 安装 CentOS之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker 安装 CentOS CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise ...

  7. find用法 以及和exec xargs 的组合使用

    1.查找当前目录下所有的txt的文件 [root@master1 ~]# find . -name "*.txt" -type f ./a.txt ./b.txt 2.exec 结 ...

  8. Sentry 监控 - Environments 区分不同部署环境的事件数据

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  9. 创建一个Orchard Core CMS 应用程序

    开始使用Orchard Core作为NuGet软件包 在本文中,我们将看到使用Orchard Core提供的NuGet包创建CMS Web应用程序是多么容易. 你可以在这里找到Chris Payne写 ...

  10. 定要过python二级 第11套

    1. 2.乃至好的代码片段与解决方法,我保存在了 H:盘中python中的:H:\python\python二级好的代码片段与错误解决 3.接着第一个点,为什么print(read(f))  把f 放 ...