‘Cursor‘ object has no attribute ‘excute‘
阿新 • • 發佈:2021-01-21
A Large Digits
int n;
int main()
{
IOS;
int a, b, resa = 0, resb = 0;
cin >> a >> b;
while(a) resa += a % 10, a /= 10;
while(b) resb += b % 10, b /= 10;
cout << max(resa, resb) << endl;
return 0;
}
B Gentle Pairs
int n; int x[N], y[N]; int main() { scanf("%d", &n); for(int i = 1; i <= n; ++ i) scanf("%d%d", &x[i], &y[i]); int res = 0; for(int i = 1; i <= n; ++ i) for(int j = i + 1; j <= n; ++ j) { if(x[i] - x[j] == 0) continue; if(x[i] - x[j] > 0) { if(y[i] - y[j] >= x[j] - x[i] && y[i] - y[j] <= x[i] - x[j]) res ++; } if(x[i] - x[j] < 0) { if(y[i] - y[j] <= x[j] - x[i] && y[i] - y[j] >= x[i] - x[j]) res ++; } } printf("%d\n", res); }
C 1-SAT
int n;
map mp;
string str;
int main()
{
IOS;
cin >> n;
for(int i = 1; i <= n; ++ i)
{
cin >> str;
if(str[0] == '!' && mp.count(str.substr(1)))
{
cout << str.substr(1) << endl;
return 0;
}
if(str[0] != '!' && mp.count("!" + str))
{
cout << str << endl;
return 0;
}
mp[str] = 1;
}
puts("satisfiable");
return 0;
}
D Choose Me
不選時\(A += a_i\), \(B += 0\), 選時 \(A += 0\), \(B += a_i + b_i\)
先考慮都不選,每選擇一個相當於從\(A\)中減去一個\(a_i\),\(B\)加一個\(a_i + b_i\),因為是比較大小關係,所以等價於\(A\)不動,\(B + 2 \times a_i + b_i\)
int n; struct zt { int a, b; LL c; }t[N]; bool cmp(zt a, zt b) { return a.c > b.c; } int main() { scanf("%d", &n); LL sum = 0, res = 0; for(int i = 1; i <= n; ++ i) { scanf("%d%d", &t[i].a, &t[i].b); t[i].c = t[i].a * 2 + t[i].b; sum += t[i].a; } sort(t + 1, t + n + 1, cmp); for(int i = 1; i <= n; ++ i) { res += t[i].c; if(res > sum) { printf("%d\n", i); break;} } return 0; }
E Through Path
樹上差分
以1號點為根,預處理每個點的深度.
若對於深度大的點所在分支(即它的子樹)全部\(+x\),只需要對該點\(+x\).
若對於深度小的點所在分支全部\(+x\),可以看成所有點\(+x\),深度大的點所在子樹\(-x\),故維護一個所有點的增加值,並對深度大的點\(-x\).
最後遍歷一遍子樹把標記下傳即可.
int n, m;
struct Edge
{
int to, nxt;
}line[N * 2];
int fist[N], idx;
int dep[N];
LL d[N], res;
void add(int x, int y)
{
line[++ idx] = (Edge){y, fist[x]};
fist[x] = idx;
}
void dfs(int u, int far)
{
for(int i = fist[u]; i != -1; i = line[i].nxt)
{
int v = line[i].to;
if(v == far) continue;
dep[v] = dep[u] + 1;
dfs(v, u);
}
}
void dfs2(int u, int far)
{
for(int i = fist[u]; i != -1; i = line[i].nxt)
{
int v = line[i].to;
if(v == far) continue;
d[v] += d[u];
dfs2(v, u);
}
}
int main()
{
memset(fist, -1, sizeof fist);
scanf("%d", &n);
for(int i = 1; i < n; ++ i)
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs(1, -1);
scanf("%d", &m);
for(int i = 1; i <= m; ++ i)
{
int t, e, x;
scanf("%d%d%d", &t, &e, &x);
int a = line[2 * e].to, b = line[2 * e - 1].to;
if(dep[a] < dep[b] && t == 2) d[b] += x;
if(dep[a] > dep[b] && t == 1) d[a] += x;
if(dep[a] < dep[b] && t == 1) { d[b] -= x; res += x; }
if(dep[a] > dep[b] && t == 2) { d[a] -= x; res += x; }
}
dfs2(1, -1);
for(int i = 1; i <= n; ++ i) printf("%lld\n", d[i] + res);
return 0;
}
F Close Group
令f[i]表示狀態i劃分的團的個數集合中的最小值.
列舉i的子集s, f[i] = min(f[i], f[i - s] + f[s])
int n, m;
int conn[1 << N];
int f[1 << N];
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++ i)
{
int a, b;
scanf("%d%d", &a, &b);
a -- , b -- ;
conn[a] |= (1 << b);
conn[b] |= (1 << a);
}
for(int i = 0; i < n; ++ i) conn[i] |= (1 << i);
memset(f, 0x3f, sizeof f);
f[0] = 0;
for(int i = 1; i < (1 << n); ++ i)
{
int flag = 1;
for(int j = 0; j < n; ++ j)
if(i & (1 << j) && (conn[j] & i) != i)
{
flag = 0;
break;
}
if(flag) f[i] = 1;
for(int s = i; s; s = (s - 1) & i)
f[i] = min(f[i], f[i - s] + f[s]);
}
printf("%d\n", f[(1 << n) - 1]);
return 0;
}
2021.1.21