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 ...
 
随机推荐
- JavaScript的性能优化:加载和执行
			
随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...
 - SPOJ 104 HIGH - Highways
			
HIGH - Highways http://www.spoj.com/problems/HIGH/ In some countries building highways takes a lot o ...
 - Cppcheck代码分析上
			
1.检查点 1.自动变量检查: 返回自动变量(局部变量)指针: 2.越界检查:数组越界返回自动变量(局部变量)指针: 3.类检查:构造函数初始化: 4.内存泄露检查: 5.空指针检查: 6.废弃函数 ...
 - mysql 字段为NULL的一些操作
			
1. 修改字段为NULL update tableName set column1 = null where id = 1 2. 字段是否为NULL (1)字段为空 select * tableNam ...
 - zk-web
			
Ref:https://github.com/qiuxiafei/zk-web zk-web是一个用clojure with noir and boostrap写的Zookeeper WEB UI管理 ...
 - 程序员你为什么这么累? - Controller规范
			
导读:程序员你为什么这么累? 接口定义:程序员你为什么这么累? - 接口定义 第一篇文章中,我贴了2段代码,第一个是原生态的,第2段是我指定了接口定义规范,使用AOP技术之后最终交付的代码,从15行到 ...
 - c语言目录操作总结
			
=================================================== char *getcwd( char *buffer, int maxlen ); (获取当前目 ...
 - HDU    1175    连连看    (深搜+剪枝)
			
题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...
 - eclipse执行maven install命令时跳过test
			
在pom.xml里面配置一下代码,将跳过test. <plugins> <plugin> <groupId>org.apache.maven.plugins< ...
 - Python标准库笔记(1) — string模块
			
String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(wi ...