Transformation HDU - 4578 完全平方公式和立方公式展开,有点麻烦
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <string>
#include <math.h>
using namespace std;
const int MAXN = ;
struct Node
{
//1表示空的
//0表示有花
int l,r;
//和
int sum;
//如果是1 ,表示没花
//如果是-1,表示有花
//初始化为0
int lazy;
//区间最左边的1
int first;
//区间最右边的1
int last;
}segTree[MAXN*];
void push_up(int i)
{
if(segTree[i].l==segTree[i].r)
return;
segTree[i].sum = segTree[i<<].sum+segTree[(i<<)|].sum;
//如果左区间不是-1,表示左区间没花 ,那么first就是左区间的first
if(segTree[i<<].first != -)
segTree[i].first = segTree[i<<].first;
else
//那就是右区间的
segTree[i].first = segTree[(i<<)|].first;
//如果右区间不是-1,表示右区间没花,那么last就是右区间的last
if(segTree[(i<<)|].last != -)
segTree[i].last = segTree[(i<<)|].last;
else
//那就是左区间的
segTree[i].last = segTree[(i<<)].last;
}
void push_down(int i)
{
//如果已经到叶节点,就不能往下递归
if(segTree[i].r == segTree[i].l)
return;
//如果当前区间懒标记为1 ,没有花
if(segTree[i].lazy==)
{
//最左边的1就是左端点
segTree[i<<].first = segTree[i<<].l;
//最右边的0就是右端点
segTree[i<<].last = segTree[i<<].r;
//和
segTree[i<<].sum = segTree[i<<].r-segTree[i<<].l+;
//左区间懒标记,1表示没花
segTree[i<<].lazy=;
segTree[(i<<)|].first = segTree[(i<<)|].l;
segTree[(i<<)|].last = segTree[(i<<)|].r;
segTree[(i<<)|].sum = segTree[(i<<)|].r-segTree[(i<<)|].l+;
segTree[(i<<)|].lazy=;
}
//如果没有花 ,有花
if(segTree[i].lazy == -)
{
//有花
//那么就没有
segTree[i<<].first = -;
segTree[i<<].last = -; segTree[i<<].sum = ;
segTree[i<<].lazy=-; segTree[(i<<)|].first = -;
segTree[(i<<)|].last = -;
segTree[(i<<)|].sum = ;
segTree[(i<<)|].lazy=-;
}
//懒标记清空
segTree[i].lazy = ;
}
//初始化
void build(int i,int l,int r)
{
//
segTree[i].l = l;
segTree[i].r = r;
//1的个数
segTree[i].sum = r-l+;
segTree[i].lazy = ;
//最左端的1
segTree[i].first = l;
//最右端的1
segTree[i].last = r;
if(l==r)
return ;
int mid = (l+r)/;
build(i<<,l,mid);
build((i<<)|,mid+,r);
}
void update(int i,int l,int r,int type)
{
if(segTree[i].l == l && segTree[i].r==r)
{
//如果是插花
if(type == )
{
if(segTree[i].sum == )
return;
segTree[i].sum = ;
segTree[i].lazy = -;
segTree[i].first = -;
segTree[i].last = -;
return;
}
//如果是清空 ,都赋值为1
else if(type == )
{
if(segTree[i].sum == segTree[i].r-segTree[i].l+)
return;
segTree[i].sum = segTree[i].r-segTree[i].l+;
segTree[i].lazy = ;
segTree[i].first = segTree[i].l;
segTree[i].last = segTree[i].r;
return;
} }
push_down(i);
int mid = (segTree[i].l + segTree[i].r)/;
if(r <= mid)
update(i<<,l,r,type);
else if(l > mid)
update((i<<)|,l,r,type);
else
{
update(i<<,l,mid,type);
update((i<<)|,mid+,r,type);
}
push_up(i);
}
int sum(int i,int l,int r)
{
if(segTree[i].l == l && segTree[i].r == r)
{
return segTree[i].sum;
}
push_down(i);
int mid = (segTree[i].l + segTree[i].r)/;
if(r <= mid)
return sum(i<<,l,r);
else if(l > mid)
return sum((i<<)|,l,r);
else
return sum((i<<)|,mid+,r)+sum(i<<,l,mid);
}
int n,m;
int query1(int i,int l,int r)
{
if(segTree[i].l == l && segTree[i].r == r)
{
return segTree[i].first;
}
push_down(i);
int mid = (segTree[i].l + segTree[i].r)/;
int ans1,ans2;
if(r <= mid)
return query1(i<<,l,r);
else if(l > mid)
return query1((i<<)|,l,r);
else
{
ans1 = query1(i<<,l,mid);
if(ans1 != -)
return ans1;
return query1((i<<)|,mid+,r);
}
}
int query2(int i,int l,int r)
{
if(segTree[i].l == l && segTree[i].r == r)
{
return segTree[i].last;
}
push_down(i);
int mid = (segTree[i].l + segTree[i].r)/;
int ans1,ans2;
if(r <= mid)
return query2(i<<,l,r);
else if(l > mid)
return query2((i<<)|,l,r);
else
{
ans1 = query2((i<<)|,mid+,r);
if(ans1 != -)
return ans1;
return query2(i<<,l,mid);
}
}
int judge(int A,int F)
{
//如果不能再放了
if(sum(,A,n)==)
return -;
if(sum(,A,n)<F)
return n;
int l= A,r = n;
int ans=A;
while(l<=r)
{
int mid = (l+r)/;
if(sum(,A,mid)>=F)
{
ans = mid;
r = mid-;
}
else l = mid+;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
build(,,n);
int op,u,v;
while(m--)
{
scanf("%d%d%d",&op,&u,&v);
if(op == )
{
u++;
int t = judge(u,v);
if(t==-)
{
printf("Can not put any one.\n");
continue;
}
//插花的起点、终点
printf("%d %d\n",query1(,u,t)-,query2(,u,t)-);
update(,u,t,);
}
else
{
u++;v++;
// 区间长度-剩下的1
printf("%d\n",v-u+-sum(,u,v));
update(,u,v,);
}
}
printf("\n");
}
return ;
}
Transformation HDU - 4578 完全平方公式和立方公式展开,有点麻烦的更多相关文章
- Transformation HDU - 4578(线段树——懒惰标记的妙用)
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...
- K - Transformation HDU - 4578 线段树经典题(好题)
题意:区间 加 变成定值 乘 区间查询:和 平方和 立方和 思路:超级超级超级麻烦的一道题 设3个Lazy 标记分别为 change 改变mul乘 add加 优先度change>m ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- EXCEL 如何实现下拉填充公式,保持公式部分内容不变,使用绝对引用
EXCEL 如何实现下拉填充公式,保持公式部分内容不变,使用绝对引用 在不想变的单元格前加$符号(列标和列数,两个都要加$),变成绝对引用,默认情况是相对引用 L4固定不变的方式:$L$4 M4固定不 ...
- latex:在公式之中和公式之间插入说明文字和标点符号
在公式之中和公式之间插入说明文字和标点符号,主要使用 \intertext{文本} \shortintertext{文本} \text{文本} 这三个命令 代码: \begin{align*}x^{2 ...
- HDU 4578 - Transformation - [加强版线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...
- 2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6128 题意:给你n个数,问你有多少对i,j,满足i<j,并且1/(ai+aj)=1/ai+1/a ...
- ZOJ 3690 & HDU 3658 (矩阵高速幂+公式递推)
ZOJ 3690 题意: 有n个人和m个数和一个k,如今每一个人能够选择一个数.假设相邻的两个人选择同样的数.那么这个数要大于k 求选择方案数. 思路: 打表推了非常久的公式都没推出来什么可行解,好不 ...
- HDU 4578 Transformation (线段树区间多种更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 题目大意:对于一个给定序列,序列内所有数的初始值为0,有4种操作.1:区间(x, y)内的所有数字全部加上 ...
随机推荐
- js代码预解析
1.var一般用于声明变量,预解析代码的时候,等号后面的赋值过程不会执行,所以预解析时的var变量都是未定义的 2.function声明的函数,预解析的时候,值就是函数里面的内容 例:console. ...
- windows 安裝 gcc 編譯器 - MinGW
MinGW 介紹 MinGW 全稱 Minimalist GNU For Windows,是個精簡的Windows平台C/C++.ADA及Fortran編譯器,相比Cygwin而言,體積要小很多,使用 ...
- 透彻分析和解决一切javaWeb项目乱码问题
前言 乱码是我们在程序开发中经常碰到且让人头疼的一件事,尤其是我们在做javaweb开发,如果我们没有清楚乱码产生的原理,碰到乱码问题了就容易摸不着头脑,无从下手. 乱码主要出现在两部分,如下: 第一 ...
- 一接口自动化中生成测试数据需要用到的java类API--import java.util.Properties;
转载地址: http://www.cnblogs.com/lay2017/p/8596871.html#undefined 写的很详细
- BZOJ 1601 [Usaco2008 Oct]灌水 (建图+mst)
题意: 300个坑,每个坑能从别的坑引水,或者自己出水,i从j饮水有个代价,每个坑自己饮水也有代价,问让所有坑都有谁的最少代价 思路: 先建一个n的完全图,然后建一个超级汇点,对每个点连w[i],跑m ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- 使用Redis需要注意的几点
Redis作为缓存中间件,被广泛应用在各类系统,用来提升系统性能和吞吐,下面总结几点开发人员在使用Redis时需要考虑的几个关键点: 一. key的设计 1. key命名规范:为了避免不必要的麻烦,我 ...
- 事务特性ACID及隔离级别
注:例子引用来自:https://www.cnblogs.com/WJ-163/p/6023054.html 事务就是一组原子性的SQL查询,或者说一个独立的工作单元. 银行应用是解释事务必要性的一个 ...
- 2014.1.21 DNS大事故(dns原理、网络封锁原理)
1.21那天发生了什么,由1.21联想补充…… 很多网站都上不去,域名解析都到了65.49.2.178这个IP地址 先科普,再深挖 dns查询类型 递归查询,迭代查询 DNS解析过程,这里使用 ...
- JS求1到100的累计值
sum=0 for(i=1;i<=100;i++) { sum+=i } alert(sum) 作者:kerwin-chyl 文章链接:https:////www.cnblogs.com/k ...