这个随笔用用来放一些好的思想和思考方式(暂时secret)
一:
给你一个只有4和7的数字,求这是第几个幸运数字?
思路:
我们把4映射成0,7映射成1,然后就如下枚举:0,1,00,01,10,11。因为是映射的,所以可以前导0,然后我们就会知道给出的那个数字在里面的规律了,找出来就好了。
关键:映射思想
二:CF 319 DIV1 A
一种组合计数问题:
给你一个01串(因为是字符串,可以前导0),长度为n。然后给你一个编号为0到(2^n)-1的所有数字,将这些所有编号取异或然后让原数字和这个异或的数字配对成(a,b)。问,有多少套这样的数,满足(a,b),(c,d),其中c>a,b>d。
思路:
a和c的右边是一定是一样的,那么二进制中,c到某一位的数字是0,而a是1,那么无论后面的数字再怎么枚举都不可能a>=c,所以我们只需要固定这一位,然后左边的高位一样,右边的可以不一样(不一样的相乘即可),这样就OK了。
关键:移位、固定条件、等思想(这个思想在CD667 div2的D也有)
三:CF 315 DIV2 C
题目大意:
有n个人,分别这些人有a[i]的rank,然后通过一定的计算公式,计算出他们的值,如果其中的值小于k,那么就删除这个数字。注意,这个数组是动态的,例如,原来有5个,那么删除了第二个以后后面的3,4,5的a[i]的位置就变成了2,3,4了。
思路:
因为第一个是0,那么我们只需要知道下面所计算的,如果遇到一个tmp<k的就直接删除就可以了,并不需要每一次都重新计算所有的值
关键:无论怎么样的规律,都要先试试看直接按照顺序做或者逆序做
四:UVA1103 world final2011
题目大意,给你几个图片,每个图片都有特征,再给你为h*w的数组,输出数组中描述的图片。(按照字母大小排序)
思路:
dfs,每个特征就是其中的空白块有几个。
这里的一些思想
①把所有不同类型的块弄成不同的颜色,再统计即可
②利用vector<set<int>>来统计集合
关键:让特征不同的对应不同的值,使得容易区分
五:八皇后问题书p193
八皇后问题就是一个简单的回溯法,但是从中我们要获得一些思想:
①主对角线和副对角线之间是有关联的,y-x表示的是主对角线的特征,y+x表示的是副对角线的特征(如果有两个这样的是相等的话,那就表示他们是在同一条对角线上)。或者用vis[1][cur+i] and vis[2][cur-i+n]来表示主和副对角线
六:理想路径 UVA1599 NERRC 2010
题目大意:给n个点,m条边(2<=n<=100000, 1<=m<=200000)的无向图,每条边有一个颜色。求从1到n的路径,使得经过的边最少,如果有多条路径,那么就是找经过的color字典序最小,且输出路径上的color(颜色为1-1e9)
思路一:
反向bfs找路径d,再正向bfs每次找目前节点上color最小的那条边即可。
#include<bits/stdc++.h> using namespace std;
const int maxn = + ;
const int inf = 0x3f3f3f3f;
struct edge{
int u, v;
int color;
edge(int uu, int vv, int cc): u(uu), v(vv), color(cc){}
};
vector<edge> G[maxn];
int d[maxn];
int n, m; void init(){
for (int i = ; i < n; i++) d[i] = inf;
for (int i = ; i < n; i++) G[i].erase(G[i].begin(), G[i].end());
for (int i = ; i < m; i++){
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
if (u == v) continue;
G[u - ].push_back(edge(u - , v - , c));
G[v - ].push_back(edge(v - , u - , c));
}
} void bfs1(int s){
queue<int> que;
que.push(s);
d[s] = ;
while (!que.empty()){
int u = que.front();
que.pop();
for (int i = ; i < G[u].size(); i++){
edge e = G[u][i];
if (d[u] < inf && d[u] + < d[e.v]){
d[e.v] = d[u] + ;
que.push(e.v);
}
}
}
} vector <int> ans; void bfs2(int s){
ans.erase(ans.begin(), ans.end());
queue<int> que;
que.push(s);
//printf("%d\n", d[s]);
int cnt = d[s] - ;
vector <int> v;
int c = inf;
while (!que.empty()){
int u = que.front();
que.pop();
for (int i = ; i < G[u].size(); i++){
edge e = G[u][i];
if (cnt != d[e.v]) continue;
//printf("cnt = %d\n", cnt);
if (c > e.color){
v.erase(v.begin(), v.end());
v.push_back(e.v);
c = e.color;
}
else if (c == e.color){
v.push_back(e.v);
}
}
if (c == inf)
if (que.empty() && v.size()){
for (int i = ; i < v.size(); i++){
que.push(v[i]);
}
ans.push_back(c);
c = inf;
cnt--;
v.erase(v.begin(), v.end());
}
}
int len = ans.size();
printf("len = %d\n", len);
for (int i = ; i < len; i++){
printf("%d%c", ans[i], i == len - ? '\n' : ' ');
}
} int main(){
while (scanf("%d%d", &n, &m) == ){
init();
bfs1(n - );
bfs2();
}
return ;
}
关键:两次bfs的作用不同。 倒叙。
思路二:
一次bfs就够了(我不会。。。)
七:修改天平UVA12166 NWERC2008
题目大意:给一个深度不超过16的二叉树,代表一个天平,每个杆都挂在中间,每个秤砣的重量已知。问,至少修改多少个秤砣的重量才能让天平平衡?
吐槽:
T了我一脸。。。而且自己的之前思路还错了。。。
思路:
由于是天平,且是二叉树,因此,我们知道,修改一个点就等于要修改全部的点。因此,我们可以固定一下。首先我们选取二叉树上的一点为值,如果天平要平衡,那么天平上的总重量必然为(目前选取的这个重量为w,深度为d)w<<d。然后我们把每个值所对应的w<<d求出来,用map保存,然后最后扫一遍map就行了。
关键:定点,平衡与总和,逆向(就是反过来用w<<d求)
这里知道了strlen(char数组)是O(n)的方法寻找的,所以在多组的时候一定要小心。(因为这个T了一脸)
还有就是map的遍历map<>::iterator it = map.begin() for(; it != map.end(); it++){}
#include<bits/stdc++.h> using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int maxn = + ;
//char ch[maxn];
map <LL, int> m;
string ch; int main(){
int t; cin >> t;
while (t--){
//scanf("%s", ch);
cin >> ch;
m.clear();
int sum = ;
int nowd = ;
for (int i = ; i < ch.size()/*strlen(ch)*/; i++){
if (ch[i] == ',') continue;
else if (ch[i] == '[') nowd++;
else if (ch[i] == ']') nowd--;
else {
LL val = ch[i] - '';
while (ch[i + ] >= '' && ch[i + ] <= ''){
val = LL(val * + ch[i + ] - '');
i += ;
}
val <<= nowd;
m[val] += ;
sum++;
}
}
int ans = inf;
map<LL, int>::iterator it = m.begin();
for ( ; it != m.end(); it++){
ans = min(ans, sum - it->second);
}
printf("%d\n", ans);
}
return ;
}
八:寻找矩形(一次多校赛前的测试,估计题目已经无法交了:链接)
账号密码team244 123570
题目大意:给你n个点,n<1e5,每个点都有坐标(x,y)(xandy的绝对值都小于1e9),有一个矩形,每条边都平行于x和y。问有多少个矩形符合每条边上都有m个点。(每个顶点都必须有一个点)
思路:
离散化以后枚举点,然后之前将所有点按x排序,y排序,最后再寻找这个点上方的m-1个和左边的m-1个,然后找到以后得到新的x和y,然后判断这个x和y存不存在即可。
关键:离散化,上方枚举和下方枚举
#include<bits/stdc++.h>
#define mk make_pair using namespace std;
typedef long long LL;
const int maxn = + ;
int n, m;
pair<int, int> xx[maxn];
vector<LL> v;
vector<int> x[maxn];
vector<int> y[maxn];
map<pair<int, int>, int> p;
int len; void solve(){
int cnt = ;
for (int i = ; i < n; i++){
if (m <= ) break;
int tx = xx[i].first;
int ty = xx[i].second;
int lenx = x[tx].size(); //表示里面有几个y
int leny = y[ty].size();//表示里面有几个x
if (lenx < m) continue;
if (leny < m) continue;
//先找x上方的m-1个,里面放着y
int py = lower_bound(x[tx].begin(), x[tx].end(), ty) - x[tx].begin();//在x的集合里面,y的位置
if (py + m > lenx) continue;
int px = lower_bound(y[ty].begin(), y[ty].end(), tx) - y[ty].begin();//在y这个集合里面,x的位置
if (px + m > leny) continue;
int posx = y[ty][px + m - ];
int posy = x[tx][py + m - ];//this?
if (p[mk(posx, posy)]){
cnt++;
}
}
printf("%d\n", cnt);
} int main(){
int t; cin >> t;
while (t--){
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++){
LL a, b;
scanf("%I64d%I64d", &a, &b);
xx[i] = mk(a, b);
v.push_back(a);
v.push_back(b);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
int lx = , ly = ;
for (int i = ; i < n; i++){
int tx = xx[i].first = lower_bound(v.begin(), v.end(), xx[i].first) - v.begin();
int ty = xx[i].second = lower_bound(v.begin(), v.end(), xx[i].second) - v.begin();
//printf("%d %d\n", xx[i].first, xx[i].second);
p[mk(tx, ty)] = ;
x[tx].push_back(ty);
y[ty].push_back(tx);
lx = max(lx, tx);
ly = max(ly, ty);
}
for (int i = ; i <= lx; i++){
sort(x[i].begin(), x[i].end());
}
for (int i = ; i <= ly; i++){
sort(y[i].begin(), y[i].end());
}
solve();
//初始化
p.clear();
v.clear();
for (int i = ; i <= lx; i++){
x[i].clear();
}
for (int i = ; i <= ly; i++){
y[i].clear();
}
memset(xx, , sizeof(xx));
}
return ;
}
九:数学(链接:账号密码同上)
题意:对自然数列{1,2,3,4,5,6...}进行n次操作,每次操作有一个x,意思是前x个保留,后x个删去,再x个保留,后x个删去。。。形成新的序列,问n次操作后第n个数字。
思路:逆序插入
关键:逆序思想
这个随笔用用来放一些好的思想和思考方式(暂时secret)的更多相关文章
- CentOS随笔 - 4.CentOS7安装MySql 5.5.60(下载 tar 方式安装)
前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 由于公司也有php+mysql的项目, 所以今天也把Mysql装了一遍. 为了与以前的程序和数据库兼容, 这次 ...
- java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- python学习笔记系列----(三)数据结构
这一章主要是介绍了python一些常用的数据结构,比如list,tuple,dictionary,set,以及一些实用遍历技巧,主要讲的还是list. 3.1 list 主要介绍了list的一些常用的 ...
- ch6 影响 MySQLServer 性能的相关因素
第6章影响 MySQLServer 性能的相关因素 前言: 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的 ...
- [转载] TLS协议分析 与 现代加密通信协议设计
https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...
- C#语言基础01
Console.WriteLine("hello"); Console.ReadKey();// 按一个按键继续执行 string s=Console.ReadLine();//用 ...
- Go学习笔记02-源码
第二部分 源码 基于 Go 1.4,相关文件位于 src/runtime 目录.文章忽略了 32bit 代码,有兴趣的可自行查看源码文件.为便于阅读,示例代码做过裁剪. 1. Memory Alloc ...
- mybatis 学习总结笔记Day2
在门外听到或看到一门技术,找资料入门,一看,嗯,不错,进门之后,发现,尼玛————,是片海,你是关门而出,还是学习精卫填海. 填海吧,也许只是个小水坑,稍加用点力,就填的7788了. 上一篇随笔中说了 ...
随机推荐
- HDU 4115 Eliminate the Conflict(2-SAT)(2011 Asia ChengDu Regional Contest)
Problem Description Conflicts are everywhere in the world, from the young to the elderly, from famil ...
- 第一章 Windows编程基础(1~4课)
第一课:从main到WinMain 第二课:窗口和消息 第三课:MFC编程 第四课:MFC应用程序框架 概括: Win32的两种编程框架:SDK方式.MFC方式 1. SDK方式:使用WinMain入 ...
- Java 集合框架之 Map
Hashtable Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子.容量 是哈希表中桶 的数量,初始容量就是哈希表创建时的容量.注意,哈希表的状态为 open:在发生“哈希冲突” ...
- Mybatis实现
简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...
- Swift-map()跟flatMap()区别
map()方法介绍 map() 是 Array 提供的方法,通过接收一个函数作为传入参数,对数组中每个元素进行函数变换得到新的结果值.这样只需要提供 X->Y 的映射关系,就能将数组 [X ...
- 【week2】四人小组项目(WBS、NABCD)
项目选题:东北师范大学论坛 小组名称:nice! 项目组长:李权 组员:于淼 刘芳芳 杨柳 本周任务:要求给出需求概述.功能列表.痛点或亮点.NABCD及WBS模型在此项目中的应用. 作为东北师范大学 ...
- 使用tc来控制网络流量
https://blog.csdn.net/qinyushuang/article/details/46611709 tc实际操控网络的流量 解释网络tc的架构,从架构上分析tc,与netfilter ...
- [剑指Offer] 47.求1+2+3+...+n
题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). [思路]用&&的短路思想来求和 ...
- Tomcat 设计模式分析
门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Applica ...
- HTML5拖拽表格中单元格间的数据库
效果图: