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 ...
随机推荐
- HDU 多校 第三场 Find the answer
这题是原来cf上的一道原题,不过对于有一些数据范围修改了,不过还是很好想的 题意:给定一个长度为N的数组,对于数组中的每个位置,满足当前和小于M所需要去掉的最小代价 分析:对于当前是否需要进行去掉一些 ...
- perspective transform透视矩阵快速求法+矩形矫正
算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为1的正方形的变换方式=.= 不怎么用得上…… 公式推导推半天,计算还麻烦.... ++++++++++++++++++++++++++ ...
- Django使用本机IP无法访问,使用127.0.0.1能正常访问
使用Django搭建web站点后,使用127.0.0.1能访问,但是用自己本机IP却无法访问. 我们先到Django项目中找到setting文件 找到——> ALLOWED_HOSTS = [] ...
- Ubuntu+VMWare 学习中遇到的问题
1. 虚拟机中Ubuntu分辨率 / 设置分辨率出现Unknown Display VMware中Ubuntu 出现Unknown Display问题解决 1.1 命令无法保存分辨率设置: xrand ...
- SCI论文的时态
如果有的杂志对时态有要求,则以下所述都没有用了. 有些杂志也会专门有些比较“特别”的要求,比如Cell,要求Abstract全部使用一般现在时. 英语谓语动词时态共有16种,在英文科技论文中用得较为频 ...
- Svn提交冲突问题
MEclipse中的svn冲突解决办法: 1. 点击提交,报错——‘SVN提交’has encountered a problem. 2. 选中无法提交的文件,点击更新操作 ...
- spring注解不支持静态变量注入
spring注解不支持静态变量注入:今天敲代码 自动配置 配置: Animal.java package study01_autoconfig.beanConfig; import org.spri ...
- 夯实Java基础(九)——final关键字
1.前言 Java语言中的final关键字,想必大家都不是很陌生,我们自己用的最多的应该是用来定义常量吧,那么今天我们就来了解final这个关键字的用法,这个关键字还是非常简单的. final从字面意 ...
- 最基础的 ant build 脚本
最基础的 ant build 脚本,根据项目,自行进行修改 <?xml version="1.0" encoding="UTF-8" ?> < ...
- 【C++】string::find函数
int vis=a.find(b):从string a开头开始查找第一个遇到的string b,返回string a中所匹配字符串的第一个字符的下标位置,找不到则返回-1. int vis=a.fin ...