A.最大下降矩阵

时间限制: 1 Sec  内存限制: 512 MB
提交: 508  解决: 107
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述
我们称一个矩阵是下降矩阵,当且仅当,矩阵的每一列都是严格下降的。很显然,这个要求很苛刻,大多数矩阵都无法满足。但是显然如果消去一些行,一定可以使得这个矩阵变成下降矩阵。

现在给出一个n行m列的矩阵,请你求出最少消去多少行,可以使得这个矩阵变为下降矩阵。

输入
输入第一行包含两个正整数n,m分别表示矩阵的行数和列数。(1<=n,m<=300)
接下来n行,每行有m个数,中间用空格隔开,每个数都小于2^31.
输出
输出仅包含一个整数,即最少消去的行数。
样例输入 Copy
1 3
1 2 3
样例输出 Copy
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 ;
}

问题 C: 大小接近的点对

时间限制: 1 Sec  内存限制: 256 MB
提交: 78  解决: 10
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述
一天,Chika 对大小接近的点对产生了兴趣,她想搞明白这个问题的树上版本,你能帮助她吗?Chika 会给 你一棵有根树,这棵树有 n 个结点,被编号为 1 n,1 号结点是根。每个点有一个权值,i 号结点的权值为 a[i]。如果 u 是 v 的祖先结点,并且 abs(a[u]−a[v]) ≤K,那么 (u,v) 被称作一个“** 大小接近的点对 **”。 对于树上的每个结点 i,你都需要计算以其为根的子树中的“大小接近的点对”的数量。你需要知道:  
(1) abs(x) 代表 x 的绝对值。  
(2) 每个结点都是其自身的祖先结点.

 
输入
输入文件的第一行包含两个整数 n (1≤n≤105) 和 k (1≤k≤109),代表树中结点总数, 以及“大小接近的点对”的大小之差的上界。  
第二行包含 n 个整数,第 i 个整数是 a[i] (1≤ a[i] ≤109),代表 i 号结点的权值。  
第三行包含 n−1 个整数,第 i 个整数是 i+1 号结点的父结点。

输出
输出应该包含n行,每一行包括一个整数。第i行的整数代表以i为根的子树中的“大小接近的点对”的数量。
样例输入 Copy
7 5
2 4 4 1 4 6 4
1 2 3 1 2 3
样例输出 Copy
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 ;
}

问题 F: 咕咕的计数题 II

时间限制: 1 Sec  内存限制: 64 MB
提交: 1108  解决: 69
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述
咕咕最近在学习初等数论,并且对下取整函数产生了极大的兴趣。下取整函数是指一个函数,自变量为 一个实数,因变量为一个整数,这个整数恰好是小于或等于自变量的最大的整数,通常记做 ⌊x⌋。例如, ⌊2.5⌋ = 2,⌊2⌋ = 2,⌊−2.5⌋ = −3。 
 咕咕发现,给定一个 a,并不是所有的自然数 n 都存在一个正整数 i 使得 ⌊n/i⌋ = a。那么,如果给定 l,r,咕咕好奇在区间 [l,r] 中有多少个正整数能使这个等式有正整数解 i 呢? 
 那么,聪明的你,你能告诉咕咕吗?  
输入
第一行有一个整数 T(1 ≤ T ≤ 106),表示数据组数。接下来有 T 行,每行有三个数 a,l,r(1 ≤ a ≤ 1018,1 ≤ l ≤ r ≤ 1018),表示一组询问。 
输出
输出 T 行,对每组询问,输出一个整数表示答案。 
样例输入 Copy
4
5 7 10
7 39 42
1000 1000 1000
27 100 1000
样例输出 Copy
1
2
1
617
提示
数据范围 
当 n = 39,a = 7 时,能找到 i = 5 使得 ⌊39 /5 ⌋ = 7。

 
 
  规律题,找规律or打表可以发现,这些满足条件的数字可以按照k*a分类,
  1,2......a......2a,2a+1......3a,3a+1,3a+2............a*a,....a*a+a-1......(a+1)*a......k*a......
 
  规律很容易发现,就是找不同的正整数k,那么从k*a开始往后的k个数字(包括k*a)只要在区间里面都是满足条件的,k等于多少就有多少个满足条件的数字,但注意当k>a的时候最多也只有a个数字而不是k个数字了。
  利用容斥思想,找出[1,r]内的个数和[1,l-1]的个数做差就是答案。
code:
 #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(Association of Calculation and Magic),今天,这个机会终于 来了。  
但是 ACM 只想要哪些天赋异禀的人, 比如像 tourist,他们给了你一道题来检测你是否足够机智。  
猜一个长度为 m 数字串,总共有 n 个提示串,解释如下: 
 8640 0A2B  
A 前面的数字说明与答案相比,有多少个位置上的数字是相同的。 B 前面的数字说明与答案相比,有多 少个数字是相同的,但是位置不一样。 
 0 A 就表示给出的串没有任何位置和答案是相同的。 2 B 就表示给出的串中有两个数字和答案相同,但 是位置不一样。  
所以,对于上面那个提示串 6457 是一个合理的答案,但是 1234 并不是。  
现在给你 N(N<=100) 个提示串(如上所示),你需要去找到一个数字串来符合每一个提示串的要求。 
提示串中的每个数字都是不同的,即一个串中不会存在相同的数字。  
你能解决这个问题并加入 ACM 吗?  
输入
第一行两个数字,n(n<=100) 和 m(m<=9), 提示串的数量以及目标字符串的长度。  
然后是 n 行,每行的格式如下:  
s x y  
s 是提示串,x 是 A 前的数字,y 是 B 前的数字,等同于:  
s xAyB  
输出
一行,目标串。
数据保证答案唯一。 
样例输入 Copy
6 4
5164 3 0
5174 3 0
5194 3 0
5124 3 0
5134 3 0
5104 3 0
样例输出 Copy
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的更多相关文章

  1. 2019-ccpc秦皇岛现场赛

    https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到 ...

  2. SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告

            题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音?       ...

  3. NEFU 2016省赛演练一 F题 (高精度加法)

    Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...

  4. 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥

    Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...

  5. 【2013 ICPC亚洲区域赛成都站 F】Fibonacci Tree(最小生成树+思维)

    Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do s ...

  6. HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)

    HDU 5045 5047 5050 5053 太菜了,名额差点没保住.吓尿..赶紧开刷树链抛分 5045:状压DP.压缩10个人.因为两个人不能差2以上,所以能够用01表示 5047:推推公式就可以 ...

  7. 2019CCPC秦皇岛(重现赛)-D

    链接: http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=872 题意: 给定一个正整数 n,要求判断 1 ...

  8. 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. 9.29 csp-s模拟测试55 联+赛+题

    T1 联 $n$最大到$1e18$,根本没法做,但$m$只有$1e5$,发现有很多区间是一起动的,或者根本没动,所以可以把区间离散化掉,然后线段树区间修改,对于第三种修改,只需要把它分解成一段一段相同 ...

随机推荐

  1. CentOS7中OpenVPN的配置

    最近需要在openstack中集成openvpn功能,故熟悉了一下openvpn的搭建流程,记录下来,供参考 版本:openvpn-2.3.4.tar.gz 下载地址:http://pan.baidu ...

  2. sql server导出数据,详细操作!(自用)

    右键数据库——>任务——>导出数据 填写数据源连接信息 填写 要导入的数据库  连接信息 导出表时,全选,[编辑映射],勾选启用标识插入,这样才能让自增的字段 行正常插入. 然后导出即可. ...

  3. Windows中的原语与原子

    目前对原语与原子的理解为: 原语: 由内核提供的核外调用的一段具有特定功能的方法或者函数称之为---原语 原语操作不允许发生中断. 原子:         在多进程多线程的操作系统中不允许其他进程或者 ...

  4. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  5. 爬坑二 activiti流数据库版本错误引发的问题

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actModelCont ...

  6. vue脚手架3

    跟脚手架2安装都一样,已经安装脚手架2的要执行下面的命令 ,先删除 npm uninstall vue-cli -g 或 yarn global remove vue-cli 卸载 在执行下面的命令 ...

  7. 2.2JAVA基础复习——JAVA语言的基础组成运算符和语句

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  8. element-ui 解决 table 里包含表单验证的问题!

    实际项目中的场景,需要在table里做表单的验证,如图效果: 其实问题关键就在于如何给el-form-item动态绑定prop :prop="'tableData.' + scope.$in ...

  9. 【题解】Luogu P4438 [HNOI/AHOI2018]道路

    原题传送门 实际就是一道简单的树形dp 设f[u][i][j]表示从根结点到结点u经过i条未翻修公路,j条未翻修铁路的贡献最小值 边界条件:f[leaf][i][j]=(A+i)(B+j)C (题目上 ...

  10. 单元测试系列之十一:Jmockit之mock特性详解

    本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...