#include<bits/stdc++.h>
using namespace std;
const int N =20;
int t1,t2;
typedef struct Description{
int minute;
int number;
int snumber;
};
Description team[N];
void fun(int c,int d){
if(c>d)
team[t1].minute+=3,
team[t1].number+=c-d,
team[t2].number+=d-c,
team[t1].snumber+=c,
team[t2].snumber+=d;
else
if(c==d)
team[t1].minute+=1,
team[t2].minute+=1,
team[t1].snumber+=c,
team[t2].snumber+=d;
else
team[t2].minute+=3,
team[t1].number+=c-d,
team[t2].number+=d-c,
team[t1].snumber+=c,
team[t2].snumber+=d;
}
int main(){
int t;
cin>>t;
while (t--){
for (int i = 1; i <=15; ++i) {
char a,b;
int c,d,e,f;
cin >>a>>b>>c>>d>>e>>f;
t1=a-'A'+1;
t2=b-'A'+1;
fun(c,d);
fun(e,f);
}
for (int i = 1; i <=6; ++i) {
cout<<team[i].minute<<' '<<team[i].number<<' '<<team[i].snumber<<endl;
}
}
}
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m, r, c, x;
while(cin >> n >> m >> r >> c >> x) {
int p1 = r * c - 1;
int p2 = (n - r + 1) * (m - c + 1) - 1;
if(p1 > x - 1 || p2 > (n * m - x)) {
cout << "No\n";
} else {
cout << "Yes\n";
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
void slove(int n) {
vector<int> a(n);
set<int> s;
for(int i=0;i<n;i++) {
cin >> a[i];
s.insert(a[i]);
}
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++) {
if((a[i] + a[j]) % 2 == 0 ) {
int x = (a[i] + a[j]) / 2;
if(s.count(x)) {
s.erase(s.find(x));
}
}
}
}
cout << n - s.size() << '\n';
}
int main() {
int n;
while(cin >> n) {
slove(n);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
void slove(int n, int m) {
vector<LL> inv(n + m + 1);
inv[0] = inv[1] = 1;
for(int i = 2; i <= n + m; i ++ ) {
inv[i] = mod - mod / i * inv[mod % i] % mod;
}
LL res = 1, ans = 0;
for(int i=1;i<=m;i++) {
res = res * i % mod;
}
ans = (ans + res) % mod;
for(int i=2;i<=n;i++) {
res = res * inv[i - 1] % mod * (i + m - 1) % mod;
ans = (ans + res) % mod;
}
cout << ans << '\n';
}
int main() {
int n, m;
while(cin >> n >> m) {
slove(n, m);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
int norm(int x) {
if (x < 0) {
x += mod;}
if (x >= mod) {
x -= mod;}
return x;
}
template<class T>
T ksm(T x,LL y){
T res = 1;
for(;y;y>>=1){
if(y&1)
res = res*x;
x=x*x;
}
return res;
}
struct modint {
int x;
modint(int x = 0) : x(norm(x)) {
}
modint(LL x) : x(norm((int)(x%mod))) {
}
int val() const {
return x;}
modint operator-() const {
return modint(norm(mod - x));}
modint inv() const {
assert(x != 0);return ksm(*this, mod - 2);}
modint &operator*=(const modint &rhs) {
x = LL(x) * rhs.x % mod;return *this;}
modint &operator+=(const modint &rhs) {
x = norm(x + rhs.x);return *this;}
modint &operator-=(const modint &rhs) {
x = norm(x - rhs.x);return *this;}
modint &operator/=(const modint &rhs) {
return *this *= rhs.inv();}
friend modint operator*(const modint &lhs, const modint &rhs) {
modint res = lhs;res *= rhs;return res;}
friend modint operator+(const modint &lhs, const modint &rhs) {
modint res = lhs;res += rhs;return res;}
friend modint operator-(const modint &lhs, const modint &rhs) {
modint res = lhs;res -= rhs;return res;}
friend modint operator/(const modint &lhs, const modint &rhs) {
modint res = lhs;res /= rhs;return res;}
friend std::istream &operator>>(std::istream &is, modint &a) {
LL v;is >> v;a = modint(v);return is;}
friend std::ostream &operator<<(std::ostream &os, const modint &a) {
return os << a.val();}
};
void slove(int n) {
vector<int> a(n);
for(int i=0;i<n;i++) {
cin >> a[i];
}
int cnt = 0;
vector<int> siz(n + 1), l(n + 1), r(n + 1), val(n + 1);
function<int(int, int)> dfs = [&](int rt, int x) {
if(!rt) {
rt = ++ cnt;
siz[rt] = 1;
val[rt] = x;
return rt;
}
siz[rt] ++;
if(x < val[rt]) {
l[rt] = dfs(l[rt], x);
} else {
r[rt] = dfs(r[rt], x);
}
return rt;
};
dfs(0, a[0]);
for(int i=1;i<n;i++) {
dfs(1, a[i]);
}
vector<modint> fac(n + 1), ifac(n + 1);
fac[0] = 1;
for(int i=1;i<=n;i++) {
fac[i] = fac[i - 1] * i;
}
ifac[n] = fac[n].inv();
for(int i=n-1;i>=0;i--) {
ifac[i] = ifac[i + 1] * (i + 1);
}
auto C = [&] (int x, int y) -> modint{
return fac[x] * ifac[x - y] * ifac[y];
};
function<modint(int)> dfs1 = [&] (int rt) -> modint {
if(rt == 0) {
return 1;
}
return dfs1(l[rt]) * dfs1(r[rt]) * C(siz[l[rt]] + siz[r[rt]], siz[l[rt]]);
};
cout << dfs1(1) << '\n';
}
int main() {
int n;
while(cin >> n) {
slove(n);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define se second
void slove(string s, int d) {
string ans = s;
vector<stack<int>> st(10); // 栈
vector<priority_queue<pii, vector<pii>, greater<pii>>> pq(10);
vector<vector<int>> a(10);
d ++;
int n = s.size();
for(int i = 1;i <= min(d, n - 1); i ++) {
st[s[i] - '0'].push(i);
}
vector<int> vis(n); // 标记是否被交换
for(int i = 0; i < n; i ++) {
// 第一遍找出每个元素的交换数字
if(i > 0 && i + d < n) {
st[s[i + d] - '0'].push(i + d);
}
if(!vis[i]) {
for(int j = 9; j > s[i] - '0'; j --) {
if(!st[j].empty() && st[j].top() > i) {
vis[st[j].top()] = 1;
a[j].push_back(i); // 预定
st[j].pop();
break;
}
}
}
}
for(int i = n - 1; i >= 0; i --) {
// 交换已经确定,选择更加好的交换 越后面的换越小的
if(vis[i]) {
// 这个需要交换
int x = s[i] - '0';
while(a[x].size() && a[x].back() + d >= i) {
int w = a[x].back();
pq[x].push({
s[w] - '0', w});
a[x].pop_back();
}
auto y = pq[x].top();
pq[x].pop();
swap(ans[y.se], ans[i]);
}
}
cout << ans << '\n';
}
int main() {
string s;
int d;
while(cin >> s >> d) {
slove(s, d);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define all(x) (x).begin(),(x).end()
const int di[]={
-1, 0, 1, 0, -1};
void slove(int n, int m) {
vector<vector<char>> a(n, vector<char>(m, 0));
int sx = 0, sy = 0; // 起始点
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin >> a[i][j];
if((i == 0 || i == n - 1 || j == 0 || j == m - 1) && a[i][j] == '.') {
sx = i, sy = j;
}
}
}
vector<vector<int>> vis(n, vector<int>(m, 0));
auto vis1 = vis;
int cnt = 0;
vector<int> res(30);//是否是陷阱
vector<vector<int>> g(30), bi(n, vector<int>(m, -1)); // 建图以及编号数组
vector<pii> id(30);// 每个编号对应坐标
bi[sx][sy] = 0; // 起始点看做一个点
id[0] = {
sx, sy};
// 先标号
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(a[i][j] != '.' && a[i][j] != '#') {
bi[i][j] = ++ cnt;
id[cnt] = {
i, j};
res[cnt] = (a[i][j] == 'X');
}
}
}
function<void(int, int, int)> dfs1 = [&] (int id, int x, int y) {
vis[x][y] = 1;
for(int k = 0; k < 4; k ++) {
int tx = x + di[k];
int ty = y + di[k + 1];
if(tx < 0 || tx >= n || ty < 0 || ty >= m || vis[tx][ty] || a[tx][ty] == '#') {
continue;
}
if(bi[tx][ty] != -1) {
g[id].push_back(bi[tx][ty]);
continue;
}
dfs1(id, tx, ty);
}
};
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(bi[i][j] >= 0) {
// 建图
vis = vis1;
dfs1(bi[i][j], i, j);
}
}
}
cnt ++;
vector<vector<int>> f(1 << cnt, vector<int>(cnt, -1)); // 遍历过的点的状态, 当前点
vector<int> vis2(30);
int ans = 0;
function<void(int, int)> dfs2 = [&] (int s, int x) {
if(f[s][x] != -1) {
//这个状态遍历过
return ;
}
f[s][x] = 1;
if(x == 0) {
// 走到了出口
int res1 = 0;
fill(all(vis2), 0);
for(int i=1;i<cnt;i++) {
if((s >> i) & 1) {
if(!res[i]) res1 ++ ;
auto [wx, wy] = id[i];
for(int k = 0; k < 4 ;k ++) {
// 找每个点周围的宝藏
int tx = wx + di[k];
int ty = wy + di[k + 1];
if(tx < 0 || tx >=n || ty < 0 || ty >= m || a[tx][ty] != '@') {
continue;
}
int si = bi[tx][ty];
if(!((s >> si) & 1) && !vis2[si]) {
res1 ++;
vis2[si] = 1;
}
}
}
}
ans = max(ans, res1);
}
for(auto y : g[x]) {
if(((s >> y) & 1) && res[y]) {
// 陷阱不能重复走
continue;
}
dfs2(s | (1 << y), y);
}
};
dfs2(1, 0);
cout << ans << '\n';
}
int main() {
int n, m;
while( cin >> n >> m) {
slove(n, m);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef double db;
typedef pair<db, db> PDD;
#define fi first
#define se second
db r1, r2;
struct Point {
db x, y, z;
Point(db _x = 0.0, db _y = 0.0, db _z = 0.0) : x(_x), y(_y), z(_z) {
}
Point operator-(const Point &m) const {
return Point(x - m.x, y - m.y, z - m.z);
}
Point operator+(const Point &m) const {
return Point(x + m.x, y + m.y, z + m.z);
}
Point operator^(const Point &m) const {
return Point(y * m.z - z * m.y, z * m.x - x * m.z, x * m.y - y * m.x);
}
db operator*(const Point &m) const {
return x * m.x + y * m.y + z * m.z; }
db len() {
return sqrt(x * x + y * y + z * z); }
friend istream &operator>>(istream &in, Point &m) {
in >> m.x >> m.y >> m.z;
return in;
}
} O1, O2, V1, V2;
db U(PDD A, PDD B) {
db res = min(A.se, B.se) - max(A.fi, B.fi);
return res < 0 ? 0 : res;
}
db mat[5][5];
void gauss(int n) {
for (int now = 1, to, i = 1; i <= n; i++, now++) {
for (to = now; !mat[to][i] && to <= n; to++);
if (to ^ now)
for (int j = 1; j <= n + 1; j++) swap(mat[to][j], mat[now][j]);
db t = mat[now][i];
assert(t != 0);
for (int j = 1; j <= n + 1; j++) mat[now][j] /= t;
for (int j = 1; j <= n; j++)
if (j ^ now) {
t = mat[j][i];
for (int k = 1; k <= n + 1; k++) mat[j][k] -= t * mat[now][k];
}
}
}
int main() {
while (cin >> r1 >> O1 >> V1 >> r2 >> O2 >> V2) {
Point Di = V1 ^ V2;
mat[1][1] = V1.x, mat[1][2] = V1.y, mat[1][3] = V1.z, mat[1][4] = V1 * O1;
mat[2][1] = V2.x, mat[2][2] = V2.y, mat[2][3] = V2.z, mat[2][4] = V2 * O2;
mat[3][1] = Di.x, mat[3][2] = Di.y, mat[3][3] = Di.z, mat[3][4] = Di * O1;
gauss(3);
Point K1(mat[1][4], mat[2][4], mat[3][4]);
mat[1][1] = V1.x, mat[1][2] = V1.y, mat[1][3] = V1.z, mat[1][4] = V1 * O1;
mat[2][1] = V2.x, mat[2][2] = V2.y, mat[2][3] = V2.z, mat[2][4] = V2 * O2;
mat[3][1] = Di.x, mat[3][2] = Di.y, mat[3][3] = Di.z, mat[3][4] = Di * O2;
gauss(3);
Point K2(mat[1][4], mat[2][4], mat[3][4]);
db h1 = (O1 - K1).len(), h2 = (O2 - K2).len();
if (h1 >= r1 || h2 >= r2) {
cout << 0 << '\n';
} else {
db L = (K1 - K2).len();
db l1 = sqrt(r1 * r1 - h1 * h1), l2 = sqrt(r2 * r2 - h2 * h2);
cout << U({
-l1, l1}, {
L - l2, L + l2}) << '\n';
}
}
return 0;
}
#待更新
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
int ans[maxn], mi; // 答案数组和区间标记
struct AC {
const int N = 1e6 + 10;
vector<vector<int>> t, num;
vector<int> fail;
int tot = 1;
AC () {
num.resize(N);
fail.resize(N);
t.resize(N);
for(int i = 0; i < N; i ++) {
t[i].resize(26);
}
}
void insert(string s, int id){
int p = 1, len = s.size();
for(int i = 0; i < len; i ++) {
int ch = s[i] - 'a';
if(!t[p][ch]) {
t[p][ch] = ++ tot;
}
p = t[p][ch];
}
num[p].push_back(id);
}
void getfail(){
for(int i = 0; i < 26; i ++ ) {
t[0][i] = 1;
}
queue<int> q;
q.push(1);
fail[1] = 0;
while(q.size()){
int u = q.front();
q.pop();
for(int i = 0; i < 26; i ++){
//遍历所有儿子
int v = t[u][i];
int Fail = fail[u];//失配结点 tire[fail].son[i] 与i相同
if(!v) {
//没有的话 通过父亲对的失配来连接
t[u][i] = t[Fail][i];
continue;
}
fail[v] = t[Fail][i];//存在 直接指
q.push(v);
}
}
}
void query(string s, int l, int r, int op){
vector<int> ed(tot + 1); // 防止重复计算
int p = 1, len = s.size();
for(int i = 0; i < len; i ++){
int v = s[i]-'a';
int k = t[p][v];//跳fail
while(k > 1 && !ed[k]){
// 不唯一
for(auto x : num[k]) {
if(op == 0) {
// 删除的串
if(x >= l && x <= r) {
// 注意范围
mi = min(mi, x);
}
} else {
// 询问串
if(x >= l && x <= r) {
// 注意范围
ans[x] ++; // 直接添加
}
}
}
ed[k] = 1; // 标记
k = fail[k];
}
p = t[p][v];
}
}
};
void slove() {
int n;
cin >> n;
vector<char> op(n);
vector<string> s(n);
AC t1, t2;
for(int i=0;i<n;i++) {
cin >> op[i] >> s[i];
if(op[i] == 'Q') t1.insert(s[i], i);
if(op[i] == 'D') t2.insert(s[i], i);
}
t1.getfail();
t2.getfail();
for(int i=0;i<n;i++) {
if(op[i] == 'I') {
mi = 1e9;
t2.query(s[i], i, n, 0); // 找范围
t1.query(s[i], i, mi - 1, 1); // 直接统计
}
}
for(int i=0;i<n;i++) {
if(op[i] == 'Q') {
cout << ans[i] << '\n';
}
}
}
int main() {
int t = 1;
while(t -- ) {
slove();
}
return 0;
}