#include <bits/stdc++.h>
using namespace std;
int n, k;
const int N = 55, M = 210;
unordered_set<int>s;
int a[N], b[M];
bool st[N];
void dfs(int c, int num)
{
if (c == 4)
{
if (num % 4 == 0)
{
s.insert(num / 4);
return;
}
}
for (int i = 1; i <= n; i++)
{
if (!st[i])
{
st[i] = true;
dfs(c + 1, num + a[i]);
st[i] = false;
}
}
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)cin >> a[i];
dfs(0, 0);
while (k--)
{
int m;
cin >> m;
bool ok = 1;
for (int i = 1; i <= m; i++)
{
int x;
cin >> x;
if (s.count(x) == 0)ok = 0;
}
if (ok)cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_set>
#include<vector>
using namespace std;
const int N = 55, M = 255 * 4;
int n, m, k, x;
int num[N];
bool st[M];
vector<int> a;
unordered_set<int> s;
void init()
{
for (int a = 0; a < n; a++)
{
for (int b = a + 1; b < n; b++)
{
for (int c = b + 1; c < n; c++)
{
for (int d = c + 1; d < n; d++)
st[num[a] + num[b] + num[c] + num[d]] = true;
}
}
}
}
bool judge()
{
for (int& x : a)
if (!st[x * 4])
return false;
return true;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> num[i];
init();
while (m--)
{
cin >> k;
a.clear();
a.resize(k);
for (int i = 0; i < k; i++)
cin >> a[i];
judge() ? puts("Yes") : puts("No");
}
return 0;
}*/
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x, y, v;
bool operator < (const node& W) const
{
return (x != W.x && x < W.x) || (y != W.y && y < W.y);
}
};
int n;
const int N = 1e5 + 10;
map<double, vector<node>>mp;
int sum, cnt;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
int x, y, s;
cin >> x >> y >> s;
sum += s;
double k = y * 1.0 / x;
mp[k].push_back({ x,y,s });
}
for (auto t : mp)
{
auto vc = t.second;
sort(vc.begin(), vc.end());
int flag = 0;
for (auto tt : vc)
{
if (tt.v != 1 && flag == 0)cnt++;
if (tt.v != 1 && flag != 0)
{
flag = 0;
cnt += 2;
}
if (tt.v == 1)
{
flag++;
}
}
if (flag)cnt++;
}
cout << sum << " " << cnt;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> P;
const int inf = 1e9 + 10;
const int maxn = 1010;
int e[maxn][maxn];
struct edge { int to, w1, w2; };
vector<edge>G[maxn];
struct node {
int u, w1, w2;
bool operator < (const node& b)const { return w1 != b.w1 ? w1 > b.w1 : w2 < b.w2; }
};
int dist[maxn], dist2[maxn], vis[maxn], pre[maxn];
void dfs(int x) {
if (pre[x] == -1)return;
dfs(pre[x]);
cout << "->" << x;
}
int main() {
memset(e, 0x3f, sizeof(e));
int n, m; cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, w1, w2; cin >> u >> v >> w1 >> w2;
e[u][v] = e[v][u] = w1;
G[u].push_back({ v,w1,w2 });
G[v].push_back({ u,w1,w2 });
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
e[i][j] = min(e[i][j], e[i][k] + e[k][j]);
}
}
}
int rt = -1, mx = inf;
for (int i = 1; i <= n; i++) {
int tmp = 0;
for (int j = 1; j <= n; j++)
tmp = max(tmp, e[i][j]);
if (tmp < mx) {
mx = tmp; rt = i;
}
}
for (int i = 1; i <= n; i++)dist[i] = inf, pre[i] = -1;
priority_queue<node>q;
dist[rt] = 0, dist2[rt] = 0;
q.push({ rt,dist[rt],dist2[rt] });
while (q.size()) {
int u = q.top().u; q.pop();
if (vis[u])continue;
vis[u] = 1;
for (edge nt : G[u]) {
int v = nt.to;
if (dist[v] > dist[u] + nt.w1) {
dist[v] = dist[u] + nt.w1;
dist2[v] = dist2[u] + nt.w2;
pre[v] = u;
q.push({ v,dist[v], dist2[v] });
}
else if (dist[v] == dist[u] + nt.w1 && dist2[nt.to] < dist2[u] + nt.w2) {
dist2[v] = dist2[u] + nt.w2;
pre[v] = u;
q.push({ v,dist[v], dist2[v] });
}
}
}
cout << rt << "\n";
int T; cin >> T;
while (T--) {
int x; cin >> x;
cout << rt;
dfs(x);
cout << "\n";
cout << dist[x] << " " << dist2[x] << "\n";
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int fa[maxn + 10];
void init(int n) { for (int i = 1; i <= n; i++)fa[i] = i; }
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
void merge(int x, int y) { x = find(x); y = find(y); if (x != y)fa[x] = y; }
vector<int>G[maxn];
vector<pair<int, int> >query[maxn];
int dd[maxn], vis[maxn];
int ans[maxn];
int main() {
int n, m, d; cin >> n >> m >> d;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= d; i++) {
int c, q; cin >> c >> q;
vis[c] = 1;
dd[i] = c;
while (q--) {
int u, v; cin >> u >> v;
query[i].push_back(make_pair(u, v));
}
}
init(n + 1);
for (int i = 1; i <= n; i++) {
if (vis[i] == 0) {
for (int j = 0; j < G[i].size(); j++) {
if (vis[G[i][j]] == 0)merge(i, G[i][j]);
}
}
}
for (int i = d; i >= 1; i--) {
for (int j = 0; j < query[i].size(); j++) {
int x = find(query[i][j].first), y = find(query[i][j].second);
if (x != y)ans[i]++;
}
vis[dd[i]] = 0;
for (int j = 0; j < G[dd[i]].size(); j++) {
if (vis[G[dd[i]][j]] == 0)merge(dd[i], G[dd[i]][j]);
}
}
for (int i = 1; i <= d; i++)
cout << ans[i] << "\n";
return 0;
}