A - Character Encoding

题意:用m个$0-n-1$的数去构成k,求方案数

思路:当没有0-n-1这个条件是答案为C(k+m-1, m-1),减去有大于的关于n的情况,当有i个n时的种类为C(k+m-1-i*n,m-1)个,利用容斥定理可得

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 const int MOD = ;
const int maxn = 1e6 + ; ll fac[maxn];
ll inv[maxn];
ll invfac[maxn]; void Init()
{
fac[] = inv[] = invfac[] = ;
fac[] = inv[] = invfac[] = ;
for(int i = ; i < maxn; ++i)
{
fac[i] = fac[i - ] * i % MOD;
inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
invfac[i] = invfac[i - ] * inv[i] % MOD;
}
} ll calc(ll n, ll m)
{
if(m > n || m < || n < ) return ;
return fac[n] * invfac[m] % MOD * invfac[n - m] % MOD;
} int n, m , k; int main()
{
Init();
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d %d %d", &n, &m, &k);
ll ans = ;
for(int i = ; i <= m; ++i)
{
ll tmp = k - 1ll * i * n + m - ;
if(tmp < ) break;
if(i & ) ans = (ans - calc(m, i) * calc(tmp, m - ) % MOD + MOD) % MOD;
else ans = (ans + calc(m, i) * calc(tmp, m - ) % MOD) % MOD;
// cout << i << " " << m << " " << calc(m, i);
// cout << tmp << " " << m - 1 << " " << calc(tmp, m - 1) << endl;
}
printf("%lld\n", ans);
}
return ;
}

B - Pizza Hub

题意:给出一个三角形,以及一个矩形的宽度,求一个最小的高度使得矩形能够覆盖三角形

思路:显然一定有一个点在矩形的顶点,枚举计算即可

 #include<bits/stdc++.h>

 using namespace std;

 const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-;
const int maxn = 1e2; int sgn(double x)
{
if(fabs(x) < eps) return ;
else return x > ? : -;
} struct Point{
double x, y;
Point(){}
Point(double _x, double _y)
{
x = _x;
y = _y;
} void input()
{
scanf("%lf %lf", &x, &y);
} Point operator - (const Point &b) const
{
return Point(x - b.x, y - b.y);
} double operator ^ (const Point &b) const
{
return x * b.y - y * b.x;
} double distance(Point p)
{
return hypot(x - p.x, y - p.y);
} double len()
{
return hypot(x, y);
} double operator * (const Point &b) const
{
return x * b.x + y * b.y;
}
}P[maxn]; int w;
double ans;
double area; void calc(Point a, Point b)//low high
{
if(sgn(a * b) < ) return ;
if(sgn(a * a - w * w) <= )
{
if(sgn(a ^ b) < ) return ;
if(sgn((a * b) * (a * b) - w * w * (a * a)) > ) return ;
ans = min(ans, (a ^ b) / sqrt(a * a));
}
else
{
double h = sqrt(a * a - w * w);
double src1 = atan(h / w);
if(sgn(a ^ b) >= )
{
double src2 = acos((a * b) / (sqrt(a * a) * sqrt(b * b)));
if(sgn(src1 + src2 - PI / ) > ) return ;
double len1 = sqrt(b * b) * cos(src1 + src2);
if(sgn(len1 - w) > ) return ;
ans = min(ans, max(h, sqrt(b * b) * sin(src1 + src2)));
}
else
{
double src2 = acos((a * b) / (sqrt(a * a) * sqrt(b * b)));
if(sgn(src1 - src2) < ) return ;
double len1 = sqrt(b * b) * cos(src1 - src2);
if(sgn(len1 - w) > ) return ;
ans = min(ans, h);
}
}
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
for(int i = ; i <= ; ++i) P[i].input();
// double a = p[1].distance(p[2]);
// double b = p[2].distance(p[3]);
// double c = p[3].distance(p[1]);
// double p = (a + b + c) / 2.0;
// area = sqrt(p * (p - a) * (p - b) * (p - c));
ans = INF * 1.0;
scanf("%d", &w);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
for(int i = ; i <= ; ++i) P[i].y *= -1.0;
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
calc(P[] - P[], P[] - P[]);
if(ans >= INF * 1.0) puts("impossible");
else printf("%.10f\n", ans);
}
return ;
}

C - City Development

留坑。

D - Parentheses Matrix

题意:构造一个矩阵,每一行和每一列都会构成一个括号序列,求合法括号序列尽量多

思路:

分类讨论:

n, m  都是奇数  随便构造

n, m 有一个奇数 那么 答案是那个奇数

比如 1 4

()()

两个都是偶数  如果有一个为2

比如 2 4

((((

))))

如果两个都大于四

比如六 六

((((((

()()()

(()())

()()()

(()())

)))))

像这样构造 答案是 n + m - 4

如果 n, m 中有个4

比如  4 4

(())

()()

(())

()()

 #include<bits/stdc++.h>

 using namespace std;

 const int maxn =  + ;

 int n, m;
char str[maxn][maxn]; int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
// printf("%d %d\n", n, m);
if(n % == && m % == )
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
printf("(");
}
printf("\n");
}
}
else if(n % == )
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
if(j & ) printf("(");
else printf(")");
}
printf("\n");
}
}
else if(m % == )
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
if(i & ) printf("(");
else printf(")");
}
printf("\n");
}
}
else if(n == )
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
if(i & ) printf("(");
else printf(")");
}
printf("\n");
}
}
else if(m == )
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
if(j & ) printf("(");
else printf(")");
}
printf("\n");
}
}
else if(n == )
{
for(int i = ; i <= m; ++i) printf("(");
printf("\n");
for(int i = ; i <= m; ++i)
{
if(i & ) printf("(");
else printf(")");
}
printf("\n");
for(int i = ; i <= m; ++i)
{
if(i & ) printf(")");
else printf("(");
}
printf("\n");
for(int i = ; i <= m; ++i) printf(")");
printf("\n");
}
else if(m == )
{
for(int i = ; i <= n; ++i) str[i][] = '(';
for(int i = ; i <= n; ++i)
{
if(i & ) str[i][] = '(';
else str[i][] = ')';
}
for(int i = ; i <= n; ++i)
{
if(i & ) str[i][] = ')';
else str[i][] = '(';
}
for(int i = ; i <= n; ++i) str[i][] = ')';
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
printf("%c", str[i][j]);
}
printf("\n");
}
}
else
{
for(int i = ; i <= m; ++i) str[][i] = '(';
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
if(i & )
{
if(j == ) str[i][j] = '(';
else if(j == m) str[i][j] = ')';
else if(j & ) str[i][j] = ')';
else str[i][j] = '(';
}
else
{
if(j & ) str[i][j] = '(';
else str[i][j] = ')';
}
}
}
for(int i = ; i <= m; ++i) str[n][i] = ')';
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= m; ++j)
{
printf("%c", str[i][j]);
}
printf("\n");
}
}
}
return ;
}

E - Magic Square

按题意模拟即可。

 #include <bits/stdc++.h>
using namespace std; #define pii pair <int, int>
int t, n;
char G[][]; void C(pii a)
{
int x = a.first, y = a.second;
char tmp[][];
tmp[][] = G[x + ][y];
tmp[][] = G[x][y];
tmp[][] = G[x + ][y + ];
tmp[][] = G[x][y + ];
for (int i = ; i <= ; ++i)
for (int j = ; j <= ; ++j)
G[x + i - ][y + j - ] = tmp[i][j];
} void R(pii a)
{
int x = a.first, y = a.second;
char tmp[][];
tmp[][] = G[x][y + ];
tmp[][] = G[x + ][y + ];
tmp[][] = G[x][y];
tmp[][] = G[x + ][y];
for (int i = ; i <= ; ++i)
for (int j = ; j <= ; ++j)
G[x + i - ][y + j - ] = tmp[i][j];
} pii pos[] =
{
pii(, ),
pii(, ),
pii(, ),
pii(, ),
}; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = ; i <= ; ++i) scanf("%s", G[i] + );
char op; int x;
for (int i = ; i <= n; ++i)
{
scanf("%d %c", &x, &op);
if (op == 'C') C(pos[x - ]);
else R(pos[x - ]);
}
for (int i = ; i <= ; ++i) printf("%s\n", G[i] + );
}
return ;
}

F - Boolean 3-Array

留坑。

G - Card Game

留坑。

H - K-Similar Strings

留坑。

I - Make ZYB Happy

留坑。

J - Taotao Picks Apples

题意:每次可以改变一个值,求改变之后以第一个数开头的最长上升子序列的长度,改变仅当次有效

思路:考虑线段树,维护一个cnt, 和一个Max  两个区间合并的时候

如果左区间的$Max > 右区间的 Max$

那么右区间没有贡献

否则递归查找贡献

 #include <bits/stdc++.h>
using namespace std; #define N 100010
int t;
int n, m;
int arr[N]; struct SEG
{
int cnt[N << ], Max[N << ];
void build(int id, int l, int r)
{
cnt[id] = Max[id] = ;
if (l == r) return;
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
}
int query(int id, int l, int r, int val)
{
if (l == r) return Max[id] > val;
int mid = (l + r) >> ;
if (Max[id] <= val) return ;
if (Max[id << ] <= val) return query(id << | , mid + , r, val);
else return cnt[id] - cnt[id << ] + query(id << , l, mid, val);
}
void update(int id, int l, int r, int pos, int val)
{
if (l == r)
{
cnt[id] = ;
Max[id] = val;
return;
}
int mid = (l + r) >> ;
if (pos <= mid) update(id << , l, mid, pos, val);
else update(id << | , mid + , r, pos, val);
cnt[id] = cnt[id << ] + query(id << | , mid + , r, Max[id << ]);
Max[id] = max(Max[id << ], Max[id << | ]);
}
}seg; int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i) scanf("%d", arr + i);
seg.build(, , n);
for (int i = ; i <= n; ++i) seg.update(, , n, i, arr[i]);
for (int i = , x, v; i <= m; ++i)
{
scanf("%d%d", &x, &v);
seg.update(, , n, x, v);
printf("%d\n", seg.cnt[]);
seg.update(, , n, x, arr[x]);
}
}
return ;
}

K - Pop the Balloons

留坑。

L - From ICPC to ACM

留坑。

2018 Multi-University Training Contest 8 Solution的更多相关文章

  1. 2018 Multi-University Training Contest 1 Solution

    A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, ...

  2. 2018 Multi-University Training Contest 2 Solution

    A - Absolute 留坑. B - Counting Permutations 留坑. C - Cover 留坑. D - Game puts("Yes") #include ...

  3. 2018 Multi-University Training Contest 3 Solution

    A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...

  4. 2018 Multi-University Training Contest 4 Solution

    A - Problem A. Integers Exhibition 留坑. B - Problem B. Harvest of Apples 题意:计算$\sum_{i = 0}^{i = m}C( ...

  5. 2018 Multi-University Training Contest 5 Solution

    A - Always Online Unsolved. B - Beautiful Now Solved. 题意: 给出一个n, k  每次可以将n这个数字上的某两位交换,最多交换k次,求交换后的最大 ...

  6. 2018 Multi-University Training Contest 6 Solution

    A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) ...

  7. 2018 Multi-University Training Contest 7 Solution

    A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...

  8. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  9. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

随机推荐

  1. jquery 获取当前时间加180天

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. [020]Sencha Ext JS 6.0使用教程2

    本节主要以典型例子介绍如何用Sencha Ext JS6.0进行项目开发 入门阶段总是比较难的,掌握了基本操作步骤,使用方法,架构思维,开发起来还是满顺利,开心的,自己又能掌握一门新技术,又能进步,主 ...

  3. 【IOS6.0 自学瞎折腾】(五)应用程序的启动过程和Application生命周期

    一 :main函数入口 看下项目资源结构,其实程序的入口也是在main.m里面. #import <UIKit/UIKit.h> #import "BvinAppDelegate ...

  4. c++11——改进容器性能

    使用emplace_back就地构造 emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好的避免内存的拷贝和移动,使得容器插入元素的性能得到进一步提升. ...

  5. VIM 插入

    不知道有多少VIM新手和我当年(去年)一样,信誓旦旦的以为只有i可以插入 唉,现在想想都觉得可笑,都是Windows下的编辑器用多了的结果 鼠标一点,妈妈再也不用担心我的文本插入了……悲剧! 好了,让 ...

  6. FileInputStream与FileOutputStream类 Reader类和Writer类 解析

    FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名. 创建FileInputStream实例对象时,指 ...

  7. 关于用phonegap 3.0+ 打包后sencha touch按钮点击切换动画延迟接近一秒的以及界面闪烁的解决方案

    android的webview对硬件加速的支持貌似很不理想,在开启硬件加速的情况下,css3这些需要调用硬件加速的样式会大幅拖慢html5的webapp,在htc的部分手机上还会因开启硬件加速而导致闪 ...

  8. 关于wcf三大工具的使用(wsdl.exe svcutil.exe disco.exe)

    首先,我们必须创建一个wcf服务.并部署到IIS中.这里我已经将一个StudentService服务部署到我自己的电脑了. (1)svcutil.exe svcutil.exe工具的作用是通过服务地址 ...

  9. 【BZOJ1096】[ZJOI2007]仓库建设 斜率优化

    [BZOJ1096][ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司 ...

  10. ios 去除UITextField中的空格

    NSString *qName =[userNameText.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNew ...