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 ...
随机推荐
- Jade模板引擎学习(二)语法:代码、变量、循环、过滤器及mixin
Jade语法 一.代码 不会被缓冲代码 ul - for(var i=0; i; i++) li Jade Engine 会转换为: <ul> <li>Jade Engine& ...
- 2017 济南综合班 Day 1
送分题(songfen) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于 ...
- linux shell读取配置文件
配置文件CoverageInfo FTP_URL=ftp://svn-fb.sicent.com:21/jenkins/Jifei_Repo/OL-2/IDC_Platform/bar_seats_c ...
- 冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子 ...
- concurrent.futures 使用及解析
from concurrent.futures import ThreadPoolExecutor, as_completed, wait, FIRST_COMPLETED from concurre ...
- 【bzoj1774-过路费】floyd+排序
题意:n个点,m条双向边,每个点有权值c[i],每条边有权值a[i].d,一条路径的费用=每条边的权值和+各个点的权值的最大值,即sigma(a[i].d)+max(c[i]).q个询问,问x到y的最 ...
- CSS 竖线 点 时间节点
效果如图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- windows下安装python过程
方法一:如果你的电脑没有安装python,推荐使用anaconda(自带python环境,同时自带各种第三方库,可以省去很多麻烦) 这里提供两个下载地址:1,.官网https://www.anacon ...
- linux中使用mysql数据库
在安装完数据库后,如果没有设置root的mysql密码,在命令行输入mysql即可进入数据库 show databases;(有分号):查看当前存在的数据库 create database 名字:创建 ...
- Linux-进程间通信(N): 各种IPC的使用场景
1. 管道:只能用于具有亲缘关系的进行通信,使用面相对较窄,实际开发中较少使用: 2. FIFO(命名管道):可以用于任意进程间的通信,对于大块数据的传输效率较高,可应用于单进程大量数据传递,和多个进 ...