#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vec2 = vector<vector<int>>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x) constint maxn = 2e5+5; int n;
intlca(int a, int b){ if(d[a] < d[b]) swap(a, b); for(int i=20;~i;i--) if(d[f[a][i]] >= d[b]) a = f[a][i]; if(a == b) return b; for(int i=20;~i;i--) if(f[a][i] != f[b][i]) a = f[a][i], b = f[b][i]; return f[a][0]; }
intmain(void){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin >> n; for(int i=1;i<=n;i++){ int a, b; cin >> a >> b; e[a].eb(b), e[b].eb(a); } dfs(n,0); ll ans = 0; int c = 1; for(int i=1;i<=n;i++){ c = lca(i, c); ans += 1LL*d[c]; } cout << ans << '\n'; return0; }
E
小红定义一个数组的权值为:将其从小到大排序后,不动点[1]的数量。 现在,小红拿到了一个长为 n 的排列[2],他想知道其所有子数组[3]的权值之和,请你帮帮她。
【名词解释】 不动点[1]:定义整数 i(1≦i≦m) 是长度为 m 的数组 {a1,a2,…,am} 的一个不动点,当且仅当满足 ai=i。 排列[2]:长度为 n 的排列是由 1,2,…,n 这 n 个整数、按任意顺序组成的数组(每个整数均恰好出现一次)。例如,{2,3,1,5,4} 是一个长度为 5 的排列,而 {1,2,2} 和 {1,3,4} 都不是排列,因为前者存在重复元素,后者包含了超出范围的数。 子数组[3]:从原数组中,连续的选择一段元素(可以全选、可以不选)得到的新数组。
第一行输入一个整数 n(1≦n≦3×105),代表排列中的元素数量。 第二行输入 n 个互不相同的整数 a1,a2,…,an(1≦ai≦n),代表一个排列。
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vec2 = vector<vector<int>>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x) constint maxn = 3e5+5;
vec a(maxn), b(maxn);
intmain(void){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int n; cin >> n; for(int i=1;i<=n;i++){ cin >> a[i]; b[a[i]] = i; } ll ans = 0; int mi = 0x3f3f3f3f, ma = 0; for(int i=1;i<=n;i++){ mi = min(mi, b[i]), ma = max(ma, b[i]); ans += 1LL * mi * (n - ma + 1); } cout << ans << '\n'; return0; }
D
小红拿到了一个 n 行 m 列的矩阵,她希望其中的矩阵不动点尽可能多,为此她可以进行至多一次如下操作: ∙选择两个不同位置上,将它们上的元素交换。 请你帮小红求出能得到的最大矩阵不动点数量。
【名词解释】 矩阵不动点:定义整数二元组 {i,j}(1≦i≦n,1≦j≦m) 是 n 行 m 列的矩阵 a1,1a2,1⋮an,1a1,2a2,2⋮an,2⋯⋯⋱⋯a1,ma2,m⋮an,m 的一个矩阵不动点,当且仅当满足 ai,j=min(i,j)。
第一行输入两个整数 n,m(1≦n,m≦500),代表矩阵的行数和列数。 此后 n 行,第 i 行输入 m 个正整数 ai,1,ai,2,…,ai,m(1≦ai,j≦500),其中,ai,j 代表矩阵的第 i 行第 j 列的元素。
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vec2 = vector<vector<int>>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x) constint maxn = 505;
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vec2 = vector<vector<int>>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x)
intmain(void){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int n ,k; cin >> n >> k; if(k + 1 == n) {cout << "-1\n"; return0;} for(int i=1;i<=k;i++) cout << i << ' '; int si = n-k; if(si&1){ for(int i=k+ceil(si/2.0);i<=n;i++) cout << i << ' '; for(int i=k+1;i<k+ceil(si/2.0);i++) cout << i << ' '; } else{ for(int i=n;i>k;i--) cout << i << ' '; } cout << '\n'; return0; }
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vec2 = vector<vector<int>>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x)
intmain(void){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int a,b,c,d; cin >> a >> b >> c >> d; int cnt = 0; if(a == 1) cnt++; if(b == 2) cnt++; if(c == 3) cnt++; if(d == 4) cnt++; cout << cnt << '\n'; return0; }
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x)
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x)
intmain(void){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); string s; while(getline(cin, s)){ s = s + " nya"; cout << s << '\n'; } return0; }
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x)
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x) constint maxn = 5e5+5; int n, m, s, a, b; vec e[maxn], d(maxn); vector <vector<int>> f(maxn, vector<int>(25));
#include<bits/stdc++.h> usingnamespace std; using ll = longlong; using ull = unsignedlonglong; using pii = pair<int,int>; using pll = pair<ll,ll>; using pull = pair<ull,ull>; using vec = vector<int>; using vec2 = vector<vector<int>>; using vecl = vector<ll>; using maii = map<int,int>; #define pb(x) push_back(x) #define eb(x) emplace_back(x) constint maxn = 1e5+5; int n, q;