辣些数据结构的思维题(思维题好难一个都不会TAT)
洛谷P1268 树的重量
- 我觉得难点在于把每个叶子节点想象成分出来的叉
- 然后如果c是a--b这条边上分出来的,可以通过Dab,Dca,Dcb算出分叉边的长度,
- 长度=(Dac+Dbc-Dab)/2
- 怎么看c到底是哪两条边分叉出来的呢?
- 取最小的(洛谷后面的题解可以看懂)
- 代码:(只有一个测试数据感觉都不知道自己写的到底对不对
#include <bits/stdc++.h>
#define inf 1e9 using namespace std;
int n; //n<=30
int d[][]; inline int f(int a,int b,int c){ //c是ab分叉,算叉出去那一段长度
return (d[a][c]+d[b][c]-d[a][b])/;
} int main(){
//freopen("owo.in","r",stdin);
while(scanf("%d",&n)==&&n){
memset(d,,sizeof(d));
for (int i=; i<n; i++) for (int j=i+; j<=n; j++) { scanf("%d",&d[i][j]); d[j][i]=d[i][j]; }
int ans=d[][];
for (int i=; i<=n; i++) { //把每个点作为分叉加进来
int ta=inf;
for (int j=; j<=i; j++) for (int k=; k<=i; k++) if(k!=i&&j!=i&&j!=k) ta=min(ta, f(j,k,i) );
ans+=ta;
}
printf("%d\n",ans);
}
return ;
}( ͡° ͜ʖ ͡°)
洛谷P2375 [NOI2014]动物园
- 题意:构造一个
num
数组一一对于字符串SSS的前iii个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,
将这种字符串的数量记作num[i]
- 算两个数组:
- 第一个:jump[i]它第一个不重叠的公共前后缀的位置(类似于next[i],但是不允许前后缀有重叠)
- 第二个:ta[i]对于下标i,它全部的公共前后缀的个数
- 这两个数组都可以通过next[i]求得,然后num[i]就等于 ta[ jump[i] ] 辣。
- 代码:
#include <bits/stdc++.h>
#define nmax 1000010
#define mod 1000000007 using namespace std;
typedef long long ll;
char b[nmax];
int num[nmax],ne[nmax],ta[nmax],jump[nmax];
int l;
ll ans; void init(){
ans=;
memset(num,,sizeof(num));
memset(ne,,sizeof(ne));
memset(ta,,sizeof(ta));
memset(jump,,sizeof(jump));
} void build(){
for (int i=; i<=l; i++) {
int j=ne[i-];
while( b[j+]!=b[i] && j ) j=ne[j];
if(b[j+]==b[i]) ne[i]=j+;
}
} void b2(){ //它第一个不重叠的公共前后缀的位置
for (int i=; i<=l; i++) {
int p=jump[i-];
if( b[p+] == b[i] && (p+)<=(i/) ) jump[i]=p+;
else {
while ( p && ( (p+)>(i/) || b[p+]!=b[i] ) ) p=ne[p];
if(b[p+]==b[i]) jump[i]=p+;
}
}
} void solve(){
int tmp;
for (int i=; i<=l; i++) {
int j=ne[i],pd=i/;
if(j) ta[i]=ta[j]+;
if( jump[i] ) tmp=ta[jump[i]]+; else tmp=;
ans*=(tmp+);
ans%=mod;
}
} int main(){
int t;
cin>>t;
while(t--){
init();
scanf("%s",b+);
l=strlen(b+);
build();
b2();
solve();
printf("%lld\n",ans);
}
return ;
}^3^
CF Round #581 (Div. 2)
- 这道题。。。它给的p1,....,pn里面假设连续三个点 pk,p(k+1),p(k+2) 容易知道如果pk到p(k+2)的最短路是2的话p(k+1)是可以删去的
- 于是愉快的扫一遍每次这样看三个。
- 然后就wa6了
- wa的原因:这里如果pk已经被删去了,是要影响到p(k+1)的。
- 比如p1,p2,p3,p4,如果p2被删,p4,p2的最短路是2,会删3,但是如果p1p4的最短路是2.。。就删错了
- 正确姿势:假设前面已经得到一连串p1~pk,现在最后得到的pk,然后往后面走,走到pj,如果p(j+1)和pk的距离和j+1-k相等的话,就可以把pj删了
- 代码:
#include <bits/stdc++.h>
#define inf 1e6
#define mmax 5000010 using namespace std;
int n,m,ans=,idx=;
int e[][];
int p[mmax],del[mmax]={};
char in[]; void floyd(){
for(int k=;k<=n;k++) for(int i=;i<=n;i++) for(int j=;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j] ) e[i][j]=e[i][k]+e[k][j];
} int main(){
cin>>n;
for (int i=; i<=n; i++) {
scanf("%s",in+);
for (int j=; j<=n; j++) if(in[j]=='') e[i][j]=; else e[i][j]=inf;
}
floyd();
for (int i=; i<=n; i++) e[i][i]=;
cin>>m;
scanf("%d%d",&p[],&p[]);
if(m==){
printf("2\n");
printf("%d %d\n",p[],p[]);
}else{
for (int i=; i<m; i++) {
scanf("%d",&p[i]);
if( e[ p[idx] ][ p[i] ]>=i-idx ) {
ans++;
del[i-]=;
}else idx=i-;
} printf("%d\n",m-ans);
for (int i=; i<m; i++) if(!del[i]) printf("%d ",p[i]);
cout<<endl;
}
return ;
}嘤雄不朽+1s
UVALive - 3902
vjudge上的地址 https://vjudge.net/problem/UVALive-3902
- 容易想到的贪心,就是对于每个叶子节点,把服务器的复制放在尽量离他远的地方。
- 但是就算是用了上面一种贪心策略还是会有很多种放置♂方式
- 然后又贪心,从深度♂比较大的客户端开始考虑
- 代码:
#include <bits/stdc++.h>
#define nmax 1100 using namespace std;
int cas,k,n,ina,inb,s;
vector <int> g[nmax];
int vis[nmax]={},fa[nmax]={};
struct node{
int d,u;
bool operator < (const node a){ return a.d<d; }
}x[nmax]; void dfs1(int u){ //以s为根拉树,然后处理出每个点的父亲
for (int i=; i<g[u].size(); i++) {
int v=g[u][i];
if(fa[v]==) { fa[v]=u; x[v].d=x[u].d+; dfs1(v); }
}
} void dfs(int f,int u,int dep){ //给某个服务器服务到的点标1
vis[u]=;
if(dep==k) return;
for (int i=; i<g[u].size(); i++) if(g[u][i]!=f) dfs(u,g[u][i],dep+);
} int main(){
cin>>cas;
while(cas--){
memset(vis,,sizeof(vis));
memset(fa,,sizeof(fa));
scanf("%d%d%d",&n,&s,&k);
x[s].d=;
for (int i=; i<=n; i++) { x[i].u=i; g[i].clear(); }
for (int i=; i<n; i++) {
scanf("%d%d",&ina,&inb);
g[ina].push_back(inb);
g[inb].push_back(ina);
}
fa[s]=s;
dfs1(s);
sort(x+,x+n+);
dfs(s,s,);
int ans=;
for (int i=; i<=n; i++) {
int u=x[i].u;
if( g[u].size()> || vis[u] ) continue;
int v=u;
for (int i=; i<k; i++) v=fa[v];
dfs(v,v,);
ans++;
}
printf("%d\n",ans);
}
return ;
}嘤年早逝
辣些数据结构的思维题(思维题好难一个都不会TAT)的更多相关文章
- 《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 二.思路解析 首先定义一个Integer类型的栈,记为stack,此栈用来完成数据 ...
- PMP全真模拟题真题試題含答案解析 2019年下半年PMP考試适用 PMP中文文对照试题 【香港台灣地區PMP考試也可用】
PMP全真模拟题真题试题 含答案解析 2019年下半年PMP考试适用 PMP中文文对照试题 [香港台灣地區PMP考試也可用]PMP全真模擬題真題試題 含答案解析 2019年下半年PMP考試适用 PMP ...
- 包含min函数的栈 【微软面试100题 第二题】
题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 参考题目:剑指offer第21题. 题目分析: 1. ...
- Web前端错题模糊题记录
title: Web前端错题模糊题记录 toc: true date: 2018-09-20 10:04:36 categories: Web tags: HTML CSS JavaScript HT ...
- Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL
没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...
- Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...
- 产品思维&技术思维&工程思维
产品思维 产品思维的起源是用户(或客户)价值.用户价值是通过技术手段以产品或服务的形态去解决用户的痛点,或带去爽点.毫无疑问,工程师在日常工作中应时刻关注并理清自己的工作与用户(或客户)价值的联系,并 ...
- Educational Codeforces Round 12补题 经典题 再次爆零
发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...
- 剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2. 思路和方法 利用辅助栈来存储现有栈的最小值.在入栈和出栈的时候将现有栈和最小 ...
随机推荐
- Android Studio 学习笔记(四):Adapter和RecyclerView说明
在现版本中,滚动控件有多种,而相比于ListView,GridView,RecyclerView的用途更广,因此将前两者作为Adapter适配器的引入,再对RecyclerView进行简单讲解. MV ...
- 回炉重造之重读Windows核心编程-006-线程
线程也是有两部分组成的: 线程的内核对象,操作系统用来管理线程和统计线程信息的地方. 线程堆栈,用于维护现场在执行代码的时候用到的所有函数参数和局部变量. 进程是线程的容器,如果进程中有一个以上的线程 ...
- ThinkPHP 5.1.x远程命令执行漏洞利用, 参考POC
thinkphp5.1.1为例 1.代码执行: http://192.168.0.108/public//index.php?s=index/\think\Request/input&filt ...
- Android实战项目——家庭记账本设计思路
经过三周左右的Android学习,实感只有上手开发才能有所提高.在此打算做一个家庭记账APP,同时巩固一下学到的东西并且弥补漏洞. 概述 记账是自古以来人类必不可少的一件事,从古代的算盘,到手写账本, ...
- 本地服务开启MySQL57提示本地计算机上MySQL服务启动后停止。。。。
1.首先以管理员身份启动cmd,要不然服务禁止访问. 2.然后在cmd中输入 mysqld --remove mysql或者mysqld --remove mysql57来移除服务. 3.然后进入My ...
- [SDOI2012] 任务安排 题解
有感而发,遂书. 其实和sze聊了很久,但他还是退役了.恐怕他是本届里学oi时间最长的一个人吧,从小学五年级开始.我也是因为他,才开始学oi的.他因为学校的压力,不得不放弃.或许是没什么天赋.学了4年 ...
- Mybaits(10)N+1问题
N+1问题 从上面的例子日志中我们可以看到所有级联都成功了,但是引发了性能问题,例如我们在查询雇员的信息和工作任务信息,此时体检表和工牌信息就是多余,我们没必要查询一次.如果想日志体现的那样,取出了所 ...
- 论文阅读笔记(十五)【CVPR2016】:Top-push Video-based Person Re-identification
Approach 特征由两部分组成:space-time特征和外貌特征.space-time特征由HOG3D[传送门]提取,其包含了空间梯度和时间动态信息:外貌特征采用颜色直方图[传送门]和LBP[传 ...
- PHP MySQLi Prepared Statements Tutorial to Prevent SQL Injection
https://websitebeaver.com/prepared-statements-in-php-mysqli-to-prevent-sql-injection#introduction On ...
- MySQL char与varchar 的区别
一.差异 1.占用存储空间上 char 初始化时占固定空间,varchar依据插入内容大小使用空间. 2.char最大字符长度255个(约0.1KB),varchar则是65535(约192KB). ...