2019DX#1
1001 Blank
题意
有一个长度为n(n<=100)的位子,填入四种颜色,有m个限制,某个区间的颜色个数要恰好等于x个。问颜色个数的方案数。
思路
DP
四维的DP,利用滚动数组优化一维空间。
我觉得这个构造的还是比较巧妙的。四维,每一维代表每个颜色最后出现的位子。
保证(i < j < k < L),这样每次向后L增大一位,可以从i,j,k,l四种情况转移而来。
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a) typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll; template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); } template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f;
const int mod = ; /**********showtime************/ const int maxn = ;
vector<pii> v[maxn];
ll dp[maxn][maxn][maxn][];
int main(){
int T; scanf("%d", &T);
while(T--) {
int n,m;
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++) v[i].clear();
for(int i=; i<=m; i++) {
int le, ri, c;
scanf("%d%d%d", &le, &ri, &c);
v[ri].pb(pii(le, c));
}
memset(dp, , sizeof(dp));
dp[][][][] = ;
ll ans = ;
int cur = ;
for(int l=; l<=n; l ++) {
for(int i=; i<=l; i++) {
for(int j=i ? i+:; j<=l; j++) {
for(int k=j?j+:; k<=l; k++ ){ for(pii p : v[l]) {
int le = p.fi, ri = l, c = p.se; if(c == ) {
if(k >= le) {dp[i][j][k][cur] = ;break;}
} else if(c == ) {
if(j >= le || k < le) {dp[i][j][k][cur] = ;break;}
}
else if(c == ) {
if(i>=le || j < le) {dp[i][j][k][cur] = ;break;}
}
else {
if(i < le) {dp[i][j][k][cur] = ;break;}
}
}
dp[j][k][l][cur^] = (dp[j][k][l][cur^] + dp[i][j][k][cur]) % mod; dp[i][k][l][cur^] = (dp[i][k][l][cur^] + dp[i][j][k][cur]) % mod; dp[i][j][l][cur^] = (dp[i][j][l][cur^] + dp[i][j][k][cur]) % mod; dp[i][j][k][cur^] = (dp[i][j][k][cur^] + dp[i][j][k][cur]) % mod;
if(l == n) ans = (ans + dp[i][j][k][cur]) % mod;
}
}
}
for(int i=; i<=l; i++)
for(int j=i ? i+:; j<=l; j++)
for(int k=j?j+:; k<=l; k++ )
dp[i][j][k][cur] = ;
cur = cur ^ ; }
printf("%lld\n", ans);
} return ;
}
1002 Operation
线性基
1003 Milk
背包
1004 Vacation
题意:
•有n(n <= 100000)辆车,依次排在一个红绿灯口,(单车道,且直行,不能超车)
•每辆车都有一个最大速度,车长,距离红绿灯线的距离。
•问最后一辆车头碰到红绿灯线的最短时间。
思路:
可以贪心做,当然二分时间也可以。赛后补了下二分的写法
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a) typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll; template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); } template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+; /**********showtime************/ const int maxn = 1e5+;
int l[maxn],s[maxn],v[maxn];
int n; bool check(double t) {
double pos = -inff;
for(int i=n; i>=; i--) {
double tp = 1.0*s[i] - t * v[i];
pos = max(pos, tp);
if(i)pos += l[i];
}
return pos < ;
}
int main(){
while(~scanf("%d", &n)) {
for(int i=; i<=n; i++) {
scanf("%d", &l[i]);
}
for(int i=; i<=n; i++) {
scanf("%d", &s[i]);
}
for(int i=; i<=n; i++) {
scanf("%d", &v[i]);
}
double le = , ri = , res;
for(int i=; i<=; i++) {
double mid = (le + ri) / ;
if(check(mid)) ri = mid, res = mid;
else le = mid;
}
printf("%.10f\n", res);
} return ;
}
1006 Typewriter
后缀自动机
1007 Meteor
1010 Kingdom
记忆化搜索
1011 Function
化公式
1012 Sequence
ntt
1013 Code
转成凸包,或者lzh大法。
2019DX#1的更多相关文章
- 2019DX#10
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Minimum Spanning Trees 22.22%(2/9) 1002 Lin ...
- 2019dx#9
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Rikka with Quicksort 25.85%(38/147) 1002 Ri ...
- 2019DX#8
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Acesrc and Cube Hypernet 7.32%(3/41) 1002 A ...
- 2019dx#7
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 A + B = C 10.48%(301/2872) 1002 Bracket Seq ...
- 2019DX#6
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Salty Fish 16.28%(7/43) OK 1002 Nonsense Tim ...
- 2019DX#5
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 fraction 辗转相除 4.17%(7/168) ok 1002 three arr ...
- 2019dx#4
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 AND Minimum Spanning Tree 31.75%(1018/3206) ...
- 2019DX#3
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Azshara's deep sea 凸包 6.67%(6/90)
- 2019DX#2
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Another Chess Problem 8.33%(1/12) 1002 Beau ...
随机推荐
- Angular JS 中的内置方法之$watch
在$apply方法中存在脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. $watch(watchFn,watc ...
- 详解 Diff 算法以及循环要加 key 值问题
上一篇文章我简述了什么是 Virtual DOM,这一章我会详细讲 Diff 算法以及为什么在 React 和 Vue 中循环都需要 key 值. 什么是 DOM Diff 算法 Web 界面其实就是 ...
- java8中用流收集数据
用流收集数据 汇总 long howManyDishes = menu.stream().collect(Collectors.counting()); int totalCalories = men ...
- 前端笔记之微信小程序(四)WebSocket&Socket.io&摇一摇案例&地图|地理位置
一.WebSocket概述 http://www.ruanyifeng.com/blog/2017/05/websocket.html Workerman一款开源高性能异步PHP socket即时通讯 ...
- 关于asp.net调用gemalto超级狗api的具体实现
鉴于网上关于超级狗的具体操作并不详细,我把我所知道的写下来,希望能给有需求的网友做个参考.软件外壳保护我就不说了,没有什么难度,供应商也会提供文档,一步一步操作即可.我要说的是用于保护发给客户的程序, ...
- Spring Boot 修改静态资源一定要重启项目才会生效吗?未必!
回顾热部署 Spring Boot 中的热部署相信大家都用过吧,只需要添加 spring-boot-devtools 依赖就可以轻松实现热部署.Spring Boot 中热部署最最关键的原理就是两个不 ...
- n的阶乘 -牛客
题目描述 输入一个整数n,输出n的阶乘(每组测试用例可能包含多组数据,请注意处理) 输入描述: 一个整数n(1<=n<=20) 输出描述: n的阶乘 解题思路 采用递归求解,也可以使用循环 ...
- 2019牛客多校训练第三场H.Magic Line(思维)
题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...
- 使用IDEA打包scala程序并在spark中运行
一.首先配置ssh无秘钥登陆, 先使用这条命令:ssh-keygen,然后敲三下回车: 然后使用cd .ssh进入 .ssh这个隐藏文件夹: 再创建一个文件夹authorized_keys,使用命令t ...
- Python递归函数,二分查找算法
目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...