hdu多校4
Problem L. Graph Theory Homework
思路:很容易想到一步从 1 走到 n 最优。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int, pair<int,int>> using namespace std; const int N = 2e5 + ;
const int M = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); int n, a[N];
int main() {
int T; scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
printf("%d\n", (int)sqrt(abs(a[n] - a[])));
}
return ;
}
/*
*/
Problem K. Expression in Memories
思路:把0的情况搞清楚就好啦。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int, pair<int,int>> using namespace std; const int N = 2e5 + ;
const int M = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); char s[N];
int n;
bool is(char c) {
if(c == '+' || c == '*') return true;
return false;
} int main() {
int T; scanf("%d", &T);
while(T--) {
scanf("%s", s + );
n = strlen(s + );
s[] = '+';
bool flag = true; for(int i = ; i <= n; i++) {
if(is(s[i]) && is(s[i - ])) {
flag = false;
break;
}
}
if(is(s[]) || is(s[n])) flag = false; if(!flag) {
puts("IMPOSSIBLE");
continue;
} for(int i = ; i <= n && flag; i++) {
if(s[i] == '') {
if(s[i - ] >= '' && s[i - ] <= '') continue;
else if(is(s[i - ])) {
if(i < n) {
if(!is(s[i + ])) {
if(s[i + ] == '?') s[i + ] = '+';
else {
flag = false;
break;
}
}
}
} else {
s[i - ] = '';
}
}
} for(int i = ; i <= n; i++) {
if(s[i] == '?') s[i] = '';
} for(int i = ; i <= n; i++) {
if(is(s[i]) && is(s[i - ])) {
flag = false;
break;
}
} for(int i = ; i < n; i++) {
if(s[i] == '' && is(s[i - ])) {
if(s[i + ] >= '' && s[i + ] <= '') {
flag = false;
break;
}
}
} if(is(s[]) || is(s[n])) flag = false; if(!flag) puts("IMPOSSIBLE");
else puts(s + );
}
return ;
}
/*
*/
Problem E. Matrix from Arrays
思路:打表找规律发现,n为奇数的时候n * n的矩阵循环,n为偶数时2n * 2n的矩阵循环,然后就二维前缀和搞一搞。
题目没有取模我傻傻地加了取模WA了一次。。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = + ;
const int mod = 1e9 + ;
LL M[N][N], dp[N][N];
LL A[N];
int n;
LL sum; void init() {
int cursor = ;
for (int i = ; i <= ; ++i) {
for (int j = ; j <= i; ++j) {
M[j][i - j] = A[cursor];
cursor = (cursor + ) % n;
}
}
} LL cal(LL x, LL y) {
LL cnt1 = x / n, cnt2 = y / n;
LL ans = sum * cnt1 * cnt2;
LL num1 = x % n, num2 = y % n; ans += dp[num1][num2];
ans += dp[num1][n - ] * cnt2;
ans += dp[n - ][num2] * cnt1;
return ans;
} int main(){
int T; scanf("%d", &T);
while(T--) {
scanf("%d",&n);
memset(dp, , sizeof(dp));
memset(M, , sizeof(M));
sum = ;
for(int i = ; i < n; i++) scanf("%d", &A[i]);
init(); if(n % == ) n <<= ; for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
sum += M[i][j];
dp[i][j] += M[i][j];
if(i) dp[i][j] += dp[i - ][j];
if(j) dp[i][j] += dp[i][j - ];
if(i && j) dp[i][j] -= dp[i - ][j - ];
}
} int q; scanf("%d", &q);
while(q--) {
LL x0, y0, x1, y1, ans = ;
scanf("%lld%lld%lld%lld", &x0, &y0, &x1, &y1);
ans = cal(x1, y1);
if(x0 && y0) ans += cal(x0 - , y0 - );
if(x0) ans -= cal(x0 - , y1);
if(y0) ans -= cal(x1, y0 - );
printf("%lld\n", ans);
}
}
return ;
} /*
*/
Problem D. Nothing is Impossible
思路:这个题无力吐槽,题面改了又改。。 居然还有那么多人用错的题面过了题。。。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = + ;
const int mod = 1e9 + ; LL n, m, b[N];
int main(){
int T; scanf("%d", &T);
while(T--) {
scanf("%lld%lld", &n, &m);
for(int i = ; i <= n; i++) {
LL a; scanf("%lld%lld", &a, &b[i]);
}
LL now = , ans = ;
sort(b + , b + + n);
for(int i = ; i <= n; i++) {
now *= (b[i] + );
if(now > m) break;
ans = i;
}
printf("%lld\n", ans);
}
return ;
} /*
*/
Problem J. Let Sudoku Rotate
思路:暴力dfs然后剪枝
#include<bits/stdc++.h>
using namespace std; bool did[][][];
char s[][]; struct pos{
int xx,yy,v;
};
vector<pos> v[][][]; int ans;
void Get(int x,int y, int w)
{
char c;
if(w <= ) c = w + '';
else c = 'A' + (w - ); int xx=x/;
int yy=y/; int i,j;
bool judge=false;
for(i=x;i<x+;i++){
for(j=y;j<y+;j++){
if(s[i][j]==c){
judge=true;
break;
}
}
if(judge) break;
}
v[xx][yy][w].push_back({i,j,}); if(i%==&&j%==){
v[xx][yy][w].push_back({i,j+,});
v[xx][yy][w].push_back({i+,j+,});
v[xx][yy][w].push_back({i+,j,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i+,j,}); v[xx][yy][w].push_back({i+,j-,});
v[xx][yy][w].push_back({i,j-,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i-,j,}); v[xx][yy][w].push_back({i-,j+,});
v[xx][yy][w].push_back({i,j+,});
}
else if(i%==&&j%==){ v[xx][yy][w].push_back({i,j-,});
v[xx][yy][w].push_back({i-,j-,});
v[xx][yy][w].push_back({i-,j,});
}
//// else if(i%==&&j%==){ v[xx][yy][w].push_back({i-,j+,});
v[xx][yy][w].push_back({i+,j+,});
v[xx][yy][w].push_back({i+,j+,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i-,j-,}); v[xx][yy][w].push_back({i-,j+,});
v[xx][yy][w].push_back({i-,j+,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i+,j-,}); v[xx][yy][w].push_back({i-,j-,});
v[xx][yy][w].push_back({i-,j-,});
}
else if(i%==&&j%==){ v[xx][yy][w].push_back({i+,j+,});
v[xx][yy][w].push_back({i+,j-,});
v[xx][yy][w].push_back({i+,j-,});
} //
else if(i%==&&j%==){ v[xx][yy][w].push_back({i-,j+,});
v[xx][yy][w].push_back({i-,j+,});
v[xx][yy][w].push_back({i+,j+,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i-,j-,}); v[xx][yy][w].push_back({i-,j-,});
v[xx][yy][w].push_back({i-,j+,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i+,j-,}); v[xx][yy][w].push_back({i+,j-,});
v[xx][yy][w].push_back({i-,j-,});
}
else if(i%==&&j%==){ v[xx][yy][w].push_back({i+,j+,});
v[xx][yy][w].push_back({i+,j+,});
v[xx][yy][w].push_back({i+,j-,});
}
////
else if(i%==&&j%==){ v[xx][yy][w].push_back({i,j+,});
v[xx][yy][w].push_back({i+,j+,});
v[xx][yy][w].push_back({i+,j,});
}
else if(i%==&&j%==){ v[xx][yy][w].push_back({i+,j,});
v[xx][yy][w].push_back({i+,j-,});
v[xx][yy][w].push_back({i,j-,});
}
else if(i%==&&j%==){
v[xx][yy][w].push_back({i-,j,}); v[xx][yy][w].push_back({i-,j+,});
v[xx][yy][w].push_back({i,j+,});
}
else if(i%==&&j%==){ v[xx][yy][w].push_back({i,j-,});
v[xx][yy][w].push_back({i-,j-,});
v[xx][yy][w].push_back({i-,j,});
}
} void dfs(int x,int y,int step){
if(step>=ans) return ;
if(x==){
ans=min(ans,step);
return ;
} for(int i=;i<;i++)
{
bool flag = true;
for(int w = ; w < ; w++) {
int tx=v[x][y][w][i].xx,ty=v[x][y][w][i].yy;
if(did[][tx][w]||did[][ty][w])
flag=false;
} //printf("%d %d\n",tx,ty); if(flag){
for(int w=;w<;w++){
int tx=v[x][y][w][i].xx,ty=v[x][y][w][i].yy;
did[][tx][w]=true;
did[][ty][w]=true;
}
if(y==){
dfs(x+,,step+v[x][y][][i].v);
}
else{
dfs(x,y+,step+v[x][y][][i].v);
}
for(int w=;w<;w++){
int tx=v[x][y][w][i].xx,ty=v[x][y][w][i].yy;
did[][tx][w]=false;
did[][ty][w]=false;
} } } } int main(){
int T; scanf("%d",&T);
while(T--){
memset(did,false,sizeof(did));
for(int i=;i<;i++)
scanf("%s",s[i]); for(int i=;i<;i++)
for(int j=;j<;j++)
for(int w = ; w < ; w++)
v[i][j][w].clear(); for(int i=;i<;i+=)
{
for(int j=;j<;j+=) {
for(int k = ; k < ; k++)
Get(i, j, k);
}
} ans=;
dfs(,,);
printf("%d\n",ans);
}
}
补题****************************************************************
Problem B. Harvest of Apples
思路:这个莫队真的不好想,首先得推出公式来。。。
S(n, m + 1) = S(n, m) + C(n, m + 1)
S(n + 1, m) = 2 * S(n, m) - C(n, m)
然后搞莫队。。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define pLL pair<long long, long long>
#define piii pair<int, pair<int,int>> using namespace std; const int N = 1e5 + ;
const int M = 1e4 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-);
const int B = ; int ans[N], f[N], inv[N];
LL ret;
struct Qus {
int n, m, id;
bool operator < (const Qus &rhs) const {
if(n / B == rhs.n / B) return m < rhs.m;
return n / B < rhs.n / B;
}
} qus[N]; int fastPow(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % mod;
a = 1ll * a * a % mod; b >>= ;
}
return ans;
} void init() {
f[] = ;
for(int i = ; i < N; i++) f[i] = 1ll * f[i - ] * i % mod;
inv[N - ] = fastPow(f[N - ], mod - );
for(int i = N - ; i >= ; i--) inv[i] = 1ll * inv[i + ] * (i + ) % mod;
} int comb(int n, int m) {
return 1ll * f[n] * inv[m] % mod * inv[n - m] % mod;
} void update1(int m, int n, int op) {
op = -op;
ret += op * comb(n, m + );
if(ret >= mod) ret -= mod;
if(ret < ) ret += mod;
} void update2(int m, int n, int op) {
if(op == ) {
ret += ret; if(ret >= mod) ret -= mod;
ret -= comb(n - , m); if(ret < ) ret += mod;
} else {
ret += comb(n - , m); if(ret >= mod) ret -= mod;
ret = ret * inv[] % mod;
}
} int main() {
init();
int q; scanf("%d", &q);
for(int i = ; i <= q; i++) {
scanf("%d%d", &qus[i].n, &qus[i].m);
qus[i].id = i;
} sort(qus + , qus + q + ); ret = ;
int l = , r = ;
for(int i = ; i <= q; i++) {
int L = qus[i].m, R = qus[i].n;
while(r < R) update2(l, ++r, );
while(l > L) update1(--l, r, );
while(r > R) update2(l, r--, -);
while(l < L) update1(l++, r, -);
ans[qus[i].id] = ret;
}
for(int i = ; i <= q; i++) printf("%d\n", ans[i]);
return ;
} /*
*/
hdu多校4的更多相关文章
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 2015 HDU 多校联赛 5363 Key Set
2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...
- 2015 HDU 多校联赛 5317 RGCDQ 筛法求解
2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目 http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...
- [HDU多校]Ridiculous Netizens
[HDU多校]Ridiculous Netizens 点分治 分成两个部分:对某一点P,连通块经过P或不经过P. 经过P采用树形依赖背包 不经过P的部分递归计算 树型依赖背包 v点必须由其父亲u点转移 ...
- 【杂题总汇】HDU多校赛第十场 Videos
[HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...
- hdu多校1002 Balanced Sequence
Balanced Sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s) ...
- HDU多校(Distinct Values)
Problem Description Chiaki has an array of n positive integers. You are told some facts about the ar ...
- hdu多校6
这个场要恶心死我了.. 1001 积分题,不要四舍五入 //#pragma comment(linker, "/stack:200000000") //#pragma GCC op ...
- hdu 多校第一场
1001 思路:打表可以发现只有3|n 和 4|n 的情况有解,判一下就好啦. #include<bits/stdc++.h> #define LL long long #define f ...
随机推荐
- mysql的select的五子句
转: http://www.cnblogs.com/billyu/p/5033167.html http://www.cnblogs.com/xiadong90-2015/p/4222965.html ...
- mysql绿色版安装,多实例安装
1.为什么要装多个mysql多实例? 关于这个的原因,我目前了解为建立一个主数据库,一个或者多个从库,实现一主多从或者主从复制的目的. 2.设么是mysql的多实例? MySQL多实例就是在一台机器上 ...
- 题解【luogu P2421 bzoj P1407 [NOI2002]荒岛野人】
洛谷题目链接 bzoj题目链接 题目大意:给定\(n\)组\(C_i, P_i, L_i\),求最小的\(M\)使得对于任意的\(i,j (1 \leq i, j \leq n)\) \[C_i + ...
- C#学习之泛型继承和静态成员
想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. ...
- Tomcat设置开启时自动访问某个servlet类存在的问题
<servlet> <servlet-name>****</servlet-name> <servlet-class>****</servlet- ...
- #应用openxml读写excel代码
这个例子比较简单,没有考虑格式之类的问题. using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadshe ...
- jQuery对象初始化的传参方式
jQuery对象初始化的传参方式包括: 1.$(DOMElement) 2.$(' ... '), $('#id'), $('.class') 传入字符串, 这是最常见的形式, 这种传参数经常也传入第 ...
- [洛谷P3338] [ZJOI2014]力
洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...
- Maven -- 在进行war打包时用正式环境的配置覆盖开发环境的配置
我们的配置文件一般都放在 src/main/resource 目录下. 假定我们的正式环境配置放在 src/main/online-resource 目录下. 那么打成war包时,我们希望用onli ...
- 【BZOJ4516】【SDOI2016】生成魔咒 [SAM]
生成魔咒 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 魔咒串由许多魔咒字符组成,魔咒字符 ...