NOIp2017—— 追求那些我一直追求的
谨以此祭奠我即将爆炸的
Mingqi_H 2017.09.24
Day -47
突然发现半年来自己从来没有写对过
1 #include<cstring> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int maxn = 1e6+10; 6 struct Edge{ 7 int u,v,w; 8 }edge[maxn*2]; 9 int head[maxn]; 10 int cnt; 11 int dis[maxn],vis[maxn]; 12 int m,n; 13 inline void add(int u,int v,int w) 14 { 15 edge[++cnt].u=head[u]; 16 edge[cnt].v=v; 17 edge[cnt].w=w; 18 head[u]=cnt; 19 return; 20 } 21 void spfa(int p) 22 { 23 memset(dis,0x3f,sizeof(dis)); 24 memset(vis,0,sizeof(vis)); 25 int cur,nxt,v; 26 queue<int> q; 27 while(!q.empty()) 28 q.pop(); 29 q.push(p),vis[p]=true; 30 dis[p]=0; 31 while(!q.empty()) 32 { 33 cur=q.front(),q.pop(),vis[cur]=false; 34 for(int i=head[cur];i;i=edge[i].u) 35 { 36 v=edge[i].v; 37 if(dis[p]+edge[v].w<dis[v]) 38 { 39 dis[v]=dis[p]+edge[v].w; 40 q.push(v),vis[v]=true; 41 } 42 } 43 } 44 for(int i=1;i<=m;i++) 45 printf("%d ",dis[i]); 46 printf("\n"); 47 return; 48 } 49 int main() 50 { 51 int u,v,w; 52 scanf("%d%d",&m,&n); 53 for(int i=0;i<n;i++) 54 { 55 scanf("%d%d%d",&u,&v,&w); 56 add(u,v,w); 57 } 58 for(int i=1;i<=m;i++) 59 spfa(i); 60 }
问题
你基础不牢啊
还是从板子开始吧
Kruskal
#include<cstdio> #include<algorithm> using namespace std; #define maxp 5005 #define maxe 200005 struct Edge{ int u,v,w; }edge[maxe]; inline int cmp(Edge a,Edge b){return a.w<b.w;} int cnt; int fat[maxp]; inline int find(int x) {return fat[x]!=x?fat[x]=find(fat[x]):fat[x];} inline void unionn(int x,int y) {int fa=find(x),fb=find(y);if(fa!=fb)fat[fa]=fb;} int n,m; inline void Kruskal() { sort(edge+1,edge+m+1,cmp); int k=0,ans=0; for(int i=1;i<=m;i++) { if(find(edge[i].u)!=find(edge[i].v)) { unionn(edge[i].u,edge[i].v); ans+=edge[i].w; k++; } } if(k<n-1) printf("orz"); else printf("%d",ans); return; } int main() { int u,v,w; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) fat[i]=i; for(int i=1;i<=m;i++) scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); Kruskal(); return 0; }
复习计划
NOIP
保证无论何时
Day-45
今天检验之前的
1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 #define maxn 1000001 5 using namespace std; 6 struct Edge 7 { 8 int u,v,w; 9 } edge[2*maxn]; 10 int head[maxn],cnt; 11 int n,m; 12 int vis[maxn],dis[maxn],cur,nxt; 13 inline void add(int u,int v,int w) 14 {edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} 15 inline void spfa(int u) 16 { 17 queue<int>q; 18 memset(vis,0,sizeof(vis)), 19 memset(dis,0x3f,sizeof(dis)), 20 dis[u]=0; 21 while(!q.empty())q.pop(); 22 vis[u]=true,q.push(u); 23 while(!q.empty()) 24 { 25 cur=q.front(),vis[cur]=0,q.pop(); 26 for(int i=head[cur]; i; i=edge[i].u) 27 { 28 int v=edge[i].v; 29 if(dis[v]>dis[cur]+edge[i].w) 30 { 31 dis[v]=dis[cur]+edge[i].w; 32 if(!vis[v]) 33 vis[v]=1,q.push(v); 34 } 35 } 36 } 37 for(int i=1; i<=m; i++) 38 printf("%d ",dis[i]); 39 printf("\n"); 40 return; 41 } 42 int main() 43 { 44 int u,v,w; 45 scanf("%d%d",&m,&n); 46 for(int i=0; i<n; i++) 47 { 48 scanf("%d%d%d",&u,&v,&w); 49 add(u,v,w); 50 } 51 for(int i=1; i<=m; i++) 52 spfa(i); 53 return 0; 54 }
???
1 #include<cstdio> 2 #include<cstring> 3 #define maxn 1000001 4 using namespace std; 5 struct Edge 6 { 7 int u,v,w; 8 } edge[2*maxn]; 9 int head[maxn],cnt; 10 int n,m; 11 int vis[maxn],dis[maxn],cur,nxt; 12 inline void add(int u,int v,int w) 13 {edge[++cnt].u=head[u],edge[cnt].v=v,edge[cnt].w=w,head[u]=cnt;} 14 struct queue{ 15 int array[4*maxn]; 16 int h,t; 17 inline bool empty(){return h>=t;} 18 inline void push(int x){array[h++]=x;} 19 inline void pop(){t--;} 20 inline int front(){return array[h];} 21 inline void clear(){h=t=0;} 22 }q; 23 inline void spfa(int u) 24 { 25 memset(vis,0,sizeof(vis)), 26 memset(dis,0x3f,sizeof(dis)), 27 dis[u]=0; 28 q.clear(); 29 vis[u]=true,q.push(u); 30 while(!q.empty()) 31 { 32 cur=q.front(),vis[cur]=0,q.pop(); 33 for(int i=head[cur]; i; i=edge[i].u) 34 { 35 int v=edge[i].v; 36 if(dis[v]>dis[cur]+edge[i].w) 37 { 38 dis[v]=dis[cur]+edge[i].w; 39 if(!vis[v]) 40 vis[v]=1,q.push(v); 41 } 42 } 43 } 44 for(int i=1; i<=m; i++) 45 printf("%d ",dis[i]); 46 printf("\n"); 47 return; 48 } 49 int main() 50 { 51 int u,v,w; 52 scanf("%d%d",&m,&n); 53 for(int i=0; i<n; i++) 54 { 55 scanf("%d%d%d",&u,&v,&w); 56 add(v,u,w);//无向图 57 add(u,v,w); 58 } 59 for(int i=1; i<=m; i++) 60 spfa(i); 61 return 0; 62 }
Day-44
今天手打了一遍
今天复习
1 #include<cstdio> 2 using namespace std; 3 #define maxn 500010 4 int n,m,s,f[maxn][22],deep[maxn],head[maxn],num; 5 struct node 6 { 7 int to,pre; 8 } e[maxn<<1]; 9 void Insert(int from,int to){e[++num].to=to;e[num].pre=head[from];head[from]=num;} 10 void find_deep(int from,int now,int dep) 11 { 12 f[now][0]=from; 13 deep[now]=dep; 14 for(int i=head[now]; i; i=e[i].pre) 15 if(e[i].to!=from) 16 find_deep(now,e[i].to,dep+1); 17 } 18 void find_father() 19 { 20 for(int j=1; j<=21; j++) 21 for(int i=1; i<=n; i++) 22 f[i][j]=f[f[i][j-1]][j-1]; 23 } 24 int get(int a,int delta) 25 { 26 for(int i=0; i<=21; i++) 27 if(delta&(1<<i))a=f[a][i]; 28 return a; 29 } 30 int lca(int a,int b) 31 { 32 if(deep[a]<deep[b]) swap(a,b); 33 a=get(a,deep[a]-deep[b]); 34 if(a==b) return a; 35 for(int i=21; i>=0; i--) 36 if(f[a][i]!=f[b][i]) 37 a=f[a][i],b=f[b][i]; 38 return f[a][0]; 39 } 40 int main() 41 { 42 scanf("%d%d%d",&n,&m,&d); 43 int x,y; 44 for(int i=1; i<=n-1; i++) 45 { 46 scanf("%d%d",&x,&y); 47 Insert(x,y),Insert(y,x); 48 } 49 find_deep(s,s,0); 50 find_father(); 51 for(int i=1; i<=m; i++) 52 { 53 scanf("%d%d",&x,&y); 54 printf("%d\n",lca(x,y)); 55 } 56 return 0; 57 }
Day-43
LCA
玩一玩树状数组好了
我什么都不会...
#define lowbit(__x__) (__x__&(-__x__)) //区间查询单点修改不需要差分数组。 //区间查询时需要查询两个端点,调用query(y)-query(x-1)。 inline int query(int x){int ans=0;for(int i=x;i>0;i-=lowbit(i))ans+=c[i];return ans;} inline void modify_point(int x,int d){for(int i=x;i<=n;i+=lowbit(x))c[i]+=d;} //区间修改单点查询需要差分数组。两者有一些不同。 //初始化树状数组时就需要差分处理,用一个 pre 变量记录前一个元素,然后调用 modify(place,x-pre)。 //区间修改直接在差分数组上进行,仅需要修改两个端点即可,调用 modify(point,k),modify(point,-k)。 //查询基本相同。 inline void modify_interval(int x,int d){for(int i=x;i<=n;i+=lowbit(i))a[i]+=d;}
Day-42
今天忙
Day-41
一个弱省蒟蒻
昨日来京
Rank 69...
Day-40
2333...
然而今天题目没区分度...
不想搞事情了...qbxt
噫...
据说快停课了...
下定决心来一遍
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N = 500100; 5 int fa[N][25],dep[N]; 6 struct Edge{int to,nxt;}e[N*2]; 7 int head[N],cnt; 8 inline void add(int u,int v){e[++cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt;} 9 int n,maxdep,T,rt,top; 10 void build(int u) 11 { 12 for(int i=head[u];i;i=e[i].nxt) 13 { 14 int v=e[i].to; 15 if(v!=fa[u][0]) 16 { 17 fa[v][0]=u; 18 dep[v]=dep[u]+1; 19 maxdep=max(maxdep,dep[v]); 20 build(v); 21 } 22 } 23 } 24 inline int LCA(int u,int v) 25 { 26 if(dep[u]<dep[v])swap(u,v); 27 for(int k=top;k>=0;k--) 28 if(dep[fa[u][k]]>=dep[v]) 29 u=fa[u][k]; 30 if(u==v) 31 return u; 32 for(int k=top;k>=0;k--) 33 if(fa[u][k]!=fa[v][k]) 34 u=fa[u][k],v=fa[v][k]; 35 return fa[u][0]; 36 } 37 int main() 38 { 39 scanf("%d%d%d",&n,&T,&rt); 40 for (int i=1; i<n; i++) 41 { 42 int u,v; 43 scanf("%d%d",&u,&v); 44 add(u,v),add(v,u); 45 } 46 dep[rt]=1; 47 build(rt); 48 for (; (1<<top)<=maxdep; top++); 49 for (int k=1; k<=top; k++) 50 for (int i=1; i<=n; i++) 51 fa[i][k]=fa[fa[i][k-1]][k-1]; 52 while (T--) 53 { 54 int u,v; 55 scanf("%d%d",&u,&v); 56 printf("%d\n",LCA(u,v)); 57 } 58 return 0; 59 }
只会倍增的我...
Day-39
NOIP
文件文件
目前的坑
Day-38
NOIP
文件错误
目前新增的坑
Day-37
NOIp
蜜汁
T2
不过今天是数论专场
希望明天
最后还是因为⑨啊
Day-31
信息课上来打代码...
二区停课了...
看看
另外等着父亲的消息
昨天去淄博
晚上请假回家
距 NOIp2017 还剩 31 天
Day-30
神
然而今天快困死了
住校也好不到哪里去据说...
快初赛了...
Day-29
今天是历史性的一天
Day-28
并没有停课
Day-19
gg...
Day-12
还有不到
Day2 T1T2
晚上还是好好整理一下吧
Day-10
还有
已经绝望了
Day-9
似乎今天被续了
短期内水平可能不会有太多进步了吧
Day-5
昨天回家翻说说
完蛋了
1111&&1112
重写了线段树
const int maxn=2*1e7+10;//max node: 5*1e6 long long sum[maxn];//real long long addv[maxn];//lazy-tag long long c[maxn/4]; #define mid ((l+r)>>1) #define lson (o<<1) #define rson (lson|1) inline void build(int o,int l,int r) { addv[o]=0; if(l==r)sum[o]=c[l]; else { build(lson,l,mid); build(rson,mid+1,r); sum[o]=sum[lson]+sum[rson]; } } inline void push_down(int o,int l,int r) { addv[lson]+=addv[o]; addv[rson]+=addv[o]; sum[lson]+=(mid-l+1)*addv[o]; sum[rson]+=(r-mid)*addv[o]; addv[o]=0; } inline void update(int o,int l,int r,int a,int b,int x) { if(l>=a&&r<=b) { addv[o]+=x; sum[o]+=(r-l+1)*x; return; } if(addv[o])push_down(o,l,r); if(a<=mid)update(lson,l,mid,a,b,x); if(b>mid)update(rson,mid+1,r,a,b,x); sum[o]=sum[lson]+sum[rson]; } inline long long query(int o,int l,int r,int a,int b) { if(l>=a&&r<=b)return sum[o]; long long ans=0; if(addv[o])push_down(o,l,r); if(a<=mid)ans+=query(lson,l,mid,a,b); if(b>mid)ans+=query(rson,mid+1,r,a,b); return ans; }
想想线段树还有哪些神奇的操作吧
Floyd
二分的话
Day-4
今天去竞赛楼整理书
下午找了一下
重做
考试的时候千万别忘记建子文件夹
随手写个
#include<cstdio> using namespace std; int a,b; int gcd(int a,int b){return !b?a:gcd(b,a%b);} int main() { scanf("%d%d",&a,&b); printf("%d",gcd(a,b)); return 0; }
线性筛素数
#include<cstdio> using namespace std; const int N=10000000+10; bool flag[N]; int prime[N]; inline void get_prime(int x) { flag[1]=1; int i,j,k=0; for(i=2;i<=x;i++){//注意不能用小于号,否则会WA 成 SB!!! if(!flag[i]) prime[k++]=i; for(j=0;j<k&&i*prime[j]<=x;j++){//注意不能用小于号,否则会 WA 成 SB!!! flag[i*prime[j]]=true; if(i%prime[j]==0) break; } } } int n,m,q; int main() { scanf("%d%d",&n,&m); get_prime(n); for(int i=0;i<m;i++) { scanf("%d",&q); printf(!flag[q]?"Yes\n":"No\n"); } return 0; }
换个背景玩玩
void exgcd(int a,int b,int &d,int &x,int &y) { if(!b) {d=a;x=1;y=0;} else {gcd(b,a%b,d,y,x);y-=x*(a/b);} }
当然如果您的浏览器版本不行的话
Day-3
绝望
二区的老师给我们各种压力
TM
各种出锅
调了一下午矩阵的东西
20
还
回来第二天就要期中考试
我到底在做什么
Day-2
已经没救了
Day-1
今天上午考的还可以
晚上继续矩阵乘法
SB
矩阵快速幂
#include<cstdio> #include<vector> using namespace std; typedef vector<long long> vec; typedef vector<vec> matrix; typedef long long ll; long long p,q,a1,a2,n,m; matrix operator *(const matrix &A,const matrix&B) { matrix C(A.size(),vec(B[0].size())); for(int i=0;i<A.size();i++) for(int k=0;k<B.size();k++) for(int j=0;j<B[0].size();j++) C[i][j]=(C[i][j]+A[i][k]*B[k][j])%m; return C; } matrix pow(const matrix&A,ll n) { matrix B(A.size(),vec(A.size())); for(int i=0;i<A.size();i++) B[i][i]=1; while(n) { if(n&1)B=B*A; A=A*A; n>>=1; } return B; } int main() { scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&a1,&a2,&n,&m); matrix A(2,vec(2)); A[0][0]=p;A[0][1]=1; A[1][0]=q;A[1][1]=0; matrix B(1,vec(2)); B[0][0]=a2,B[0][1]=a1; A=pow(A,n-2); A=B*A; printf("%lld\n",A[0][0]); return 0; }
Day0
最后一天了
Day1
T1
T2
T3
吃晚饭的时候发现
晚上开始颓
Day2
T1
T2
T3
转回来做
随便写写吧
颓吧
11.15
清北数据成绩
洛谷数据成绩
学军数据成绩
完美挂掉
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC 压缩 (compact_phase) 底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13 新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的 API 服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解 Mybatis 分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用