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 ...
随机推荐
- TestNG使用@Parameter给要测试的方法传递参数
当需要测试的方法含有参数时,可以通过@Parameters 注解给该方法传递参数. 比如下面这个类,要调用whoami则必须写一个main函数,然后在main函数中调用该函数,并传入参数,使用Test ...
- 0 MapReduce实现Reduce Side Join操作
一.准备两张表以及对应的数据 (1)m_ys_lab_jointest_a(以下简称表A) 建表语句: create table if not exists m_ys_lab_jointest_a ( ...
- Java性能调优之让程序“飞”起来-Java 代码优化
代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final ...
- DVWA-SQL注入
SQL注入解题思路 寻找注入点,可以通过web扫描工具实现 通过注入点,尝试得到连接数据库的用户名,数据库名称,权限等信息. 猜解关键数据库表极其重要字段与内容. 通过获得的用户信息寻找后台进行登录. ...
- ubuntu 下常用的mysql 命令
一.mysql服务操作 0.查看数据库版本 sql-> status; 1.net start mysql //启动mysql服务 2.net stop mysql //停止mysql服务 ...
- python 简单的实现文件内容去重
文件去重 这里主要用的是set()函数,特别地,set中的元素是无序的,并且重复元素在set中自动被过滤. 测试文本为 data.txt 具体代码如下: // 文件去重 #!/usr/bin/env ...
- 关于python中的特殊方法
研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...
- umask 默认权限控制和特殊权限
权限简单介绍: 在Linux中,创建目录或者文件之后总会有默认的权限.共9个,分为三组.分别代表u.g.o(属主.属组.其他用户).r.w.x 也代表各自的权限. r:读 在文件中的权限代表次文件 ...
- Java:控制反转(IoC)与依赖注入(DI)
很长一段时间里,我对控制反转和依赖注入这两个概念很模糊,闭上眼睛想一想,总有一种眩晕的感觉.但为了成为一名优秀的 Java 工程师,我花了一周的时间,彻底把它们搞清楚了. 01.紧耦合 在我们编码的过 ...
- NOIP 2018旅行题解
从佳木斯回来刷一刷去年没A的题 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 nn 个城市之间有 mm 条双向道路.每条双向道路连接两个 ...