vis

洛谷P4408 逃学的小孩

会有一股神秘感。 提交于 2019-12-02 03:14:15
题目 求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树。 根据题意父母先从C去A,再去B,或者反过来。 我们一定是要让A到B最大,也要让C到A和B的最小值最大。 AB最大一定就是直径了。 CA最大直接先求出任意一条直径的两个端点,必定一个是A、一个是B。然后枚举C,找到最大的 \(min(CA,CB)\) 然后与AB相加即可。 #include <bits/stdc++.h> #define int long long #define N 1010011 using namespace std; struct edg { int from, to, nex, len;// vis表示是否在最大生成树上 }e[N * 2]; int n, m, cnt, ans, ansk, lin[N], dis1[N], vis[N];// 这必是一颗树 int disk[N]; inline void add(int f, int t, int c) { e[++cnt].nex = lin[f]; e[cnt].to = t; e[cnt].len = c; lin[f] = cnt; } void dfs(int now) { vis[now] = 1; for (int i = lin[now]; i; i = e[i].nex) { int to = e[i].to;

【洛谷 1144】最短路计数

坚强是说给别人听的谎言 提交于 2019-12-01 23:59:20
题目描述 给出一个 N N个顶点 M M条边的无向无权图,顶点编号为 1-N 1 − N。问从顶点 1 1开始,到其他每个点的最短路有几条。 输入格式 第一行包含 2 2个正整数 N,M N , M,为图的顶点数与边数。 接下来 M M行,每行 2 2个正整数 x,y x , y,表示有一条顶点 x x连向顶点 y y的边,请注意可能有自环与重边。 输出格式 共 N N行,每行一个非负整数,第 i i行输出从顶点 1 1到顶点 i i有多少条不同的最短路,由于答案有可能会很大,你只需要输出 ans \bmod 100003 a n s mod 1 0 0 0 0 3后的结果即可。如果无法到达顶点 i i则输出 0 0。 输入输出样例 输入 #1 复制 5 7 1 2 1 3 2 4 3 4 2 3 4 5 4 5 输出 #1 复制 1 1 1 2 4 说明/提示 1 1到 5 5的最短路有 4 4条,分别为 2 2条 1-2-4-5 1 − 2 − 4 − 5和 2 2条 1-3-4-5 1 − 3 − 4 − 5(由于 4-5 4 − 5的边有 2 2条)。 对于 20\% 2 0 %的数据, N ≤ 100 N ≤ 1 0 0; 对于 60\% 6 0 %的数据, N ≤ 1000 N ≤ 1 0 0 0; 对于 100\% 1 0 0 %的数据, N<=1000000,M<

机房测试模拟1(day2):矩阵+树上贪心+bfs+状压

*爱你&永不变心* 提交于 2019-12-01 23:31:23
T1:入阵曲 n,m<=400,k<=1e6 分析: 考虑只有一行的情况: 将这一行求前缀和后,一段区间的和x=sum[r]-sum[l-1],如果x%k==0,那么sum[r]%k - sum[l-1]%k == 0 转化一下,也就是说: sum[r]与sum[l-1]在模k的意义下相等。 所以对于一行的来说,O(n)地for一遍,用一个桶记录一下模k意义下的值相同的个数,ans+=cnt[k]*(cnt[k]-1)/2 对于多行的来说,枚举上界和下界,再将这一块子矩阵对列求前缀和压缩成一列,转化成上面的问题。 复杂度:O(n^3) #include<bits/stdc++.h> using namespace std; #define N 405 #define M 1000005 #define ll long long #define ri register int int n,m,kk,ans=0,t[M],q[M]; ll a[N][N],l[N][N]; int main() { freopen("rally.in","r",stdin); freopen("rally.out","w",stdout); scanf("%d%d%d",&n,&m,&kk); for(ri i=1;i<=n;++i) for(ri j=1;j<=m;++j) scanf("%lld",

【模板】dijstkra

北城以北 提交于 2019-12-01 22:35:37
typedef struct { bool operator ()(const intpair& a, intpair& b)const { return a.second > b.second; } }cmp; int dis[maxn]; bool vis[maxn]; priority_queue<intpair, vector<intpair>, cmp>q; void dijstkra(int x) { mem(dis, 0x3f); dis[x] = 0; q.push(intpair(x, dis[x])); while (!q.empty) { intpair t = q.top(); q.pop(); if (vis[t.first]) continue; vis[t.first] = true; for (int i = head[x]; i != -1; i = e[i].nxt) { int u = e[i].u; int w = e[i].w; if (!vis[u] && dis[u] > t.first + w) { dis[u] = t.first + w; q.push(intpair(u, dis[u])); } } } } 来源: https://www.cnblogs.com/thjkhdf12/p/11719240.html

$NOIp$做题记录

假如想象 提交于 2019-12-01 20:25:39
虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018$ [X] 积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$.考虑对每个点,如果它左侧比它高,显然可以在左侧被消的时候顺便把它消了. 否则只能消到左侧那个高度. 所以答案为$\sum max(0,a_i-a_{i-1})$ #include<bits/stdc++.h> using namespace std; #define il inline #define gc getchar() #define ri register int #define rb register bool #define rc register char #define rp(i,x,y) for(ri i=x;i<=y;++i) #define my(i,x,y) for(ri i=x;i>=y;--i) int n,nw,pre,as; il int read() { ri x=0;rb y=1;rc ch=gc; while(ch!='-' && (ch>'9' || ch<'0'))ch=gc; if(ch=='-')ch=gc,y=0; while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc; return

NOIP模拟测试on 2019.10.21

限于喜欢 提交于 2019-12-01 20:24:05
AFO倒计时...感觉10月28日就完了。 3道题都是洛谷某次月赛的题目。 T1 斐波拉契 题解: 这道题一开始我还不太懂什么意思,就觉得很懵逼,推了很久也没有发现什么规律。差点就建了一棵树跳lca。其实完全没有必要,还是好想,我的思路就是记录每一个节点是哪一代出生的,然后你会发现每个节点的儿子与他的父亲相差都为一个斐波拉契数列中的数,于是我们可以这样想,就是按照找lca的思路来跳,然后每次出生靠后的节点往上跳,每次跳的值就是斐波拉契数列中的它出生那一代的项数。数据范围是10^12,所以要处理到菲波拉切数列的60项即可。避免了建树,还是比较好想的。 代码如下: #include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; long long f[maxn]; int m; long long a,b; int tot; int ma,mb; bool flag; inline long long read(){ long long rt = 0 ; char ch = getchar() ; while( ch < '0' || ch > '9' ) ch = getchar() ; while( ch >='0' && ch <='9' ) rt = (rt<<1)+(rt<<3) + ch - '0' ,

csps-模拟7980题解

早过忘川 提交于 2019-12-01 20:08:46
题面: https://www.cnblogs.com/Juve/articles/11712702.html 树: 我太sb了不知道DROT是1,还在sb找根 记录一个fa[]数组,表示x的祖先中第一个智商比x大的,用栈维护 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define re register 6 using namespace std; 7 const int MAXN=1e5+5; 8 int n,q,w[MAXN],sta[MAXN],top=0,rb[MAXN],topp=0,fa[MAXN],deep[MAXN]; 9 int to[MAXN<<1],nxt[MAXN<<1],pre[MAXN],cnt=0; 10 inline void add(re int u,re int v){ 11 ++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt; 12 } 13 void dfs(int x,int f){ 14 deep[x]=deep[f]+1; 15 int res=0; 16 while(w[x]>w[sta[top]]){ 17 rb[++topp]=sta[top]; 18 --top,+

POJ - 1573 - Robot Motion = 模拟

≡放荡痞女 提交于 2019-12-01 20:07:51
http://poj.org/problem?id=1573 没什么好说的。 #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<map> #include<set> #include<stack> #include<string> #include<queue> #include<vector> using namespace std; typedef long long ll; char G[15][15]; int vis[15][15]; int main() { #ifdef Yinku freopen("Yinku.in", "r", stdin); #endif // Yinku int n, m, ej; while(~scanf("%d%d%d", &n, &m, &ej)) { if(n == 0) break; for(int i = 1; i <= n; ++i) { scanf("%s", G[i] + 1); memset(vis[i], -1, sizeof(vis[i])); } int i = 1, j = ej; int cnt = 0; while(1) { if(i < 1 || i > n ||

模板 - 单源最短路Dijkstra

半腔热情 提交于 2019-12-01 19:48:43
int dis[105]; bool vis[105]; priority_queue<pair<int, int> > pq; void dijkstra(int s, int n) { while(!pq.empty()) pq.pop(); for(int i = 1; i <= n; ++i) { dis[i] = 0x3f3f3f3f; vis[i] = 0; } dis[s] = 0; pq.push({-dis[s], s}); while(!pq.empty()) { int u = pq.top().second; pq.pop(); if(vis[u]) continue; vis[u] = 1; for(int i = 0; i < G[u].size(); ++i) { int v = G[u][i].first, w = G[u][i].second; if(!vis[v] && dis[v] > dis[u] + w) { dis[v] = dis[u] + w; pq.push({-dis[v], v}); } } } } 来源: https://www.cnblogs.com/Inko/p/11715302.html

Dfs型SPFA+二分答案 || 负环 || BZOJ 4773

旧巷老猫 提交于 2019-12-01 17:08:55
题解: 基本思路是二分答案,每次用Dfs型SPFA验证该答案是否合法。 一点细节我注释在代码里了。 代码: 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 inline int rd(){ 5 int x=0,f=1; char c=getchar(); 6 while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();} 7 while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} 8 return f*x; 9 } 10 const int maxn=305,maxm=305*305,inf=(1<<30)-5; 11 int N,M,edge_head[maxn],num_edge=0,u,v,w,Dis[maxn]; 12 bool vis[maxn],flag; 13 struct Edge{ int to,nx,dis; }edge[maxm]; 14 inline void Add_edge(int from,int to,int dis){ 15 edge[++num_edge].nx=edge_head[from]; 16 edge[num_edge].to=to; 17 edge[num_edge].dis