BestCoder Round #73
这场比赛打完后可以找何神玩了orz(orz)*
嘿嘿嘿。输出n/2+m/2即可。
我能说我智商捉鸡想了4min吗?
由于N个点的连通块最少有N-1条边,所以至多删两条。
暴力枚举然后并查集判判即可。
奥妙重重的数位dp。
设f[i][j][d1][d2][d3]表示前i位,x1与x2的数位差为j。大小关系如下:
d1=0 x1<x2
d1=1 x1=x2
d1=2 x1>x2
d2=0 x1<=n
d2=1 x1>n
d3=0 x2<=n
d3=1 x2>n
然后滚动数组DP一下。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
const int mod=;
const int maxn=;
struct bign {
int s[maxn],len;
bign operator = (const char* a) {
memset(s,,sizeof(s));len=strlen(a);
rep(i,,len-) s[i]=a[len-i-]-'';
}
void operator /= (int b) {
int x=;
dwn(i,len-,) {
int v=s[i]+x;
s[i]=v/;
x=(v%)*;
}
while(!s[len-]&&len>) len--;
}
void print() {
dwn(i,len-,) printf("%d",s[i]);
puts("");
}
}N;
char s[maxn];
int bit[maxn];
ll f[][maxn*][][][];
void solve() {
scanf("%s",s);N=s;int n=;
while(N.s[]||N.len!=) bit[++n]=N.s[]&,N/=;
memset(f,,sizeof(f));
int cur=;f[][n][][][]=;
rep(i,,n-) {
cur^=;memset(f[cur],,sizeof(f[cur]));
rep(j,-i+n,i+n) rep(d1,,) rep(d2,,) rep(d3,,) {
ll& ans=f[cur^][j][d1][d2][d3];
(f[cur][j][d1][bit[i+]?:d2][bit[i+]?:d3]+=ans)%=mod;
(f[cur][j][d1][(!bit[i+])?:d2][(!bit[i+])?:d3]+=ans)%=mod;
(f[cur][j+][][(!bit[i+])?:d2][bit[i+]?:d3]+=ans)%=mod;
(f[cur][j-][][bit[i+]?:d2][(!bit[i+])?:d3]+=ans)%=mod;
}
}
ll ans=;
rep(i,n+,*n) (ans+=f[cur][i][][][])%=mod;
printf("%lld\n",ans);
}
int main() {
int T=read();
while(T--) solve();
return ;
}
我选择go die。
考虑用线段树来做。
对于操作1,暴力变换带标记且不全为1的区间。
对于操作2,在线段树上打标记。
对于操作3,线段树上直接查询。
等等,我们写程序要讲道理对不对。
我们发现对于一个[1,10^7]的数x,最多执行logx次操作1x就变成了1。
我们可以进行势能分析,初始势能为nlogx。
对于操作1,每变换一次势能-1。
对于操作2,至多增加log^2n的势能。
对于操作3,时间复杂度恒定O(logn)
所以总时间复杂度O(nlog^2n)
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=<<;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=,f=;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-;
for(;isdigit(c);c=Getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
const int N=;
const int maxn=;
int vis[N],phi[N],pri[N/],cnt;
void gen(int n) {
phi[]=;
rep(i,,n) {
if(!vis[i]) pri[++cnt]=i,phi[i]=i-;
rep(j,,cnt) {
if(i*pri[j]>n) break;
vis[i*pri[j]]=;
if(i%pri[j]==) {phi[i*pri[j]]=phi[i]*pri[j];break;}
phi[i*pri[j]]=phi[i]*(pri[j]-);
}
}
}
ll sumv[maxn*],is[maxn*],setv[maxn*];
void pushdown(int o,int l,int r) {
if(setv[o]) {
int lc=o<<,rc=lc|,mid=l+r>>;
setv[lc]=setv[rc]=setv[o];
is[lc]=is[rc]=;
sumv[lc]=setv[o]*(mid-l+);
sumv[rc]=setv[o]*(r-mid);
setv[o]=;
}
}
void maintain(int o,int l,int r) {
int lc=o<<,rc=lc|;
if(setv[o]) sumv[o]=(r-l+)*setv[o],is[o]=(setv[o]!=);
else sumv[o]=sumv[lc]+sumv[rc],is[o]=is[lc]|is[rc];
}
void update(int o,int l,int r,int ql,int qr,int v) {
if(ql<=l&&r<=qr) setv[o]=v;
else {
pushdown(o,l,r);
int lc=o<<,rc=lc|,mid=l+r>>;
if(ql<=mid) update(lc,l,mid,ql,qr,v);
if(qr>mid) update(rc,mid+,r,ql,qr,v);
}
maintain(o,l,r);
}
void update2(int o,int l,int r,int ql,int qr) {
if(ql<=l&&r<=qr&&setv[o]) setv[o]=phi[setv[o]];
else {
pushdown(o,l,r);
int lc=o<<,rc=lc|,mid=l+r>>;
if(ql<=mid&&is[lc]) update2(lc,l,mid,ql,qr);
if(qr>mid&&is[rc]) update2(rc,mid+,r,ql,qr);
}
maintain(o,l,r);
}
void build(int o,int l,int r) {
sumv[o]=is[o]=setv[o]=;
if(l==r) setv[o]=read();
else {
int lc=o<<,rc=lc|,mid=l+r>>;
build(lc,l,mid);build(rc,mid+,r);
}
maintain(o,l,r);
}
ll query(int o,int l,int r,int ql,int qr) {
if(ql<=l&&r<=qr) return sumv[o];
pushdown(o,l,r);
int lc=o<<,rc=lc|,mid=l+r>>;ll ans=;
if(ql<=mid) ans+=query(lc,l,mid,ql,qr);
if(qr>mid) ans+=query(rc,mid+,r,ql,qr);
return ans;
}
void solve() {
int n=read(),m=read();
build(,,n);
while(m--) {
int t=read(),l=read(),r=read();
if(t==) update2(,,n,l,r);
else if(t==) update(,,n,l,r,read());
else printf("%lld\n",query(,,n,l,r));
}
}
int main() {
gen();
dwn(T,read(),) solve();
return ;
}
BestCoder Round #73的更多相关文章
- hdu5634 BestCoder Round #73 (div.1)
Rikka with Phi Accepts: 5 Submissions: 66 Time Limit: 16000/8000 MS (Java/Others) Memory Limit: ...
- hdu5631 BestCoder Round #73 (div.2)
Rikka with Graph Accepts: 123 Submissions: 525 Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- hdu5630 BestCoder Round #73 (div.2)
Rikka with Chess Accepts: 393 Submissions: 548 Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- BestCoder Round #73 (div.2)
1001 Rikka with Chess ans = n / 2 + m / 2 1002 Rikka with Graph 题意:n + 1条边,问减去至少一条使剩下的图连通的方案数. 分析:原来 ...
- BestCoder Round #73 (div.2)(hdu 5630)
Rikka with Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- BestCoder Round #73 (div.2)1002/hdoj5631
题意: 给出一张 nnn 个点 n+1n+1n+1 条边的无向图,你可以选择一些边(至少一条)删除. 分析: 一张n个点图,至少n-1条边才能保证联通 所以可以知道每次可以删去1条边或者两条边 一开始 ...
- bestcoder Round #7 前三题题解
BestCoder Round #7 Start Time : 2014-08-31 19:00:00 End Time : 2014-08-31 21:00:00Contest Type : ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元
BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy Init函数 然后统计就ok B. 博弈 题 不懂 推了半天的SG..... 结果这 ...
随机推荐
- javascript quine
javascript有一些奇怪的性质,恩,比如说,非常容易写一个quine,即自己输出自己代码的东西. function a(){console.log(a.toString()+";a() ...
- Java常用排序算法+程序员必须掌握的8大排序算法
概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...
- less,sass,stylus配置和应用教程及三者比较
less,sass,stylus配置和应用教程及三者比较 Less 1. 定义: Less是CSS预处理语言,在css基础之上增加了诸如变量,混合(mix),继承,运算,函数等功能,LESS既可以运 ...
- Linux/Ubuntu下解压命令
.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压 ...
- @RequestBody, @ResponseBody 注解详解
简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...
- matlab练习程序(最小包围矩形)
又是计算几何,我感觉最近对计算几何上瘾了. 当然,工作上也会用一些,不过工作上一般直接调用boost的geometry库. 上次写过最小包围圆,这次是最小包围矩形,要比最小包围圆复杂些. 最小包围矩形 ...
- hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配
Machine Schedule Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- loj 1025(记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25902 #include<iostream> #inc ...
- JAVA中分为基本数据类型及引用数据类型
一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...
- org.apache.log4j与org.apache.commons.logging这两个包有什么区别
apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现log4j是具体的日志 ...