A:hash 或者 map 或者trie。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
map<vector<char>,int>mp;
char c[maxn][];
vector<char>S;
int main()
{
int N,M,ans=;
scanf("%d",&N);
rep(i,,N){
scanf("%s",c[i]);
if(c[i][]=='T'||c[i][]=='G'){
int len=strlen(c[i]); S.clear();
rep(j,,len-) S.push_back(c[i][j]);
mp[S]++;
}
}
rep(i,,N) {
if(c[i][]=='A'||c[i][]=='C') {
int len=strlen(c[i]); S.clear();
rep(j,,len-){
if(c[i][j]=='A') S.push_back('T');
if(c[i][j]=='T') S.push_back('A');
if(c[i][j]=='C') S.push_back('G');
if(c[i][j]=='G') S.push_back('C');
}
if(mp[S]>=) ans++,mp[S]--;
}
}
printf("%d\n",ans);
return ;
}

B:贪心+大讨论,或者预处理+二分。

#include<bits/stdc++.h>
#define ll unsigned long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
char c[maxn]; ll a[maxn]; int tot;
void dfs(int L,int A,int B,ll sum)
{
if(A!=&&B!=&&A==B) {
a[++tot]=sum;
}
if(L==) return ;
dfs(L+,A+,B,sum*+);
dfs(L+,A,B+,sum*+);
}
int main()
{
dfs(,,,);
sort(a+,a+tot+);
int T,N;
scanf("%d",&T);
while(T--){
scanf("%s",c+);
int N=strlen(c+);
if(N==) {
rep(i,,) putchar('');
rep(i,,) putchar('');
puts("");
}
else if(N&){
rep(i,,N/+) putchar('');
rep(i,,N/+) putchar('');
puts("");
}
else {
ll x=;
rep(i,,N) x=x*+c[i]-'';
int p=lower_bound(a+,a+tot+,x)-a;
if(p==tot+){
rep(i,,N/+) putchar('');
rep(i,,N/+) putchar('');
puts("");
}
else cout<<a[p]<<endl;
}
}
return ;
}

C:主要是想说明一下,这个rope真的妙。

题意:三者操作,(1,x)表示询问x柱子上最长的且最后的连续0的区间。 (2,num,col)表示新建一个柱子,上面有num个col。 (3,x,y,z)是把x柱子加入到y的z位置后面。

显然是平衡树的题,但是我觉得很难操作,还不如骗分,所以就想了下rope,对于新建和插入,都可以用rope高效实现,只有询问操作,我是暴力的。

#include<bits/stdc++.h>
#include<ext/rope>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
using namespace __gnu_cxx;
const int maxn=;
rope<int>a[maxn],b[maxn]; int P,L[maxn];
void read(int &x){
x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
int main()
{
int N,opt,num,col,x,y,z,o;
scanf("%d",&N);
rep(i,,N) {
read(opt);
if(opt==){
read(x);
int l=,r=,res=;
for(int i=L[x]-;i>=;i--){
if(a[x][i]==) continue;
else {
int j=i;
while(j>&&a[x][j-]==) j--;
if(i-j+>res) l=j+,r=i+,res=i-j+;
i=j;
}
}
printf("%d %d\n",l,r);
}
else if(opt==){
read(num); read(col);
P++;
//rep(i,1,num){
a[P].insert(L[P],num,col);
L[P]+=num;
//}
}
else {
read(x); read(y); read(z); read(o);
a[y].insert(z,a[x]);
L[y]+=L[x];
if(o==) a[x].clear(),L[x]=;
}
}
return ;
}

牛客NOIP暑期七天营-提高组2C:滑块(平衡树) (这里rope骗分)的更多相关文章

  1. 牛客NOIP暑期七天营-提高组1

    牛客NOIP暑期七天营-提高组1 链接 A 边权可为0就排序建一条链子. 但是边权不为0 除了第一个有0的不行. x连向上一个比他小的数. 期间判断有无解. #include <bits/std ...

  2. 牛客NOIP暑期七天营-提高组6

    目录 A-积木大赛 题目描述 link 题解 代码 B-破碎的序列 题目描述 link 题解 C-分班问题 题目描述 link 题解 比赛链接 官方题解 A-积木大赛 题目描述 link 题解 标签: ...

  3. 牛客NOIP暑期七天营-提高组5+普及组5

    ————提高组———— 第一题:deco的abs 题目链接:https://ac.nowcoder.com/acm/contest/934/A 因为每个数都可以加任意次 d ,所以可以推出 0 < ...

  4. 牛客NOIP暑期七天营-提高组3

    第一题:破碎的矩阵 题目链接:https://ac.nowcoder.com/acm/contest/932/A    刚看到这题的时候感觉特别熟悉...诶,这不就是codeforces某场比赛的某某 ...

  5. 牛客NOIP暑期七天营-提高组2

    第一题:ACGT 题目链接:https://ac.nowcoder.com/acm/contest/931/A trie树.hash.map遍历  ①.trie树上的节点多记一个rest值表示还有多少 ...

  6. 牛客NOIP暑期七天营-提高组6C:分班问题 (组合数)

    题意:A班有N个人,B班有M个人,现在要组成一个新的班级C班,为了公平,从AB班各抽相同人数的人. 现在求所有方案中,人数之和是多少. 思路:即求Σ k*C(N,k)*C(M,k);    先忽略这个 ...

  7. 牛客NOIP暑期七天营-提高组5

    A:deco的abs. 水题,先%,然后相邻两个数min()一下差值. #include<bits/stdc++.h> #define ll long long using namespa ...

  8. 牛客NOIP暑期七天营-提高组1 解题报告

    https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...

  9. 牛客NOIP暑期七天营-普及组2D

    链接:https://ac.nowcoder.com/acm/contest/926/D来源:牛客网 在一维坐标系中,给定 n条有颜色的线段,第 i条线段的左右端点分别为 li​和 ri​,此外它的颜 ...

随机推荐

  1. python 字典转成对象

    database = { "key1": { 'period':999, "data": { 'a':1, 'b':2, } }, "key2&quo ...

  2. Alpha冲刺(8/10)——2019.4.30

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  3. mapreduce 函数入门 三

    一.mapreduce多job串联 1.需求 一个稍复杂点的处理逻辑往往需要多个 mapreduce 程序串联处理,多 job 的串联可以借助 mapreduce 框架的 JobControl 实现 ...

  4. 全国自考C++程序设计

    一.单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中 只有一个是符合题目要求的,请将其代码填写在题后的括号内.错选.多选或未选均无 分. 1. 编写C++程序一般需经过的 ...

  5. [转帖]B4. Concurrent JVM 锁机制(synchronized)

    B4. Concurrent JVM 锁机制(synchronized) https://www.cnblogs.com/zlxyt/p/11050346.html 挺好的 感觉这个文章写的 不过想要 ...

  6. sqlserver替换一个单引号为多个单引号

    SqlServer Where语句中如果有单引号,需要替换为两个单引号,不然会语法错误,替换方法如下REPLACE(@UserName,'''','''''') REPLACE(@UserName,' ...

  7. HashSet去重

    class Program     {         static void Main(string[] args)         {             Console.WriteLine( ...

  8. CentOS7 firewalld防火墙 启动 关闭 禁用 添加删除规则等 常用命令

    CentOS7 firewalld防火墙 常用命令1.firewalld的基本使用启动: systemctl start firewalld关闭: systemctl stop firewalld查看 ...

  9. linux环境:FTP服务器搭建

    转载及参考至:https://www.linuxprobe.com/chapter-11.html https://www.cnblogs.com/lxwphp/p/8916664.html 感谢原作 ...

  10. Java自学-异常处理 异常分类

    Java 中异常的分类 异常分类: 可查异常,运行时异常和错误3种 其中,运行时异常和错误又叫非可查异常 步骤 1 : 可查异常 可查异常: CheckedException 可查异常即必须进行处理的 ...