hdu 4339 线段树+二分
题意是给你两个字符串 进行两种操作 1: 修改其中一个字符串里的某个字符2: 询问从i起两个字符串最多由多少个是相同的;
先说一下做之前的想法 ,我是看别人介绍树状数组是看到这道题的 本也想用树状数组做 ,没想上去 然后就改为线段树了 ,有很明显的点更新,区间查询,所以选择线段树;
思路: 每个节点num【】 存3个值 p1 p2 flash flash表示当前节点两个字符串是不是一样的 若是则为1否则为0 p1 p2为当前两个字符串的字符(其实只有在最底端的节点 p1 p2才有意义) 题目给的是字符区间 而真正修改的是点 所以得先处理字符串加到线段树里也就是deal函数 (偷懒写在一个函数里果断超时了!!!) 然后对点来更新
对于查询 我是用的二分 开始j=最大长度 然后二分到底 虽然时间可能长点 但代码比较简单
#include<stdio.h> #include<string.h> #include<iostream> using namespace std;#define LL(x) (x<<1) #define RR(x) ((x<<1)|1) char str1[1000010],str2[1000010]; struct node {char p1,p2;int flash; }num[4*1000000]; int max(int a,int b) {return a>b?a:b; } int deal(int L,int R,int left,int right,int mark,int k,char str[]) { if(L==left&&right==R&&L==R){if(k==1) num[mark].p1=str[L-1];else num[mark].p2=str[L-1];if(num[mark].p1==num[mark].p2) num[mark].flash=1;else num[mark].flash=0;return 0;}int mid=(L+R)/2;if(right<=mid){deal(L,mid,left,right,LL(mark),k,str);} else if(left>mid){deal(mid+1,R,left,right,RR(mark),k,str);}else{deal(L,mid,left,mid,LL(mark),k,str);deal(mid+1,R,mid+1,right,RR(mark),k,str);}if(num[LL(mark)].flash==0||num[RR(mark)].flash==0) num[mark].flash=0;else num[mark].flash=1;return 0; } int update(int L,int R,int dis,int mark,int k,char p) {if(L==R&&L==dis){if(k==1) num[mark].p1=p;else num[mark].p2=p;if(num[mark].p1==num[mark].p2) num[mark].flash=1;else num[mark].flash=0;return 0;}if(num[mark].flash==1){num[LL(mark)].flash=num[RR(mark)].flash=num[mark].flash;}int mid=(L+R)/2;if(dis<=mid){update(L,mid,dis,LL(mark),k,p);} else update(mid+1,R,dis,RR(mark),k,p);if(num[LL(mark)].flash==0||num[RR(mark)].flash==0){num[mark].flash=0;}else num[mark].flash=1; return 0; } int find(int L,int R ,int left,int right,int mark) {if(num[mark].flash==1) return 1;if(left==L&&right==R) return -1;int mid=(L+R)/2;if(right<=mid){return find(L,mid,left,right,LL(mark));}else if(left>mid){return find(mid+1,R,left,right,RR(mark));}else{int t1=find(L,mid,left,mid,LL(mark));int t2=find(mid+1,R,mid+1,right,RR(mark));if(t1==-1||t2==-1) return -1;else return 1;} } int main() {int len1,len2,T,i,d=1;scanf("%d",&T);while(T--){ printf("Case %d:\n",d++);scanf("%s%s",str1,str2);len1=strlen(str1);len2=strlen(str2);int L=1,R=max(len1,len2);memset(num,0,sizeof(num));deal(L,R,1,len1,1,1,str1);deal(L,R,1,len2,1,2,str2);int Q;scanf("%d",&Q);while(Q--){int dis,x,k;char str[5];scanf("%d",&x);if(x==1){scanf("%d%d%s",&k,&dis,str);dis++;update(L,R,dis,1,k,str[0]);}else {int left;scanf("%d",&left);int t=left;left++;int right=R;while(left<=right){int mid=(left+right)/2;if(find(L,R,left,mid,1)==-1) right=mid-1;else left=mid+1;}printf("%d\n",left-t-1);}} }return 0; }
hdu 4339 线段树+二分相关推荐
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- 牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟
牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟 题意 思路 Code 传送门: https://ac.nowcoder.com/acm/contest/16081/E 题意 登山顺 ...
- codeforces 609F Frogs and mosquitoes 线段树+二分+multiset
http://codeforces.com/problemset/problem/609/F There are n frogs sitting on the coordinate axis Ox. ...
- HDU - 4614 Vases and Flowers 线段树+二分
题目链接 思路:线段树维护区间和,当k=1时,询问二分询问[x-(x~n-1)]找到最小位置,复杂度n*logn*logn卡过 #include<stdio.h> #include< ...
- HDU - 6464 免费送气球(线段树二分)
题意: 又到了GDUT一年一度的程序设计竞赛校赛的时间啦.同学们只要参加校赛,并且每解出一道题目就可以免费获得由ACM协会和集训队送出的气球一个.听到这个消息,JMC也想参加免费拿气球.可是,由于JM ...
- hdu4614 Vases and Flowers 线段树+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- 可持久化普通线段树 ---- P2839 [国家集训队]middle 可持久化普通线段树 + 二分 求中位数最大值
题目链接 题目大意: 解题思路: 这个题思路很妙!! 首先我们假设只有一次询问怎么做? 那么我们可以二分出这个最大值midmidmid,然后把大于等于midmidmid设置成111,把小于midmid ...
- P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...
- hdu 4417(线段树OR树状数组)
题意:输入一个长度为n的序列,然后m个询问,询问区间[a,b]中比h小的数的个数. 思路:树状数组或线段树离线处理. 树状数组1 View Code 1 #include<cstdio> ...
最新文章
- 关于Titandb Ratelimiter 失效问题的一个bugfix
- Hibernate 笔记1
- 提示You don't have permission to access /index.php on this server.
- vue指令:v-once 元素和组件只渲染一次,不会随着数据的改变而改变
- 用canvas绘制一个圆形,实现绕着一个中心运动
- jzoj2679-跨时代【背包,dfs,状压】
- 在BingoCC上面解析域名实现智能路由
- Java String简单知识点总结
- oracle统计每个类别,Oracle统计分析函数集之一
- ES6学习笔记四(数组)
- 20200122每日一句
- Vulkan::0.0::开始于VulKanSDK(Getting Started with the Vulkan SDK)
- 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
- 动态加密?看我如何见招拆招爬取某点评全站内容!
- CDR安装包下载+汉化简体中文版+安装教程
- scala的交互式图表工具wisp
- 环保物联网技术应用研究综述
- SAP软件系统合规性审计介绍
- Python基础——修改Python字典中的key(键)
- es filter中使用should