博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2777
阅读量:4507 次
发布时间:2019-06-08

本文共 1301 字,大约阅读时间需要 4 分钟。

首先数字最多只有 30 种,很容易想到状压,用一个 int 来表示一个区间数字出现的状态。

很容易想到用线段树来维护一个区间数字出现的状态。

#include"cstdio"#include"cctype"#include"algorithm"using namespace std;#define lc o*2#define rc o*2+1#define mid (l+r)/2int read(){    int c,x=0; while(!isdigit(c=getchar()));    while(x=x*10+c-'0',isdigit(c=getchar()));    return x;}int f[400001],c[400001];void update(int o){    if(c[o]) f[o]=(1<
R || r
=L && r<=R) { c[o]=v; update(o); return; } push(o); change(lc,l,mid,L,R,v); change(rc,mid+1,r,L,R,v); update(o);}int query(int o,int l,int r,int L,int R){ if(l>R || r
=L && r<=R) return f[o]; push(o); return query(lc,l,mid,L,R)|query(rc,mid+1,r,L,R);}int calc(int k){ int res=0; for(;k;k>>=1) if(k&1) res++; return res;}int main(){ c[1]=f[1]=1; int L=read(),T=read(),O=read(); while(O--) { char c; while(c=getchar(),c!='P' && c!='C'); if(c=='C') { int A=read(),B=read(),C=read(); if(A>B) swap(A,B); change(1,1,L,A,B,C); } else { int A=read(),B=read(); if(A>B) swap(A,B); printf("%d\n",calc(query(1,1,L,A,B))); } } return 0;}

 

转载于:https://www.cnblogs.com/woshiyuao/p/8472883.html

你可能感兴趣的文章
2017-2018-1 20155203 20155204 实验二 固件程序设计
查看>>
数据可视化视频制作
查看>>
mysql 数据备份。pymysql模块
查看>>
FactoryMethod模式——设计模式学习
查看>>
Android中 AsyncTask
查看>>
原码、反码、补码和移码
查看>>
SQL存储过程与函数的区别
查看>>
vue项目配置使用flow类型检查
查看>>
@Resource和@Autowired区别
查看>>
VS2010打开就自动关闭问题解决
查看>>
python webdriver 测试框架-数据驱动txt文件驱动,带报告的例子
查看>>
动态代理相对于静态代理的优势
查看>>
持续部署之jenkins与gitlab(三)
查看>>
第二章 Jenkins安装与配置
查看>>
POJ 3169 Layout 差分约束系统
查看>>
用动画切换按钮的状态
查看>>
JNI简易教程,windows and linux
查看>>
SVN下如何切换默认用户
查看>>
一个小时搭建一个全栈 Web 应用框架(下)——美化与功能
查看>>
第七周进度条博客
查看>>