1001 Game On the Tree

1002 Tree Maker

1003 Hotaru's problem

Manacher处理好p数组。

暴力举一下公共串即可。

 # include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
const int maxn=;
int s[maxn*],p[maxn*]; int main(void)
{
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
int N; scanf("%d",&N);
int len=*N+;
s[]=-; s[len+]=-;
s[len]=;
for(int i=;i<=*N+;i+=)
{
s[i-]=;
scanf("%d",s+i);
}
int mx=,id;
for(int i=;i<=len;i++)
{
if(mx>i) p[i]=min(p[*id-i],mx-i);
else p[i]=;
while(s[i+p[i]]==s[i-p[i]]) p[i]++;
if(p[i]+i>mx) { mx=p[i]+i; id=i; }
}
int m=;
for(int i=;i<=len;i+=)
for(int j=p[i];j>m&&j>;j-=)
if(p[i+j-]>=j) m=max(m,j);
int ans=m/*;
printf("Case #%d: %d\n",kase,ans);
}
return ;
}

Aguin

1004 Segment Game

因为区间长度是递增的。

所以新的线段不可能被已有的线段所覆盖。

所以算比新线段右端点小的右端点数减去比新线段左端点小的左端点数就是答案。

范围是1e9。先离散化。

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
using namespace std;
# define maxn
int n,a[maxn],b[maxn],l[maxn],r[maxn];
int c1[*maxn],c2[*maxn],tem[*maxn]; int lowbit(int s)
{
return s&(-s);
} void update(int i,int x,int op)
{
int *c;
if(op==) c=c1;
else if (op==) c=c2;
while(i<=*maxn){c[i]+=x;i+=lowbit(i);}
return;
} int query(int i,int op)
{
int *c;
if(op==) c=c1;
else if (op==) c=c2;
int ret=;
while(i>){ret+=c[i];i-=lowbit(i);}
return ret;
} int main(void)
{
int kase=;
while(~scanf("%d",&n))
{
memset(c1,,sizeof(c1));
memset(c2,,sizeof(c2));
int cnt=,num=;
for(int i=;i<=n;i++)
{
scanf("%d%d",a+i,b+i);
if(a[i]==)
{
num++;
tem[++cnt]=b[i];
tem[++cnt]=b[i]+num;
}
}
sort(tem+,tem+cnt+);
int tot=unique(tem+,tem+cnt+)-tem-;
num=;
printf("Case #%d:\n",++kase);
for(int i=;i<=n;i++)
{
if(a[i]==)
{
num++;
l[num]=lower_bound(tem+,tem+tot,b[i])-tem;
r[num]=lower_bound(tem+,tem+tot,b[i]+num)-tem;
printf("%d\n",query(r[num],)-query(l[num]-,));
update(l[num],,);
update(r[num],,);
}
else if(a[i]==)
{
update(l[b[i]],-,);
update(r[b[i]],-,);
}
}
}
return ;
}

Aguin

1005 The shortest problem

发现现在自己也会找签到题了- -。

敲到一半的时候发现有两个队A了。果然是最水的题。

不过调了一会QAQ。

 # include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
typedef long long LL; int main(void)
{
for(int kase=;;kase++)
{
int n,t; scanf("%d%d",&n,&t);
if(n==-) break;
bool is_odd;
LL odd=,even=,sum=n;
for(int i=;i<=t;i++)
{
LL tem=sum,todd=,teven=;
is_odd=;
while(sum)
{
LL mod=sum%(LL);
if(is_odd) todd+=mod;
else teven+=mod;
sum/=(LL);
is_odd=!is_odd;
}
if(!is_odd) swap(odd,even);
odd+=todd; even+=teven;
sum=even+odd;
}
printf("Case #%d: ",kase);
if((max(odd,even)-min(odd,even))%(LL)) puts("No");
else puts("Yes");
}
return ;
}

Aguin

1006 Tetris

纯模拟。本来看别人写了三四五六百行都不敢写了。

后来下了标程看了下只有100+。于是按着题解思路自己写了。

还得先回Clarification把题意读懂再写- -。

 # include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
int cnt,x,y,squ,dir;
int square[][][][],map[][],type[],rot[]={,,};
char s[]; bool in(int xx,int yy){return xx>&&xx<&&yy>;}
bool check(int s,int d,int xx,int yy)
{
for(int i=;i<;i++)
for(int j=;j<;j++)
if(square[s][d][i][j])
if(!in(xx+i,yy+j)||map[xx+i][yy+j])
return false;
return true;
} bool dec(void)
{
if(!check(squ,dir,x,y-)) return false;
y--; return true;
} void mov(void)
{
cnt++;
if(s[cnt]=='w'&&check(squ,(dir+)%rot[squ],x,y)) dir=(dir+)%rot[squ];
else if(s[cnt]=='a'&&check(squ,dir,x-,y)) x--;
else if(s[cnt]=='d'&&check(squ,dir,x+,y)) x++;
else if(s[cnt]=='s') dec();
return;
} int eli(void)
{
for(int i=;i<;i++)
for(int j=;j<;j++)
if(square[squ][dir][i][j])
map[x+i][y+j]=;
int ret=,mark[]={};
for(int j=;j<;j++)
{
int yes=;
for(int i=;i<=;i++)
if(!map[i][y+j]){yes=;break;}
if(yes)
{
for(int i=;i<=;i++) map[i][y+j]=;
ret++; mark[j]=;
}
}
for(int j=;j<;j++)
{
while(mark[j])
{
for(int i=y+j;i<;i++)
for(int k=;k<=;k++)
map[k][i]=map[k][i+];
for(int i=j;i<;i++)
mark[i]=mark[i+];
mark[]=;
}
}
return ret;
} int main(void)
{
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
square[][][][]=square[][][][]=square[][][][]=square[][][][]=;
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
int n; scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=n;i++) scanf("%d",type+i);
memset(map,,sizeof(map));
int ans=; cnt=;
for(int i=;i<=n;i++)
{
x=,y=,squ=type[i],dir=;
while()
{
mov();
if(!dec()) break;
}
ans+=eli();
}
printf("Case %d: %d\n",kase,ans);
}
return ;
}

Aguin

1007 Gray code

第一位没处理好。调了蛮久。

按照百度百科里说的。把第零位当成0就好。

我是找连续的?串。如果个数为奇且?串两端的相同或者个数为偶两端不同。

就必然可以调整问号使得格雷码全为1。(怎么取不重要。全加上就是。)

如果不是上面两种情况。那么必然可以调整成一个0。其余全是1。

那么找到问号串对应的a[n]中最小的剔除。其余全部加上即可。

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
using namespace std;
# define maxn
int a[maxn];
char s[maxn]; int main(void)
{
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
scanf("%s",s+);
int len=strlen(s+);
for(int i=;i<=len;i++) scanf("%d",a+i);
int ans=; s[]='';
for(int i=;i<=len;i++)
{
if(s[i]=='?')
{
int j,tem=,Min=;
for(j=i;j<=len&&s[j]=='?';j++)
{
tem+=a[j];
Min=min(Min,a[j]);
}
if(j>len) {ans+=tem; break;}
else if(((j-i)%==&&s[i-]==s[j])||((j-i)%==&&s[i-]!=s[j])) ans+=tem+a[j];
else
{
Min=min(Min,a[j]);
ans+=tem+a[j]-Min;
}
i=j;
}
else if(s[i]!=s[i-]) ans+=a[i];
}
printf("Case #%d: %d\n",kase,ans);
}
return ;
}

Aguin

1008 Convex Polygon

1009 Root

1010 Leader in Tree Land

1011 Mahjong tree

因为前面正好做过点树dp。所以看到这个觉得四点前能过。

结果五点都没过。一直越界。后来出门坐三轮车上才想起来全局变量起重名了。邻表没初始化。

(最后知道真相的我眼泪掉下来。

说下写法。

因为怕写错。写了两个dfs。

先dp一下每个子树节点。如果有一个根有超过两个不是叶子的子节点。就是不合法的。

在合法的情况下再dp答案。

每个节点的答案就是子节点答案乘积再乘上叶子节点数的阶乘。

另外若这个节点有非叶子的子树。答案乘2。

相当于一个的时候可以把它放在左边或者右边。两个的时候可以互换。

最后1这个根节点。可以选1或者n两个。所以最后答案再乘2。

然后回家改完还是wa。发现一个坑点。

n为1的时候最后答案不用乘2。QAQ。

 # pragma comment(linker, "/STACK:102400000,102400000")
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
const LL mod=1e9+;
# define maxn
int cnt,headlist[maxn],node[maxn],ok;
LL fac[maxn],ans[maxn]; struct node
{
int to,pre;
} edge[*maxn]; void add(int from,int to)
{
cnt++;
edge[cnt].pre=headlist[from];
edge[cnt].to=to;
headlist[from]=cnt;
} void dfs1(int pos,int fa)
{
node[pos]=;
int num=;
for(int i=headlist[pos];i;i=edge[i].pre)
{
int to=edge[i].to;
if(to==fa) continue;
dfs1(to,pos);
if(node[to]>) num++;
if(num>) ok=;
node[pos]+=node[to];
}
return;
} void dfs2(int pos,int fa)
{
int num=,tot=;
ans[pos]=;
for(int i=headlist[pos];i;i=edge[i].pre)
{
int to=edge[i].to;
if(to==fa) continue;
dfs2(to,pos);
tot++;
if(node[to]==) num++;
ans[pos]=(ans[pos]*ans[to])%mod;
}
if(tot-num) ans[pos]=(ans[pos]*(LL))%mod;
ans[pos]=(ans[pos]*fac[num])%mod;
return;
} int main(void)
{
fac[]=(LL);
for(int i=;i<maxn;i++) fac[i]=(fac[i-]*(LL)i)%mod;
int T; cin>>T;
for(int kase=;kase<=T;kase++)
{
cnt=;
memset(headlist,,sizeof(headlist));
int n; scanf("%d",&n);
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
ok=; dfs1(,);
if(!ok) {printf("Case #%d: 0\n",kase); continue;}
dfs2(,);
if(n>) ans[]=(ans[]*(LL))%mod;
printf("Case #%d: %I64d\n",kase,ans[]);
}
return ;
}

Aguin

最新文章

  1. mongodb集群安装及到现在遇到的一些问题
  2. 5分钟用Spring4 搭建一个REST WebService
  3. Java实现批量下载《神秘的程序员》漫画
  4. bzoj4642: 泡泡
  5. use mkisofs 重新打包beini,tinycore linux
  6. 切换samba用户
  7. O - Steady Cow Assignment - POJ 3189(多重匹配+枚举)
  8. 简析MFC中CString用作C字符串
  9. cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角
  10. 计算机学院大学生程序设计竞赛(2015’12) 1002 Polygon
  11. Linux(常用命令) 中常用的压缩丶解压缩格式命令和参数详解
  12. linux下yum命令出现Loaded plugins: fastestmirror
  13. 私有云的难处—为什么需要CloudEngine?
  14. 【COCI 2015/2016 #3】Nekameleoni
  15. scrapy暂停和重启,及url去重原理,telenet简单使用
  16. Docker Kubernetes 容器更新与回滚
  17. getResourceAsStream的3种路径配置
  18. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
  19. 编译openwrt时报错:FMCGenericError.h:34:27: fatal error: libxml/parser.h: No such file or directory
  20. 使用javacv录像,同时进行讯飞声纹认证

热门文章

  1. Windows端口转发
  2. line-height属性详解
  3. 浙大 pat 1003 题解
  4. es6语法
  5. something funny
  6. 中小型公司数据仓库搭建——以mysql为例
  7. 给Linux添加google搜索命令
  8. sql 将某列转换成一个字符串 for xml path用法
  9. PHP使用正则表达式验证电话号码(手机和固定电话)
  10. hdu1022