2019ccpc-HN省赛-A/C/F/I
现在给出一个n行m列的矩阵,请你求出最少消去多少行,可以使得这个矩阵变为下降矩阵。
接下来n行,每行有m个数,中间用空格隔开,每个数都小于2^31.
1 3
1 2 3
0
把每一行元素看作一个向量,或者说一个"行元素"。题目要求的就是对于N个向量来说的最长的严格下降子序列长度,然后用N减去这个严格下降子序列长度就是答案了。方法与求LIS类似。
#include<bits/stdc++.h>
using namespace std; int N,M;
int v[][];
int f[]={};
bool cmp(int di,int dj){
for(int i=;i<=M;++i){
if(v[di][i] <= v[dj][i] ) return ;
}return ;
}
int main()
{
cin>>N>>M;
for(int i=;i<=N;++i)
for(int j=;j<=M;++j)
cin>>v[i][j];
f[]=;
int ans=;
for(int i=;i<=N;++i){
f[i]=;
for(int j=;j<i;++j){
if(cmp(j,i)){
f[i]=max(f[i],f[j]+);
}
}
ans=max(ans,f[i]);
}
cout<<N-ans<<endl;
return ;
}
(1) abs(x) 代表 x 的绝对值。
(2) 每个结点都是其自身的祖先结点.
第二行包含 n 个整数,第 i 个整数是 a[i] (1≤ a[i] ≤109),代表 i 号结点的权值。
第三行包含 n−1 个整数,第 i 个整数是 i+1 号结点的父结点。
7 5
2 4 4 1 4 6 4
1 2 3 1 2 3
19
11
5
1
1
1
1
比赛的时候推出来是主席树了,奈何很久没写忘记关键步骤了= =
先跑dfs先序对节点重新编号,然后按照新编号依次update,问题就转化为求在[L,R]编号区间内的满足a[u]-K<=x<=a[u]+K的x的数目。
注意答案会爆int,很操蛋。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((L+R)>>1)
const int maxn=;
int N,K;
LL ans[maxn];
int a[maxn],idx[maxn],_idx[maxn],cur=,sons[maxn];
vector<int>g[maxn];
int root[maxn];
int tot=,ch[maxn*][];
int sum[maxn*]; void update(int pre,int &now,int L,int R,int val){
tot++;
ch[tot][]=ch[pre][],ch[tot][]=ch[pre][];
sum[tot]=sum[pre]+,now=tot;
//cout<<"now="<<now<<" "<<pre<<endl;
if(L==R){
return;
}
if(val<=mid){
update(ch[pre][],ch[now][],L,mid,val);
}
else{
update(ch[pre][],ch[now][],mid+,R,val);
}
}
int ask(int pre,int now,int L,int R,int l,int r){
if(L>=l && R<=r){
return sum[now]-sum[pre];
}
int res=;
if(r<=mid) res=ask(ch[pre][],ch[now][],L,mid,l,r);
else if(l>mid) res=ask(ch[pre][],ch[now][],mid+,R,l,r);
else{
res=ask(ch[pre][],ch[now][],L,mid,l,r)+ask(ch[pre][],ch[now][],mid+,R,l,r);;
}
return res;
}
/*void show(int id,int L,int R){
cout<<L<<' '<<R<<' '<<sum[id]<<endl;
if(L==R)return;
if(ch[id][0])show(ch[id][0],L,mid);
if(ch[id][1])show(ch[id][1],mid+1,R);
}*/
void dfs(int u){
idx[u]=++cur;
_idx[cur]=u;
sons[u]=;
for(auto v:g[u])dfs(v),sons[u]+=sons[v];
}
void solve(int u){
ans[u]=ask(root[idx[u]-],root[idx[u]-+sons[u]],,,max(,a[u]-K),min(,a[u]+K));
for(auto v:g[u]){
solve(v);
ans[u]+=ans[v];
}
}
int main(){
cin>>N>>K;
for(int i=;i<=N;++i)scanf("%d",a+i);
for(int i=,fa;i<=N;++i){
scanf("%d",&fa);
g[fa].push_back(i);
}
dfs();
for(int i=;i<=N;++i){
update(root[i-],root[i],,,a[_idx[i]]);
}
solve();
for(int i=;i<=N;++i)printf("%lld\n",ans[i]); return ;
}
咕咕发现,给定一个 a,并不是所有的自然数 n 都存在一个正整数 i 使得 ⌊n/i⌋ = a。那么,如果给定 l,r,咕咕好奇在区间 [l,r] 中有多少个正整数能使这个等式有正整数解 i 呢?
那么,聪明的你,你能告诉咕咕吗?
4
5 7 10
7 39 42
1000 1000 1000
27 100 1000
1
2
1
617
当 n = 39,a = 7 时,能找到 i = 5 使得 ⌊39 /5 ⌋ = 7。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL T,a,l,r;
LL solve(LL n){
if(n<) return ;
LL ans=;
LL div=n/a,rem=n%a;
if(div<=a){
ans+= div*(div-)/;
if(div*a+div-<=n){
ans+=div;
}
else{
ans+=(n-div*a+);
}
}
else{
ans+=(+a)*a/;
ans+=(div-a-)*a;
if(div*a+a-<=n){
ans+=a;
}
else{
ans+=(n-div*a+);
}
}
return ans;
}
int main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&a,&l,&r);
printf("%lld\n",solve(r)-solve(l-));
}
return ;
}
问题 I: Childhood dream
时间限制: 1 Sec 内存限制: 256 MB
提交: 63 解决: 18
[提交] [状态] [讨论版] [命题人:zhd]
但是 ACM 只想要哪些天赋异禀的人, 比如像 tourist,他们给了你一道题来检测你是否足够机智。
猜一个长度为 m 数字串,总共有 n 个提示串,解释如下:
8640 0A2B
A 前面的数字说明与答案相比,有多少个位置上的数字是相同的。 B 前面的数字说明与答案相比,有多 少个数字是相同的,但是位置不一样。
0 A 就表示给出的串没有任何位置和答案是相同的。 2 B 就表示给出的串中有两个数字和答案相同,但 是位置不一样。
所以,对于上面那个提示串 6457 是一个合理的答案,但是 1234 并不是。
现在给你 N(N<=100) 个提示串(如上所示),你需要去找到一个数字串来符合每一个提示串的要求。
提示串中的每个数字都是不同的,即一个串中不会存在相同的数字。
你能解决这个问题并加入 ACM 吗?
然后是 n 行,每行的格式如下:
s x y
s 是提示串,x 是 A 前的数字,y 是 B 前的数字,等同于:
s xAyB
数据保证答案唯一。
6 4
5164 3 0
5174 3 0
5194 3 0
5124 3 0
5134 3 0
5104 3 0
5184 暴力搜索,由于不可行的情况很多,减枝会减去很多方案,所以直接搜完事。
#include<bits/stdc++.h>
using namespace std; char str[][];
int A[],B[],tot[][];
int N,M;
int c[];
bool ok=;
bool check(int n,int type){
for(int i=;i<=N;++i){
int _A=,_B=;
for(int j=;j<n-;++j){
if(str[i][j]-'' == c[j+]){
_A++;
}
else{
if(tot[i][c[j+]]){
_B++;
}
}
}
if(type== &&(_A>A[i] || _B>B[i] )) return ;
if(type== &&(_A!=A[i] || _B!=B[i])) return ;
}
return ;
}
void dfs(int u){
if(ok)return;
if(!check(u,)){
return;
}
if(u==M+){
if(check(M+,)){
ok=;
for(int i=;i<=M;++i)cout<<c[i];cout<<endl;
}
return;
}
else{
for(int i=;i<;++i){
c[u]=i;
dfs(u+);
}
}
}
int main()
{
cin>>N>>M;
for(int i=;i<=N;++i){
cin>>str[i]>>A[i]>>B[i];
}
for(int i=;i<=N;++i){
for(int j=;j<M;++j){
tot[i][str[i][j]-'']++;
}
}
dfs();
return ;
}
2019ccpc-HN省赛-A/C/F/I的更多相关文章
- 2019-ccpc秦皇岛现场赛
https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到 ...
- SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告
题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音? ...
- NEFU 2016省赛演练一 F题 (高精度加法)
Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...
- 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥
Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...
- 【2013 ICPC亚洲区域赛成都站 F】Fibonacci Tree(最小生成树+思维)
Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do s ...
- HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)
HDU 5045 5047 5050 5053 太菜了,名额差点没保住.吓尿..赶紧开刷树链抛分 5045:状压DP.压缩10个人.因为两个人不能差2以上,所以能够用01表示 5047:推推公式就可以 ...
- 2019CCPC秦皇岛(重现赛)-D
链接: http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=872 题意: 给定一个正整数 n,要求判断 1 ...
- 2015多校联合训练赛hdu 5301 Buildings 2015 Multi-University Training Contest 2 简单题
Buildings Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- 9.29 csp-s模拟测试55 联+赛+题
T1 联 $n$最大到$1e18$,根本没法做,但$m$只有$1e5$,发现有很多区间是一起动的,或者根本没动,所以可以把区间离散化掉,然后线段树区间修改,对于第三种修改,只需要把它分解成一段一段相同 ...
随机推荐
- logback 按时间和大小生成日志不生效的问题
服务器要记录所有的日志,这些日志输入到一个文件中太大了,就需要按大小和时间还分割,比如每小时产生一个文件或当文件大小大于200MB的时候生成一个文件. 第一版这样版本,但是服务器启动之后没有生成日志文 ...
- week1 - Python基础1 介绍、基本语法、流程控制
知识内容: 1.python介绍 2.变量及输入输出 3.分支结构 4.循环结构 一.python介绍 Python主要应用领域: 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发 ...
- Tableau 学习资料
官方文档: https://www.tableau.com/zh-cn/support/help 其他教程: tablaue破解版_tableau10 破解_tableau server 破解:htt ...
- AbstractMethodError:
AbstractMethodError: This java.lang.AbstractMethodError is usually thrown when we try to invoke the ...
- ODI基于源表时间戳字段获取增量数据
实现目标:通过ODI获取一个没有时间戳的子表(qb_bw)的增量数据,而主表(qb_tb)有一个rksj入库时间,且主表和子表之间通过ID关联.目标表名是qb_bw1. 设计原理:通过在ODI的map ...
- vue环境命令
1.下载安装note.js用于VUE开发环境 2.VUE项目开发环境安装依赖,命令行进入项目代码目录下执行如下命令npm install 3.开发环境运行npm run dev 4.打包项目npm r ...
- 第十八节 JS中的正则表达式
复习字符串操作: search 查找 substring 获取子字符串 charAt 获取某个字符 split 分割字符串,获取数组 var str = 'abcdefghijk'; alert(st ...
- MySQL_ALTER命令
当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 1)修改表名:表名可以在数据库中唯一标识一个table 命令格式:ALTER TABLE 旧名 RENAME 新名 ...
- xlrd & xlwd
一.安装xlrd http://pypi.python.org/pypi/xlrd 二.使用介绍 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open ...
- Javascript的防抖和节流、VUE的防抖和节流
js原生 函数防抖:将几次操作合并为一此操作进行.原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置.这样一来,只有最后一次操作能 ...