2017.5.5日的总结
来源:互联网 发布:c语言逻辑符号 编辑:程序博客网 时间:2024/05/24 05:49
今天又考了noip2013 DAY 1 的题
【超级气本来说好上课的!!!但是氢氟酸讲不起走了于是就又开始考试了……】
【而且三个半小时的题我们只考两个半小时还提前被叫回去了还被zj怼 我简直……】
【跑题了】
第一题
大概是一道数论题。。。
手动模拟一下,可以看出每n次就会回到原来的位置上,所以它是具有周期性的,所以可以通过一个快速幂来找出有效的区段,然后for一遍就不会超时了。
//每n次就回到原来的位置上#include<cstdio>#include<algorithm>#define ll long longusing namespace std;int n,m,k,x;ll cir;ll mpow(int a,int b){ ll rt=1; for(rt;b;b>>=1,a=a*a%n) if(b&1) rt=rt*a%n; return rt;}int main(){ freopen("circle.in","r",stdin); freopen("circle.out","w",stdout); scanf("%d%d%d%d",&n,&m,&k,&x); cir=mpow(10,k);//有效轮数 for(int i=1;i<=cir;i++){ x+=m; if(x>n) x-=n; } printf("%d",x); return 0; }
第二题
考试的时候想了归并排序 但是……自己对归并排序就只剩下知道这个名字了……然后也想过树状数组,但是我这么蒟蒻,肯定编不出来啦,所以考试的时候都干脆不尝试了。。【我怎么好意思说自己树状数组学的不错】
【不过考试时for的暴力居然过了百分之70的点。。。】
【后来修改还是用的树状数组】
【放弃归并排序了】【有时间刚一下,然而……】
附上代码
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int const N = 100010;int const mod = 99999997;int n,ans=0;int c[N],t[N];struct node{ int x,y;}a[N],b[N];bool cmp(node a,node b){ return a.x<b.x;}int lowbit(int x){ return x&(-x);}void update(int x){ while(x<=n){ c[x]+=1; x+=lowbit(x); }}int getsum(int x){ int rt=0; while(x){ rt+=c[x]; x-=lowbit(x); } return rt;}int main(){ freopen("match.in","r",stdin); freopen("match.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i].x); a[i].y=i; } for(int i=1;i<=n;i++){ scanf("%d",&b[i].x); b[i].y=i; } sort(a+1,a+n+1,cmp); sort(b+1,b+n+1,cmp); for(int i=1;i<=n;i++) t[a[i].y] = b[i].y; for(int i=n;i>=1;i--){ ans+=getsum(t[i]); if(ans>=mod) ans-=mod; update(t[i]); } printf("%d",ans); return 0;}
其实考试的时候离散化+for一遍也挺好的
我考试的时候居然把离散化写出来了。。。
第三题
我就想到spfa【还自以为自己的方法比较优。。。】
有时间单独刚吧,再单独写个总结【又是一个flag】
#include <cstdio>#include <cstring>#include <algorithm>#define ms(x,y) memset(x,y,sizeof(x))using namespace std;int const N = 50010;int const M = 1010;int n,m;int head[N*2],tot=0;int q,state[N],mmin[M][M];bool vis[M][M],exist[M];struct node{ int pre,v,w;}edge[N*2];void adde(int from,int to,int w){ tot++; edge[tot].pre = head[from]; edge[tot].v = to; edge[tot].w = w; head[from] = tot;}void spfa(int i){ int h=0,tail=1; mmin[i][i]=0x73f3f3f; state[1]=i; vis[i][i]=true; do{ h++; int u = state[h]; exist[u]=false; for(int j=head[u];j;j=edge[j].pre){ int v=edge[j].v; if(v == u) continue; if(vis[i][v]==false||(vis[i][v]==true&&min(mmin[i][u],edge[j].w)>mmin[i][v])){ if(vis[i][v] == false){ vis[i][v] = true; if(mmin[i][u] < edge[j].w) mmin[i][v] = mmin[i][u]; else mmin[i][v] = edge[j].w; } if(vis[i][v]==true&&min(mmin[i][u],edge[j].w)>mmin[i][v]) mmin[i][v] = min(mmin[i][u],edge[j].w); if(!exist[v]){ exist[v]=true; tail++; state[tail]=v; } } } }while(h<tail);}int main(){ freopen("truck.in","r",stdin); freopen("truck.out","w",stdout); ms(mmin,0x73f3f3f); scanf("%d%d",&n,&m); while(m--){ int x,y,z; scanf("%d%d%d",&x,&y,&z); adde(x,y,z); adde(y,x,z); } scanf("%d",&q); while(q--){ int u,v; scanf("%d%d",&u,&v); if(!vis[u][u]) spfa(u); if(vis[u][v]) printf("%d\n",mmin[u][v]); else printf("-1\n"); } return 0;}
0 0
- 2017.5.5日的总结
- 2017.5.1日的总结
- 练习日的总结
- 3.11日的总结
- 3.18日的总结
- 8月5日总结
- 5月13日总结
- 8月5日总结
- 日总结
- 2013.8.11-数学日2的总结
- 小车项目5-31日总结
- 2012-5-12日学习总结
- 5月25日 讲座总结
- 2015/5/2日-月总结
- 2015年5月16日总结
- 5月8日学习总结
- 2016年5月20日总结
- 2016年5月26日总结
- Drupal 一个不小心的主题Function造成了主页丢失
- 【Android】ContentProvider详解(二)
- 算法设计与应用基础:第十周(2)
- B.2输入3个整数,输出其中的最大值。
- Java数据结构--二叉树
- 2017.5.5日的总结
- XML文件解析—System.Xml的一些方法
- SSH中action访问session的方法!
- 关于读、写、读写等操作方式
- Yslow性能指标
- Java容器_Map_HashMap源码分析
- Spring+hibernate集成
- 找出数组中第k大的数
- O(n)求回文串 manacher算法