对局匹配

直接贪心

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
void makedata() {freopen("input.txt", "w", stdout);cout << 200000 << endl;for(int i = 0; i < 200000; i++) cout << 1000000000 << ' ';fclose(stdout);
}int a[110000];int main() {
#ifndef ONLINE_JUDGEfreopen("input.txt", "r", stdin);
#endif//makedata();std::ios::sync_with_stdio(0), cin.tie(0);int n, k;cin >> n >> k;for(int i = 0; i < n; i++) cin >> a[i];sort(a, a + n);int ptr = 0, ans = 0;while(ptr < n) {if(ptr + 2 < n && a[ptr + 2] - a[ptr] <= k) {ans++;ptr += 3;} else ptr++;}cout << ans << endl;return 0;
}

View Code

稀疏矩阵乘积

对应关系别搞乱就行了

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
#include<set>
#include <list>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;int x[3000], y[3000], w[3000], b[3000][3000], c[3000][3000];int main() {
#ifndef ONLINE_JUDGEfreopen("input.txt", "r", stdin);
#endifstd::ios::sync_with_stdio(0), cin.tie(0);int n, p, q;int xx, yy, ww;cin >> n >> p >> q;for (int i = 0; i < p; i++)cin >> x[i] >> y[i] >> w[i];memset(b, 0, sizeof(b));for (int i = 0; i < q; i++) {cin >> xx >> yy >> ww;b[xx][yy] = ww;}memset(c, 0, sizeof(c));for (int i = 0; i < p; i++) {for (int j = 1; j <= n; j++) {c[x[i]][j] += w[i] * b[y[i]][j];}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (c[i][j] != 0) cout << i << ' ' << j << ' ' << c[i][j] << endl;}}return 0;
}

View Code

树上的等差数列

首先随便以某一个节点为根把树建起来。树上的一条路径可以看成是从某一个节点出发,在树结构上上升到某一个祖先节点,再下降到一个后代节点。记录father[x]为x节点的父节点,dep[x]为前两项为a[father[x]],a[x]的等差数列沿树结构向下最多能走的深度。枚举这个最高点r,把它的子节点按权值分类,枚举所有能构成等差数列的组合a1,a[r],a2,找到权值分别为a1和a2的子节点中dep值最大的点(且这两个点不为同一个点),那么产生了一个局部的最长等差数列l(a1)+1+l(a2),选出其中最大的输出。

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
#include<set>
#include <list>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;map<int, VI> mp[110000];
int a[110000], father[110000], dep[110000];
VI G[110000];void build(int x, int fa) {father[x] = fa;for (int i = 0; i < G[x].size(); i++) {int u = G[x][i];if (u == fa) continue;auto it = mp[x].find(a[u]);if (it == mp[x].end()) mp[x][a[u]] = VI();mp[x][a[u]].push_back(u);build(u, x);}
}
void calc(int x) {if (dep[x] != 0) return;int d = a[father[x]] - a[x];int aa = a[x] - d;auto it = mp[x].find(aa);if (it == mp[x].end()) {dep[x] = 1;return;}int tmp = 1;for (int i = 0; i < (*it).second.size(); i++) {int u = (*it).second[i];calc(u);if (dep[u] + 1 > tmp) tmp = dep[u] + 1;}dep[x] = tmp;
}
int main() {
#ifndef ONLINE_JUDGEfreopen("input.txt", "r", stdin);
#endifstd::ios::sync_with_stdio(0), cin.tie(0);int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i < n; i++) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}build(1, 0);memset(dep, 0, sizeof(dep));for (int i = 2; i <= n; i++) calc(i);int ans = 0;for (int i = 1; i <= n; i++) {for (auto itl = mp[i].begin(); itl != mp[i].end(); itl++) {int lval = (*itl).first, ldep = 0, ldot = 0;for (int j = 0; j < (*itl).second.size(); j++) {if (dep[(*itl).second[j]] > ldep) {ldep = dep[(*itl).second[j]];ldot = (*itl).second[j];}}int rval = 2 * a[i] - lval, rdep = 0, rdot = 0;auto itr = mp[i].find(rval);if (itr == mp[i].end()) {if (ldep + 1 > ans) ans = ldep + 1;continue;}for (int j = 0; j < (*itr).second.size(); j++) {if (dep[(*itr).second[j]] > rdep && (*itr).second[j] != ldot) {rdep = dep[(*itr).second[j]];rdot = (*itr).second[j];}}if (ldep + 1 + rdep > ans)  ans = ldep + 1 + rdep;}}cout << ans << endl;return 0;
}

View Code

翻转字符串

可以用Splay树实现反转操作。首先根据整个字符串建树,对于每次操作(l,r),首先把l左边的字符旋转到根节点上,此时(l,r)位于根节点的右子树上;然后把r右边的字符旋转到根节点的右子树的树根,这样一来,就得到了只由(l,r)构成的一棵子树:根节点的右子树的左子树,对其添加一个lazy标记,最后对树进行一个前序遍历即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxLength = 100002;
class Node{
public:Node *child[2];char value;int size;bool flip;Node(char c) :value(c), size(1), flip(false){child[0] = child[1] = NULL;}int getPosition()const{return child[0] ? child[0]->size + 1 : 1;}void maintain();void pushDown();
};
void Node::maintain(){size = 1;if (child[0]){size += child[0]->size;}if (child[1]){size += child[1]->size;}
}
void Node::pushDown(){if (flip){swap(child[0], child[1]);for (int i = 0; i < 2; i++){if (child[i]){child[i]->flip ^= 1;}}flip = false;}
}
class SplayTree{
public:Node *root;SplayTree(char *a, int n);void build(Node *&node, char *begin, char *end);void rotate(Node *&node, int direction);void splay(Node *&node, int position);void reverse(int begin, int end);void traverse(Node *u);void traverse();
};
SplayTree::SplayTree(char *a, int n){build(root, a, a + n - 1);
}
void SplayTree::build(Node *&node, char *begin, char *end){if (begin > end){return;}char *middle = begin + (end - begin >> 1);node = new Node(*middle);build(node->child[0], begin, middle - 1);build(node->child[1], middle + 1, end);node->maintain();
}void SplayTree::rotate(Node *&node, int direction){Node *child = node->child[direction ^ 1];node->child[direction ^ 1] = child->child[direction];child->child[direction] = node;node->maintain();child->maintain();node = child;
}
void SplayTree::splay(Node *&node, int position){node->pushDown();if (node->getPosition() != position){int d = node->getPosition() < position;Node *node2 = node->child[d];position -= d ? node->getPosition() : 0;node2->pushDown();if (node2->getPosition() != position){int d2 = node2->getPosition() < position;position -= d2 ? node2->getPosition() : 0;splay(node2->child[d2], position);if (d == d2){rotate(node, d ^ 1);}else{rotate(node->child[d], d);}}rotate(node, d ^ 1);}
}
void SplayTree::reverse(int begin, int end){splay(root, begin);splay(root->child[1], end - begin + 2);root->child[1]->child[0]->flip ^= 1;
}
void SplayTree::traverse(Node *u){if (!u){return;}u->pushDown();traverse(u->child[0]);if (u->value){printf("%c", u->value);}traverse(u->child[1]);}
void SplayTree::traverse(){traverse(root);
}
int main(){char s[maxLength] = "";while (~scanf("%s", s + 1)){int n = strlen(s + 1);SplayTree splay(s, n + 2);int k;scanf("%d", &k);for (int i = 0; i < k; i++){int begin, end;scanf("%d%d", &begin, &end);splay.reverse(begin + 1, end + 1);}splay.traverse();printf("\n");}return 0;
}

View Code

转载于:https://www.cnblogs.com/dramstadt/p/8168748.html

[Offer收割]编程练习赛42相关推荐

  1. 最简真分数c语言,HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)...

    描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...

  2. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  3. hihocoder offer收割编程练习赛8 B 拆字游戏

    思路: 模拟,dfs. 注意题目中的trick,输出一块的时候不要把其他块也输出了. 实现: 1 #include <cstring> 2 #include <iostream> ...

  4. hiho #1272 买零食 [Offer收割]编程练习赛2

    #1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...

  5. [Offer收割]编程练习赛63

    命名 暴力 1 #include <bits/stdc++.h> 2 using namespace std; 3 char S[1111], T[1111], a[1111], b[11 ...

  6. hihocoder offer收割编程练习赛11 B 物品价值

    思路: 状态压缩 + dp. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> ...

  7. [Offer收割]编程练习赛50

    题目3 : 末尾有最多0的乘积 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定N个正整数A1, A2, ... AN. 小Hi希望你能从中选出M个整数,使得它们的乘 ...

  8. hihocoder offer收割编程练习赛12 B 一面砖墙

    思路: 就是求哪个长度出现的次数最多. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorit ...

  9. 【[Offer收割]编程练习赛9 C】三等分

    [题目链接]:http://hihocoder.com/problemset/problem/1479 [题意] . [题解] 首先算出所有节点的权值的和val; 然后如果val%3!=0则直接输出0 ...

  10. [Offer收割]编程练习赛15 A.偶像的条件[贪心]

    #1514 : 偶像的条件 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的学校正面临着废校的大危机.面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同 ...

最新文章

  1. 31页PPT概述:图神经网络表达能力有多强?
  2. JQuery日记6.5 Javascript异步模式(一)
  3. 文件上传到ubuntu -- WinSCP 登录ftp服务器
  4. vb6 打印选项对话框_办公必备技能,Word打印问题及解决方案全在这,轻松解决打印难题...
  5. Java基础之IDE
  6. linux切换root密码错,(转)Linux下root密码丢失和运行级别错误的解决办法
  7. jdk 中英对照 百度网盘_Hadoop部署一jdk与MySQL
  8. Oracle 建立包 和 包体
  9. kmeans鸢尾花分类python代码_python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
  10. 搜索引擎下拉食云速捷详细_下拉框优化才云速捷一流!下拉框优化虑云速捷豪杰...
  11. 深入理解Python中的全局解释锁GIL
  12. Linux的远程连接及Linux系统下Tomcat部署
  13. ZooKeeper:分布式应用程序的分布式协调服务
  14. type=button 字体大一点_CAD设计师喜欢用SHX字体的原因你知道吗?
  15. html怎么修改像素,PS怎么修改像素又不改变尺寸?
  16. PC端天天生鲜页面实现
  17. 使用STM32进行Flash地址空间的数据读取
  18. 百度网盘官方免费极速下载(不定期更新)
  19. ImageWarping变形算法研究---反距离加权插值(IDW)
  20. ▷Scratch课堂丨【编程趣味卡3】制作音乐

热门文章

  1. JavaScript 作用域
  2. Oliver运维管理系统之一庐山真面目
  3. 让Flex程序全屏幕运行
  4. linux下常用文件传输命令(转)
  5. 使用scrapy的定制爬虫-第三章-爬虫的javascript支持
  6. ionic安装拍照选照片插件
  7. 学计算机不管干哪行,语言是必备的基本素质(认真学习C++)
  8. [Flash开发笔记] List控件--删除指定label或data的项
  9. rip和ospf vrrp vlan综合实验
  10. 按值传递时 php必须复制值,PHP开发笔试题及答案(一)