2017 NOIP 提高组模拟赛(四)Day2(计蒜客)
2017-10-16 20:47
351 查看
一、鬼脚图
原题:计蒜客
考试的时候先看错了题,很高兴,改了。
交了后错了,看了一下题,又看错了……
然后两分钟改完,崩了……
横线就是交换位置,在读入的时候把线两边得数交换一下就是最终序列。
最少横线数就是最终序列的逆序对个数。
Code:
二、跑步爱天天
原题:计蒜客
暴力就每次把每个警卫都进行模拟,这样就是n^2。可以过60.
把图画出来,实际上发现从起点出发后,所能影响到的警卫就只有从起点到1这条路径上的点。那么就可以只判断这些点会不会影响到就行了。
判断要用dfs序,如果直接模拟求的话依旧是n^2,并没有什么改进。
然而我写的是卡过去的,改成用手打链表会快很多。
Code:
这样960多,改成链表后再改一些细节,最快的是200多。
三、神奇的三角形
原题:计蒜客
玄学的题目。
至今还没有A掉,不会啊………………
不会还写题解??
所以用别人的。
别人的就不放了,内部的都知道,反正我还不会…………
今天感觉就像是在梦游(头痛)
原题:计蒜客
考试的时候先看错了题,很高兴,改了。
交了后错了,看了一下题,又看错了……
然后两分钟改完,崩了……
横线就是交换位置,在读入的时候把线两边得数交换一下就是最终序列。
最少横线数就是最终序列的逆序对个数。
Code:
#include<bits/stdc++.h> #define M 1000005 using namespace std; int B[M],A[M],ans; void Sort(int l,int r){//归并排序求逆序对 if(l>=r)return; int mid=(l+r)/2; Sort(l,mid);Sort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r){ if(A[i]<=A[j])B[k++]=A[i++]; else{ ans+=mid-i+1; B[k++]=A[j++]; } } while(i<=mid)B[k++]=A[i++]; while(j<=r)B[k++]=A[j++]; for(int i=l;i<=r;i++)A[i]=B[i]; } int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)A[i]=i; for(int i=1;i<=m;i++){ int x; scanf("%d",&x); swap(A[x],A[x+1]);//每条边交换 } for(int i=1;i<=n;i++)printf("%d ",A[i]); Sort(1,n); printf("\n%d\n",ans); return 0; }
二、跑步爱天天
原题:计蒜客
暴力就每次把每个警卫都进行模拟,这样就是n^2。可以过60.
把图画出来,实际上发现从起点出发后,所能影响到的警卫就只有从起点到1这条路径上的点。那么就可以只判断这些点会不会影响到就行了。
判断要用dfs序,如果直接模拟求的话依旧是n^2,并没有什么改进。
然而我写的是卡过去的,改成用手打链表会快很多。
Code:
#include<bits/stdc++.h> #define P(a) while(a isdigit(c=getchar())) using namespace std; void U(int &x) {int c;P(!);x=c-48;P()x=x*10+c-48;} vector<int>edge[500005],D[500005]; int fa[500005],L[1000005],T,Q[1000005]; void Clear(){//多组数据要清空,少一个都不行 memset(fa,0,sizeof fa); memset(L,0,sizeof L); memset(Q,0,sizeof Q); T=0; } void f(int x){ L[x]=++T;D[x].push_back(T);//D存的是每个点在这个循环序列出现的每个位置 for(int i=0;i<(int)edge[x].size();i++){ int y=edge[x][i]; fa[y]=x; f(y); D[x].push_back(++T); } } int main(){ int cas;U(cas); while(cas--){ int n;U(n); for(int i=1;i<=n;i++){ int x;U(x); for(int j=1;j<=x;j++){ int y;U(y); edge[i].push_back(y); } } f(1); int st;U(st); for(int i=st;i!=0;i=fa[i])Q[L[i]]=1;//把走到的点标记掉 int t=0,ans=0;//t是走了的时间 for(int i=st;i!=0;i=fa[i]){ for(int j=0;j<(int)D[i].size();j++){ int nxt=D[i][j]-t; if(nxt<=0||Q[nxt]==0)continue;//走过的或不能走的 ans++;Q[nxt]=0; } t++; } printf("%d\n",ans); Clear(); for(int i=1;i<=n;i++)edge[i].clear(),D[i].clear(); } return 0; }
这样960多,改成链表后再改一些细节,最快的是200多。
三、神奇的三角形
原题:计蒜客
玄学的题目。
至今还没有A掉,不会啊………………
不会还写题解??
所以用别人的。
别人的就不放了,内部的都知道,反正我还不会…………
今天感觉就像是在梦游(头痛)
相关文章推荐
- 计蒜客 2017 NOIP 提高组模拟赛(二)Day2
- 计蒜客 2017 NOIP 提高组模拟赛(三)Day2 小区划分
- NOIP 2017 提高组 Day2 T1 奶酪 cheese.cpp
- NOIP2017提高组模拟赛4 (总结)
- NOIP2017提高组 模拟赛19(总结)
- 计蒜客 2017 NOIP 提高组模拟赛(一)题解
- NOIP2017提高组 模拟赛20(总结)
- NOIP 2017 提高组 Day2 T1 奶酪【并查集】
- 计蒜客 2017 NOIP 提高组模拟赛(一)Day2
- NOIP2017提高组模拟赛 8(总结)
- NOIP2017提高组模拟赛5 (总结)
- NOIP2017 提高Day2-2 宝藏 解题报告
- 计蒜客 2017 NOIP 提高组模拟赛(二)Day1 A. 邻家男孩
- 计蒜客 2017 NOIP 提高组模拟赛(一)Day1
- 2016.10.29【初中部 NOIP提高组 】模拟赛C
- JZOJ 5428. 【NOIP2017提高A组集训10.27】查询
- NOIP2012复赛提高组day2(A:同余方程 B:借教室 C:疫情控制)
- 2016.10.30 NOIP模拟赛 day2 AM 整理
- [置顶] 【JZOJ5430】【NOIP2017提高A组集训10.27】图
- 【jzoj5368】【NOIP2017提高A组模拟9.16】【为逝去的公主献上的七重樱】【单调队列】