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 ...
随机推荐
- HDU 4576 DP
Robot Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total Sub ...
- 大道至简第一章伪代码读后感o(╯□╰)o
import.java.io*; import class duhougan; public static void main(Striing arges[]){ system.out.println ...
- Makefile的简单使用
led.bin: led.o arm-linux-ld -Ttext 0x0 -o led.elf $^ arm-linux-objcopy -O binary led.elf led.bin arm ...
- dp,状压dp等 一些总结
也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...
- PHP扩展--Oracle客户端(oci8)安装
下载Oracle客户端 官方下载地址: Linux X86-64 同意协议,下载以下文件: oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm ...
- PHP扩展--Yaf框架安装
安装/配置 编译安装 wge thttp://pecl.php.net/get/yaf-2.3.5.tgz tar -zxvfyaf-2.3.5.tgz cd yaf-2.3.5/ cd extens ...
- iOS 网络请求--- 配置info.plist文件
一.配置info.plist <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitra ...
- 【bzoj】1927 [Sdoi2010]星际竞速
[算法]最小费用最大流 [题解]跟滑雪略有类似,同样因为可以重复所以不是最小路径覆盖. 连向汇的边容量为1足矣,因为一个点只会出去一次(路径结束). bzoj 1927 [Sdoi2010]星际竞速 ...
- MyBatis 框架系列之基础初识
MyBatis 框架系列之基础初识 1.什么是 MyBatis MyBatis 本是 apache 的一个开源项目 iBatis,后改名为 MyBatis,它 是一个优秀的持久层框架,对 jdbc 的 ...
- HTML JS文字闪烁实现(项目top.htm分析)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from ur ...