2015 Multi-University Training Contest 7
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
2015 Multi-University Training Contest 7的更多相关文章
- 2015 Multi-University Training Contest 8 hdu 5390 tree
tree Time Limit: 8000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 5390 ...
- 2015 UESTC Winter Training #8【The 2011 Rocky Mountain Regional Contest】
2015 UESTC Winter Training #8 The 2011 Rocky Mountain Regional Contest Regionals 2011 >> North ...
- 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】
2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...
- Root(hdu5777+扩展欧几里得+原根)2015 Multi-University Training Contest 7
Root Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Su ...
- 2015 Multi-University Training Contest 6 solutions BY ZJU(部分解题报告)
官方解题报告:http://bestcoder.hdu.edu.cn/blog/2015-multi-university-training-contest-6-solutions-by-zju/ 表 ...
- HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
OO's Sequence Time Limit: 4000/2000 MS (Jav ...
- HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
- 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题
I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 ...
随机推荐
- Symfony没有安装依赖_PHP Fatal error: require(): Failed opening required
$ php bin/console server:run PHP Warning: require(D:\home\workspace\pd\app/../vendor/autoload.php): ...
- UNIX基础--安装应用程序: Packages 和 Ports
Packages and Ports 概述 FreeBSD 将许多系统工具捆绑作为基本系统的一部分.另外,FreeBSD 提供了两种补充的技术来安装第三方软件:FreeBSD Ports Collec ...
- jquery中的serialize
jquery中的serialize对serializeArray进行了封装,serializeArray源码中定义将disabled的过滤掉,所以提交后值为null 解决方式是:在提交的时候,讲dis ...
- js 冒泡排序
var arr = []; for(var i=0; i<100000; i++){ arr.push(parseInt(Math.random()*100)) }; var t1 = Date ...
- Windows Search Service
Windows Search Service是一个全方位的托管云服务,可以允许开发者通过.Net SDK或者REST API多种多样的搜索服务. 如果你想开发一个搜索服务,那么你的服务应该包含以下组件 ...
- 移动端默认返回按键,使用h5+修改默认事件
hbuilder的h5+提供开发webapp的诸多便利,很多手机自带back虚拟按键,如果不修改其默认事件,点一下app就退出了,所以我这里提供一种修改这个按键默认事件事件的代码. 首先你要用hbui ...
- perl-Thread-Queue for openwrt
在centos7下运行 openwrt trunk的时候提示需要perl-thread-queue. yum install perl-thread-queue,提示没有这个文件.百度和google, ...
- 《精通CSS》——个人总结
[属性选择器] 属性选择器可以根据某个属性是否存在或属性的值来寻找元素. 只有在规定了 !DOCTYPE 时,IE7 和 IE8 才支持属性选择器.在 IE6 及更低的版本中,不支持属性选择. 事例: ...
- Eclipse开发中GlassFish 4 重启页面不刷新
现在项目开发用GlassFish4做服务器,测试了几个web项目出现问题,每次编辑源代码后页面不能按照最新编辑好的代码显示. 一次重新运行web项目在服务器上看到publish,点击后运行的是新编辑的 ...
- Linux常用操作
1. Latex参考文献格式 http://blog.163.com/sunkun_hust/blog/static/204454119201482524222283/